<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><p style="box-sizing: border-box; margin-right: 0px; margin-bottom: 16px; margin-left: 0px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255); margin-top: 0px !important;" class="">When we introduced Swift, we wanted to provide value types for common containers, with the safety and state isolation benefits they provide, while still working well with the reference-oriented world of Cocoa. To that end, we invested a lot of work into bridging between Swift’s value semantics containers and their analogous Cocoa container classes. This bridging consisted of several pieces in the language, the compiler, and the runtime:</p><ul style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class=""><em style="box-sizing: border-box;" class="">Importer bridging</em>, importing Objective-C APIs that take and return NSString, NSArray, NSDictionary and NSSet so that they take and return Swift’s analogous value types instead.</p></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Originally, the language allowed&nbsp;<em style="box-sizing: border-box;" class="">implicit conversions</em>&nbsp;in both directions between Swift value types and their analogous classes. We’ve been working on phasing the implicit conversions out—we removed the object-to-value implicit conversion in Swift 1.2, and propose to remove the other direction in SE–0072—but the conversions can still be performed by an&nbsp;<em style="box-sizing: border-box;" class="">explicit coercion</em>&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">string as NSString</code>. These required-explicit&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as</code>&nbsp;coercions don’t otherwise exist in the language, since&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as</code>&nbsp;generally is used to force coercions that&nbsp;can also happen implicitly, and value-preserving conversions are more idiomatically performed by constructors in the standard library.</p></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">The runtime supports&nbsp;<em style="box-sizing: border-box;" class="">dynamic bridging casts</em>. If you have a value that’s dynamically of a Swift value type, and try to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as?</code>,&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as!</code>, or&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">is</code>-cast it to its bridged Cocoa class type, the cast will succeed, and the runtime will apply the bridging conversion:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 126px;" class=""><code class="(null) cs hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// An Any that dynamically contains a value "foo": String</span>
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> x: Any = <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"foo"</span>
<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// Cast succeeds and produces the bridged "foo": NSString</span>
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> y = x <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">as</span>! NSString </code></pre></li></ul><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Since Swift first came out, Cocoa has done a great job of “Swiftification”, aided by new Objective-C features like nullability and lightweight generics that have greatly improved the up-front quality of importer-bridged APIs. This has let us deemphasize and gradually remove the special case implicit conversions from the language. I think it’s time to consider extricating them from the dynamic type system as well, making it so that&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as?</code>,&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as!</code>, and&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">is</code>&nbsp;casts only concern themselves with typechecks, and transitioning to using standard initializers and methods for performing bridging conversions. I’d like to propose the following changes:</p><ul style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><li style="box-sizing: border-box;" class="">Dynamic casts&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as?</code>,&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as!</code>&nbsp;and&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">is</code>&nbsp;should no longer perform bridging conversions between value types and Cocoa classes.</li><li style="box-sizing: border-box;" class="">Coercion syntax&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as</code>&nbsp;should no longer be used to explicitly force certain bridging conversions.</li><li style="box-sizing: border-box;" class="">To replace this functionality, we should add initializers to bridged value types and classes that perform the value-preserving bridging operations.</li></ul><h1 id="therulesofas" style="box-sizing: border-box; font-size: 2.25em; margin: 1em 0px 16px; line-height: 1.2; position: relative; color: rgb(51, 51, 51); padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); font-family: helvetica, arial, freesans, clean, sans-serif; background-color: rgb(255, 255, 255);" class="">The Rules of&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 31px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as[?]</code></h1><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Our original goal implementing this behavior into the dynamic casting machinery was to preserve some transitivity identities between implicit conversions and casts that users could reason about, including:</p><ul style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><li style="box-sizing: border-box;" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as! T as! U</code>&nbsp;===&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as! U</code>, if&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as! T</code>&nbsp;succeeds. Casting to a type&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">U</code>&nbsp;should succeed and give the same result for any derived cast result.</li><li style="box-sizing: border-box;" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as! T as U</code>&nbsp;===&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as! U</code>. If&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">T</code>&nbsp;is coercible to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">U</code>, then you should get the same result by casting to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">T</code>and coercing to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">U</code>&nbsp;as by casting to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">U</code>&nbsp;directly.</li><li style="box-sizing: border-box;" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as T as! U</code>&nbsp;===&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as! U</code>. Likewise, coercing shouldn’t affect the result of any ensuing dynamic casts.</li><li style="box-sizing: border-box;" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as T as U</code>&nbsp;===&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">x as U</code>.</li></ul><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">The interaction of these identities with the bridging conversions, as well as with other type system features like implicit nonoptional-to-Optional conversion, occasionally requires surprising behavior, for instance the behavior of&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">nil</code>&nbsp;Optional values in <a href="https://github.com/apple/swift/pull/1949" class="">https://github.com/apple/swift/pull/1949</a>. These rules also inform the otherwise-inconsistent use of&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as</code>&nbsp;to perform explicit bridging conversions, when&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as</code>&nbsp;normally only forces implicit conversions. By simplifying the scope of dynamic casts, it becomes easier to preserve these rules without bugs and unfortunate edge cases.</p><h1 id="theabilitiesofastoday" style="box-sizing: border-box; font-size: 2.25em; margin: 1em 0px 16px; line-height: 1.2; position: relative; color: rgb(51, 51, 51); padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); font-family: helvetica, arial, freesans, clean, sans-serif; background-color: rgb(255, 255, 255);" class="">The Abilities of&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 31px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as?</code>&nbsp;Today</h1><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">In discussing how to change the behavior of dynamic casts, it’s worth enumerating all the things dynamic casts are currently able to do:</p><ol style="box-sizing: border-box; padding: 0px 0px 0px 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check that an object is an instance of a specific class.</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 206px;" class=""><code class="(null) scala hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Base</span> {</span>}; <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Derived</span>:</span> <span class="hljs-type" style="box-sizing: border-box;">Base</span> {}

