Taking that suggestion a step further, it's pretty easy to define a function that performs this sort of casting without bridging.
func unbridgedCast<T, U>(_ x: T, to: U.Type) -> U? { guard type(of: x) == U.self else { return nil } return unsafeBitCast(x, to: U.self) } > On Aug 24, 2016, at 5:42 PM, Xiaodi Wu via swift-evolution > <swift-evolution@swift.org> wrote: > > import Foundation > > let foo: Any = "Hello" > type(of: foo) == String.self // true > type(of: foo) == NSString.self // false > > let bar: Any = "Hello" as NSString > type(of: bar) == String.self // false > type(of: bar) == NSString.self // true > > Why not this? > > > On Wed, Aug 24, 2016 at 19:09 Charles Srstka via swift-evolution > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > MOTIVATION: > > SE-0083 appears to be dead in the water, having been deferred until later in > Swift 3 back in May and not having been heard from since then, with the Swift > 3 release looming closer and closer. However, the predictability gains that > would have been provided by this change remain desirable for cases where one > needs to know the actual dynamic type of an entity before any bridging magic > is involved. Additionally, performance-critical code may desire the ability > to check something’s type quickly without incurring the overhead of > Objective-C bridging code. > > PROPOSED SOLUTION: > > I propose the following operators: really_is, really_as, really_as?, and > really_as!. These operators would only return a positive result if the type > actually was what was being asked for, instead of something that might be > able to bridge to that type. > > DETAILED DESIGN: > > let foo: Any = "Foo" > let bar: Any = NSString(string: "Bar") > > let fooIsString = foo is String // true > let fooReallyIsString = foo really_is String // true > > let fooIsNSString = foo is NSString // true > let fooReallyIsNSString = foo really_is NSString // false > > let barIsString = bar is String // true > let barReallyIsString = bar really_is String // false > > let barIsNSString = bar is NSString // true > let barReallyIsNSString = bar really_is NSString // true > > ALTERNATIVES CONSIDERED: > > Stick with using an unholy combination of Mirror and unsafeBitCast when you > need to know what you’ve actually got. > > Charles > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org <mailto:swift-evolution@swift.org> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution> > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution