<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">This is one of those proposals that I immediately agree with and want to start using! Definite +1.<div class=""><br class=""></div><div class="">It might make sense in another proposal, but one thing that jumps out to me is seeing &amp;context still used to pass a reference to the context around. I wonder if thereā€™d be a good way to import these opaque reference types like CGContextRef and dispense with the &amp; altogether?</div><div class=""><br class=""></div><div class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;  "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " class=""><div class="">Jeff Kelley</div><div class=""><br class=""></div><div class=""><a href="mailto:SlaunchaMan@gmail.com" class="">SlaunchaMan@gmail.com</a>&nbsp;|&nbsp;<a href="https://twitter.com/SlaunchaMan" class="">@SlaunchaMan</a>&nbsp;|&nbsp;<a href="http://jeffkelley.org" class="">jeffkelley.org</a></div></div></span></div></div></div>
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Mar 2, 2016, at 2:43 PM, Michael Ilseman via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">You can find the living document at:&nbsp;<a href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md" class="">https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md</a><div class=""><br class=""></div><div class="">For your convenience, here is the current state:</div><div class=""><br class=""></div><div class=""><h1 class="" style="box-sizing: border-box; font-size: 2.25em; margin-right: 0px; margin-bottom: 16px; margin-left: 0px; line-height: 1.2; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255); margin-top: 0px !important;">Import as member</h1><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">Proposal:&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-name.md" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none;">SE-NNNN</a></li><li class="" style="box-sizing: border-box;">Author(s):&nbsp;<a href="https://github.com/milseman" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none;">Michael Ilseman</a></li><li class="" style="box-sizing: border-box;">Status:&nbsp;<strong class="" style="box-sizing: border-box;">Awaiting review</strong></li><li class="" style="box-sizing: border-box;">Review manager: TBD</li></ul><h2 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-introduction" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#introduction" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Introduction</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Swift imports C declarations, allowing Swift code to natively interact with C libraries and frameworks. But, such imported APIs do not feel natural to interact with in Swift. This proposal seeks to provide a mechanism for C API authors to specify the capability of importing functions and variables as members on imported Swift types. It also seeks to provide an automatic inference option for APIs that follow a consistent, disciplined naming convention.</p><h2 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-motivation" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#motivation" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Motivation</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">C APIs and frameworks currently import into Swift as global functions and global variables. Interacting with these can feel awkward in Swift.&nbsp;</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Here's an example of programmatic drawing using the Core Graphics C API:</p><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">override</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">drawRect</span>(rect: CGRect) {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> context: CGContext <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> UIGraphicsGetCurrentContext()<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">!</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> toCenter <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGPoint(x: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>width<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">2</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>, y: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>height<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">2</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> angle <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGFloat(M_PI <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">16</span>)

    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGAffineTransformIdentity
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">for</span> _ <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">..&lt;</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">32</span> {
        triangulateRect(bounds, inputTransform: transform, context: context)
        transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGAffineTransformTranslate(transform, toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
        transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGAffineTransformRotate(transform, angle)
        transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGAffineTransformTranslate(transform, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-</span>toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-</span>toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    }
    CGContextSetLineWidth(context, bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>size<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>width <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span>)
    CGContextSetGrayStrokeColor(context, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">1</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>)
    CGContextDrawPath(context, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Stroke)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">triangulateRect</span>(bounds: CGRect, inputTransform: CGAffineTransform, 
        context: CGContext) {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> inputTransform

    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// Triangle from top left corner, to bottom middle, to top right, and then </span>
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// draw the boundary</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> topLeft <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>origin
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> bottomRight <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGPoint(x: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>size<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>width, y: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>size<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>height)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> path <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGPathCreateMutable()
    CGPathMoveToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGPathAddLineToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, CGRectGetMidX(bounds), bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGPathAddLineToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGPathAddLineToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGPathAddLineToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGPathAddLineToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGPathAddLineToPoint(path, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    CGContextAddPath(context, path)
}</pre></div><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">A much more natural expression of this in Swift, would be something more like:</p><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">override</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">drawRect</span>(rect: CGRect) {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> context: CGContext <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> UIGraphicsGetCurrentContext()<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">!</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> toCenter <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGPoint(x: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>width<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">2</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>, y: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>height<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">2</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> angle <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGFloat(M_PI <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">16</span>)

    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGAffineTransform<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">identity</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">for</span> _ <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">..&lt;</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">32</span> {
        triangulateRect(bounds, inputTransform: transform, context: context)
        transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> transform<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>translate(toX: toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, toY: toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
                             <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>rotate(angle: angle)
                             <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>translate(toX: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-</span>toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, toY: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-</span>toCenter<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    }

    context<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>lineWidth <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>size<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>width <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span>
    context<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>strokeColor <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGColor(gray: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>, alpha: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">1</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>)
    context<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>drawPath(mode: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Stroke)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">triangulateRect</span>(bounds: CGRect, inputTransform: CGAffineTransform, 
        context: CGContext) {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> transform <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> inputTransform

    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// Triangle from top left corner, to bottom middle, to top right, and then </span>
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// draw the boundary</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> topLeft <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>origin
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> bottomRight <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGPoint(x: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>size<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>width, y: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>size<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>height)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> path <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> CGMutablePath()
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">move</span>(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, y: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addLine(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: bounds<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>midX, y: bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addLine(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, y: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addLine(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, y: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addLine(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, y: bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addLine(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, y: bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    path<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addLine(transform: <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&amp;</span>transform, x: bottomRight<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>x, y: topLeft<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>y)
    context<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>addPath(path)
}</pre></div><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Currently, the only way for a C framework to provide a natural Swift experience is to author large overlays or Swift wrappers.</p><h2 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-proposed-solution" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#proposed-solution" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Proposed solution</h2><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-manual-specification" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#manual-specification" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Manual specification</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">C framework authors should have a way to manually specify how their APIs appear in Swift beyond the limited functionality currently provided with NS_SWIFT_NAME. This includes the ability to specify a type on which a given variable or function should be imported. This also includes the ability to specify when a function should be imported as a computed getter or setter of a property on that type.</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">The goal is for developers using a C framework, which has these manual annotations applied, to develop in Swift as naturally as if they were working with a native object-oriented interface.</p><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-automatic-inference" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#automatic-inference" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Automatic inference</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Coupled with this manual specification ability is an automatic inference system. The inference system analyzes C global names and types, attempting to find an imported Swift type to extend with a method, initializer, or property from this global.</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">This inference system's goal for the is to be able to automatically handle the majority of global variables and functions in CF-style frameworks, and in the future be extensible to benefit other well structured, disciplined APIs.</p><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-maps-directly-onto-c-calling-convention" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#maps-directly-onto-c-calling-convention" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Maps directly onto C calling convention</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Wrappers and overlays have the downside that they result in an extra function call hop in order to reach the underlying C API (though fragility controls may somewhat alleviate this in the future).</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">This proposal calls for imported APIs to map directly onto the original C APIs, without calling through intermediary wrappers or overlaid definitions. For instance members, this means supplying a reference to self in the appropriate parameter slot.</p><h2 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-detailed-design" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#detailed-design" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Detailed design</h2><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-swift_name-attribute" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#swift_name-attribute" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>swift_name attribute</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">The primary mechanism of manually communicating to the Swift compiler how an API should be imported is the swift_name attribute (e.g. through the CF_SWIFT_NAME macro). swift_name will be expanded to allow the user to provide a type on which the imported function will be a member of, and allow for specifying a function as a computed getter or setter for a type.</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Examples:</p><div class="highlight-source-c highlight" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">struct</span> Point3D <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">createPoint3D</span>(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">float</span> x, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">float</span> y, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">float</span> z) 
__attribute__((swift_name(<span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>Point3D.init(x:y:z:)<span class="pl-pds" style="box-sizing: border-box;">"</span></span>)));

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">struct</span> Point3D <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">rotatePoint3D</span>(Point3D point, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">float</span> radians) 
__attribute__((swift_name(<span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>Point3D.rotate(self:radius:)<span class="pl-pds" style="box-sizing: border-box;">"</span></span>)));

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">float</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">Point3DGetMagnitude</span>(Point3D point) 
__attribute__((swift_name(<span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>getter:Point3D.magnitude(self:)<span class="pl-pds" style="box-sizing: border-box;">"</span></span>)));</pre></div><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">The string present in swift_name will additionally support the following:</p><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">A type name proceeded by '.' to denote the context to import onto</li><li class="" style="box-sizing: border-box;">'self' to denote which parameter to treat as self for an instance 'method/property, otherwise this will be a static method/property</li><li class="" style="box-sizing: border-box;">'getter:' and 'setter:' to denote the function as a property getter/setter</li></ul><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-automatic-inference-heuristics" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#automatic-inference-heuristics" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Automatic inference heuristics</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">The following are some techniques and heuristics that can be useful for consistently named C APIs, e.g. CF-style frameworks. These heuristics are based off of the variable/function's name and type.</p><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">Identify init by return type</li></ul><div class="highlight highlight-source-diff" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGColorCreate(space: CGColorSpace?, _ components: UnsafePointer&lt;CGFloat&gt;)</span>
<span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">-   -&gt; CGColor?</span>

// extension CGColor { ...
<span class="pl-mi1" style="box-sizing: border-box; background-color: rgb(234, 255, 234); color: rgb(85, 165, 50);">+   init?(space: CGColorSpace?, components: UnsafePointer&lt;CGFloat&gt;)</span></pre></div><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">Identify computed properties by finding "get" / "set" pairs&nbsp;</li></ul><div class="highlight highlight-source-diff" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGContextGetInterpolationQuality(c: CGContext?) -&gt; CGInterpolationQuality</span>
<span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGContextSetInterpolationQuality(c: CGContext?,</span>
<span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">-   _ quality: CGInterpolationQuality)</span>

// extension CGContext { ...
<span class="pl-mi1" style="box-sizing: border-box; background-color: rgb(234, 255, 234); color: rgb(85, 165, 50);">+   final var interpolationQuality: CGInterpolationQuality</span></pre></div><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">Identify boolean predicates and other computed property patterns</li></ul><div class="highlight highlight-source-diff" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGDisplayModeIsUsableForDesktopGUI(mode: CGDisplayMode?) -&gt; Bool</span>

// extension CGDisplayMode {
<span class="pl-mi1" style="box-sizing: border-box; background-color: rgb(234, 255, 234); color: rgb(85, 165, 50);">+   final var isUsableForDesktopGUI: Bool { get }</span></pre></div><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">Identify methods by finding a self parameter</li></ul><div class="highlight highlight-source-diff" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGAffineTransformInvert(t: CGAffineTransform) -&gt; CGAffineTransform</span>

// extension CGAffineTransformation { ...
<span class="pl-mi1" style="box-sizing: border-box; background-color: rgb(234, 255, 234); color: rgb(85, 165, 50);">+   func invert() -&gt; CGAffineTransform</span></pre></div><ul class="" style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><li class="" style="box-sizing: border-box;">Various special cases, fuzzy name matching, etc.</li></ul><div class="highlight highlight-source-diff" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre class="" style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal;"><span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGDisplayStreamUpdateGetTypeID() -&gt; CFTypeID</span>

// extension CGDisplayStreamUpdate { ...
<span class="pl-mi1" style="box-sizing: border-box; background-color: rgb(234, 255, 234); color: rgb(85, 165, 50);">+   final class var typeID: CFTypeID { get }</span>

...

<span class="pl-md" style="box-sizing: border-box; background-color: rgb(255, 236, 236); color: rgb(189, 44, 0);">- func CGBitmapContextGetData(context: CGContext?) -&gt; UnsafeMutablePointer&lt;Void&gt;</span>

// extension CGContext { ...
<span class="pl-mi1" style="box-sizing: border-box; background-color: rgb(234, 255, 234); color: rgb(85, 165, 50);">+   final var bitmapData: UnsafeMutablePointer&lt;Void&gt; { get }</span></pre></div><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-underlying-infrastructure" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#underlying-infrastructure" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Underlying infrastructure</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">The Clang Importer will be extended to support importing function and variable declarations onto different effective contexts than they appear in Clang. Additionally, the Clang Importer will want to create a single extension point per submodule/type pair on which to add these members.</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">SILGen will need to be extended to map calls to these members directly to the original C API calls, passing self in the appropriate parameter location for instance members.</p><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-migration" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#migration" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Migration</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Projects using old style APIs will need to migrate to any new API. Since the proposed imports are done programmatically in the importer, migration attributes can be attached to the new decls, allowing the Swift migrator to automatically migrate user code.</p><h2 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-impact-on-existing-code" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#impact-on-existing-code" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Impact on existing code</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">Any Swift code using a C framework that uses this functionality will be massively affected, though in ways that the Swift migrator can alleviate.</p><h2 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-alternatives-considered" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#alternatives-considered" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Alternatives considered</h2><h3 class="" style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);"><a id="user-content-wrap-everything" class="anchor" href="https://github.com/milseman/swift-evolution/blob/master/0000-import-as-member.md#wrap-everything" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Wrap everything</h3><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);">One alternative, which is the only option available currently to framework authors, is to require C APIs to provide Swift wrapper APIs or overlays in order to call into the underlying C functionality.</p><div class="" style="box-sizing: border-box; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255); margin-bottom: 0px !important;">This has the disadvantage of having to maintain separate APIs in addition to the C headers themselves. This proposal allows for the C header to specify how the name should appear when imported into Swift. Additionally, if a C API follows consistent, CF-like naming, most of it can be imported automatically</div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></div></body></html>