func isKindOfDerived(<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">object</span>:</span> <span class="hljs-type" style="box-sizing: border-box;">Base</span>) -&gt; <span class="hljs-type" style="box-sizing: border-box;">Bool</span> {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">object</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">is</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Derived</span>
</span>}

isKindOfDerived(<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">object</span>:</span> <span class="hljs-type" style="box-sizing: border-box;">Derived</span>()) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// true</span>
isKindOfDerived(<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">object</span>:</span> <span class="hljs-type" style="box-sizing: border-box;">Base</span>()) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// false</span></code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check that an existential contains an instance of a type.</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 226px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">protocol</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">P</span> </span>{}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Int</span>: <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">P</span> </span>{}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Double</span>: <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">P</span> </span>{}

<span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">isKindOfInt</span><span class="hljs-params" style="box-sizing: border-box;">(value: P)</span></span> -&gt; <span class="hljs-type" style="box-sizing: border-box;">Bool</span> {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> value <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">is</span> <span class="hljs-type" style="box-sizing: border-box;">Int</span>
}
isKindOfInt(value: <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">0</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// true</span>
isKindOfInt(value: <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">0.0</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// false</span></code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check that a generic value is also an instance of a different type.</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 206px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">is</span><span class="hljs-generics" style="box-sizing: border-box;">&lt;T, U&gt;</span><span class="hljs-params" style="box-sizing: border-box;">(value: T, kindOf: U.<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">Type</span>)</span></span> -&gt; <span class="hljs-type" style="box-sizing: border-box;">Bool</span> {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> value <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">is</span> <span class="hljs-type" style="box-sizing: border-box;">U</span>
}

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">is</span>(value: <span class="hljs-type" style="box-sizing: border-box;">Derived</span>(), kindOf: <span class="hljs-type" style="box-sizing: border-box;">Derived</span>.<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">self</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// true</span>
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">is</span>(value: <span class="hljs-type" style="box-sizing: border-box;">Derived</span>(), kindOf: <span class="hljs-type" style="box-sizing: border-box;">Base</span>.<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">self</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// true</span>
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">is</span>(value: <span class="hljs-type" style="box-sizing: border-box;">Base</span>(), kindOf: <span class="hljs-type" style="box-sizing: border-box;">Derived</span>.<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">self</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// false</span>
<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">is</span>(value: <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">0</span>, kindOf: <span class="hljs-type" style="box-sizing: border-box;">Int</span>.<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">self</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// true</span></code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check whether the type of a value conforms to a protocol, and wrap it in an existential if so:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 286px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">protocol</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Fooable</span> </span>{ <span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">foo</span><span class="hljs-params" style="box-sizing: border-box;">()</span></span> }

<span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">fooIfYouCanFoo</span><span class="hljs-generics" style="box-sizing: border-box;">&lt;T&gt;</span><span class="hljs-params" style="box-sizing: border-box;">(value: T)</span></span> {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">if</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> fooable = value <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">as</span>? <span class="hljs-type" style="box-sizing: border-box;">Fooable</span> {
    <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> fooable.foo()
  }
}

<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Int</span>: <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Fooable</span> </span>{ <span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">foo</span><span class="hljs-params" style="box-sizing: border-box;">()</span></span> { <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">print</span>(<span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"foo!"</span>) } }

fooIfYouCanFoo(value: <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">1</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// Prints "foo!"</span>
fooIfYouCanFoo(value: <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"bar"</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// No-op</span></code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check whether a value is&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">_ObjectiveCBridgeable</code>&nbsp;to a class, or conversely, that an object is&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">_ObjectiveCBridgeable</code>&nbsp;to a value type, and perform the bridging conversion if so:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 306px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">getAsString</span><span class="hljs-generics" style="box-sizing: border-box;">&lt;T&gt;</span><span class="hljs-params" style="box-sizing: border-box;">(value: T)</span></span> -&gt; <span class="hljs-type" style="box-sizing: border-box;">String</span>? {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> value <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">as</span>? <span class="hljs-type" style="box-sizing: border-box;">String</span>
}
<span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">getAsNSString</span><span class="hljs-generics" style="box-sizing: border-box;">&lt;T&gt;</span><span class="hljs-params" style="box-sizing: border-box;">(value: T)</span></span> -&gt; <span class="hljs-type" style="box-sizing: border-box;">NSString</span> {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> value <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">as</span>? <span class="hljs-type" style="box-sizing: border-box;">NSString</span>
}

getAsString(value: <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"string"</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces "string": String</span>
getAsNSString(value: <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"string"</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces "string": NSString</span>

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">let</span> ns = <span class="hljs-type" style="box-sizing: border-box;">NSString</span>(<span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"nsstring"</span>)
getAsString(value: ns) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces "nsstring": String</span>
getAsNSString(value: ns) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces "nsstring": NSString</span></code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check whether a value conforms to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">ErrorProtocol</code>, and bridge it to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">NSError</code>&nbsp;if so:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 186px;" class=""><code class="(null) crystal hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">enum</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">CommandmentError</span> { <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">case</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Killed</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Stole</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">GravenImage</span>, <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">CovetedOx</span> }</span>

func getAsNSError&lt;<span class="hljs-constant" style="box-sizing: border-box;">T</span>&gt;(<span class="hljs-symbol" style="box-sizing: border-box; color: rgb(153, 0, 115);">value:</span> <span class="hljs-constant" style="box-sizing: border-box;">T</span>) -&gt; <span class="hljs-constant" style="box-sizing: border-box;">NSError</span>? {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> value as? <span class="hljs-constant" style="box-sizing: border-box;">NSError</span>
}

getAsNSError(<span class="hljs-constant" style="box-sizing: border-box;">CommandmentError</span>.<span class="hljs-constant" style="box-sizing: border-box;">GravenImage</span>) /<span class="hljs-regexp" style="box-sizing: border-box; color: rgb(0, 153, 38);">/ produces bridged NSError</span></code></pre><p style="box-sizing: border-box; margin: 16px 0px;" class="">This is what enables the use of&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">catch let x as NSError</code>&nbsp;pattern matching to catch Swift errors as&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">NSError</code>objects today.</p></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Check whether an&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">NSError</code>&nbsp;object has a domain and code matching a type conforming to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">_ObjectiveCBridgeableErrorProtocol</code>, and extracting the Swift error if so:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 206px;" class=""><code class="(null) objectivec hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;">func getAs<span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSCocoaError</span>(error: <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSError</span>) -&gt; <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSCocoaError</span>? {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> error as? <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSCocoaError</span>
}

<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// Returns NSCocoaError.fileNoSuchFileError</span>
getAs<span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSCocoaError</span>(error: <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSError</span>(domain: <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSCocoaErrorDomain</span>,
                                 code: <span class="hljs-built_in" style="box-sizing: border-box; color: rgb(0, 134, 179);">NSFileNoSuchFileError</span>,
                                 userInfo: []))</code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Drill through&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Optional</code>s. If an&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Optional</code>&nbsp;contains&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">some</code>&nbsp;value, it is extracted, and the cast is attempted on the contained value; the cast fails if the source value is&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">none</code>&nbsp;and the result type is not optional:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 126px;" class=""><code class="(null) cs hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">var</span> x: String? = <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"optional string"</span>
getAsNSString(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">value</span>: x) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces "optional string": NSString</span>
x = <span class="hljs-function" style="box-sizing: border-box;">nil
<span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">getAsNSString</span>(<span class="hljs-params" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">value</span>: x</span>) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// fails</span></span></code></pre><p style="box-sizing: border-box; margin: 16px 0px;" class="">If the result type is also&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Optional</code>, a successful cast is wrapped as&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">some</code>&nbsp;value of the result Optional type.&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">nil</code>&nbsp;source values succeed and become&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">nil</code>&nbsp;values of the result Optional type:</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; height: 206px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-func" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">func</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">getAsOptionalNSString</span><span class="hljs-generics" style="box-sizing: border-box;">&lt;T&gt;</span><span class="hljs-params" style="box-sizing: border-box;">(value: T)</span></span> -&gt; <span class="hljs-type" style="box-sizing: border-box;">NSString</span>?? {
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> value <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">as</span>? <span class="hljs-type" style="box-sizing: border-box;">NSString</span>?
}

<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">var</span> x: <span class="hljs-type" style="box-sizing: border-box;">String</span>? = <span class="hljs-string" style="box-sizing: border-box; color: rgb(221, 17, 68);">"optional string"</span>
getAsOptionalNSString(value: x) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces "optional string": NSString?</span>
x = <span class="hljs-literal" style="box-sizing: border-box;">nil</span>
getAsOptionalNSString(value: x) <span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">// produces nil: NSString?</span></code></pre></li><li style="box-sizing: border-box;" class=""><p style="box-sizing: border-box; margin: 16px 0px;" class="">Perform covariant container element checks and conversions for&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Array</code>,&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Dictionary</code>, and&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Set</code>.</p></li></ol><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">There are roughly three categories of functionality intertwined here. (1) through (4) are straightforward dynamic type checks. ((4) is arguably a bit different from (1) through (3) in that protocol conformances are extrinsic to a type, whereas (1) through (3) check the intrinsic type only of the participating value.) (5) through (7) involve Cocoa bridging conversions. (8) and (9) reflect additional implicit conversions supported by the language at compile time into the runtime type system. Optional and covariant container conversions have also been criticized as occasionally surprising and inconsistent with the rest of the language. If we curtail these conversions in the compiler, we would also want to consider removing their special dynamic cast behavior too. For the purposes of this discussion, I’d like to focus on removing the bridging behavior, cases (5) through (7).</p><h1 id="replacementsfordynamiccastbehavior" style="box-sizing: border-box; font-size: 2.25em; margin: 1em 0px 16px; line-height: 1.2; position: relative; color: rgb(51, 51, 51); padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); font-family: helvetica, arial, freesans, clean, sans-serif; background-color: rgb(255, 255, 255);" class="">Replacements for Dynamic Cast Behavior</h1><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">If we remove bridging behavior from dynamic casts, we still need to provide API for performing those conversions. I’d recommend introducing unlabeled initializers for these conversions, matching the conventions for other value-preserving conversions in the standard library:</p><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; color: rgb(51, 51, 51); height: 346px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">String</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">_</span> ns: <span class="hljs-type" style="box-sizing: border-box;">NSString</span>)
}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">NSString</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">_</span> value: <span class="hljs-type" style="box-sizing: border-box;">String</span>)
}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Array</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">where</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Element</span>: <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">_ObjectiveCBridgeable</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">_</span> ns: <span class="hljs-type" style="box-sizing: border-box;">NSArray</span>&lt;<span class="hljs-type" style="box-sizing: border-box;">Element</span>._ObjectiveCType&gt;)
}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">NSArray</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>&lt;<span class="hljs-type" style="box-sizing: border-box;">BridgedElement</span>: _ObjectiveCBridgeable
       <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">where</span> <span class="hljs-type" style="box-sizing: border-box;">BridgedElement</span>._ObjectiveCType == <span class="hljs-type" style="box-sizing: border-box;">Element</span>&gt;(
    <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">_</span> value: <span class="hljs-type" style="box-sizing: border-box;">Array</span>&lt;<span class="hljs-type" style="box-sizing: border-box;">BridgedElement</span>&gt;)
}
<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">/* etc. */</span></code></pre><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">NSError</code>&nbsp;bridging can also be extracted from the runtime, and the same functionality exposed as a factory initializer on&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">NSError</code>:</p><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; color: rgb(51, 51, 51); height: 106px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">NSError</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>(<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 153, 153);">_</span> swiftError: <span class="hljs-type" style="box-sizing: border-box;">ErrorType</span>)
}</code></pre><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">It’s also useful to be able to conditionally bridge to a value type from&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">AnyObject</code>, especially when working with heterogeneous property lists from Cocoa. This could be handled using failable initializers:</p><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; color: rgb(51, 51, 51); height: 246px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">String</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>?(bridging: <span class="hljs-type" style="box-sizing: border-box;">AnyObject</span>)
}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Array</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>?(bridging: <span class="hljs-type" style="box-sizing: border-box;">AnyObject</span>)
}
<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">Dictionary</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>?(bridging: <span class="hljs-type" style="box-sizing: border-box;">AnyObject</span>)
}
<span class="hljs-comment" style="box-sizing: border-box; color: rgb(153, 153, 136); font-style: italic;">/* etc. */</span></code></pre><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><p style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class="">(This can probably be factored into a protocol extension on&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">_ObjectiveCBridgeable</code>.) Similarly, one could add a failable initializer to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">ErrorProtocol</code>&nbsp;for bridging&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">NSError</code>s back to Swift error values:</p><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 16px; line-height: 1.45; padding: 16px; background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; tab-size: 4; color: rgb(51, 51, 51); height: 106px;" class=""><code class="(null) swift hljs" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0.5em; margin: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border: 0px; display: block; line-height: inherit; word-wrap: normal; height: auto;"><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">extension</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">ErrorType</span> </span>{
  <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">init</span>?(bridging: <span class="hljs-type" style="box-sizing: border-box;">NSError</span>)
}</code></pre><div style="box-sizing: border-box; margin: 0px 0px 16px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><br class="webkit-block-placeholder"></div><div style="box-sizing: border-box; margin-top: 0px; margin-right: 0px; margin-left: 0px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255); margin-bottom: 0px !important;" class="">If you want to get really reductionist, you can ask whether&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">as?</code>&nbsp;and related operations really need special syntax at all; they could in theory be fully expressed as global functions, or as extension methods on&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Any</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">AnyObject</code>&nbsp;if we allowed such things. Regardless, I think we want type-checking dynamic casts to be clearly a&nbsp;<em style="box-sizing: border-box;" class="">different</em>&nbsp;operation from these bridging conversions. This will lead to a cleaner, easier-to-understand model with less special-case magic behavior.</div><div style="box-sizing: border-box; margin-top: 0px; margin-right: 0px; margin-left: 0px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255); margin-bottom: 0px !important;" class=""><br class=""></div><div style="box-sizing: border-box; margin-top: 0px; margin-right: 0px; margin-left: 0px; color: rgb(51, 51, 51); font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 16px; background-color: rgb(255, 255, 255); margin-bottom: 0px !important;" class="">-Joe</div></body></html>