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

Reply via email to