[swift-evolution] [swift-evolution-announce] [Review] SE-0083: Remove bridging conversion behavior from dynamic casts
Douglas Gregor
dgregor at apple.com
Tue May 24 23:49:23 CDT 2016
> On May 23, 2016, at 5:26 PM, Jordan Rose via swift-evolution <swift-evolution at swift.org> wrote:
>
> I am way late, but I share Brent’s concerns. I don’t think this addresses the very common case of “getting a String out of a heterogeneous dictionary”.
>
> let name = plist[“name”] as! String
>
> becomes one of these:
>
> let name = plist[“name”] as! NSString as String
> let name = String(plist[“name”] as! NSString)
> let name = String(forceBridging: plist[“name”]) // not in the proposal
>
> none of which I’m particularly happy with.
I am also way, way late, here, but this ties into a philosophical concern I have. The bridging that we have in place was designed to put Swift’s value types front-and-center in the Swift experience, even when interoperating with Objective-C APIs using reference-semantic types. It was a specific goal that one should not have to juggle between Swift.Array and NSArray—NSArray is bridged away in imported APIs, Swift arrays implicitly convert to AnyObject when working an AnyObject-based API, dynamic bridging conversions would pass through NSArray to get to Swift arrays, etc. So while one can certainly reach for NS(Mutable)Array in Swift, one should not *have* to do so in Swift.
This proposal and SE-0072 are chipping away at that bridging story, making the explicit use of NSArray/NSString/etc. required for interoperability with Objective-C APIs. While it does make the language more explicit and predictable (and dynamic casting more efficient!), it makes the use of these bridged reference-semantic more prevalent, which may lead to more overall confusion about which set of types to use. There might even be a portability argument: the current scheme lets you gloss over Any vs. AnyObject (which is a current difference we see in ObjC Foundation vs. corelibs Foundation).
- Doug
>
> Jordan
>
>
>> On May 19, 2016, at 02:31, Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>
>>> * What is your evaluation of the proposal?
>>
>> The review is technically over, but I don't believe a decision has been announced yet, so...
>>
>> I am generally in favor, but I have a serious concern about the readability of certain conversions with this change. To wit, conversions like these:
>>
>> myArray as! [NSView]
>> myDictionary as! [String: NSView]
>>
>> Are about to become something more like these:
>>
>> [NSView](forcedLazyBridging: myArray)
>> [String: NSView](forcedLazyBridging: myDictionary)
>>
>> Or these:
>>
>> Array<NSView>(forcedLazyBridging: myArray)
>> Dictionary<String, NSView>(forcedLazyBridging: myDictionary)
>>
>> Either option is a significant regression in code readability compared to the status quo.
>>
>> It's enough to make me wonder if we shouldn't have special-cased conversion methods for NSArray, NSDictionary, and NSSet:
>>
>> myArray.of(NSView) // returns [NSView]
>> myDictionary.of(NSView, for: String) // returns [String: NSView]
>> mySet.of(NSView) // returns Set<NSView>
>>
>> On the other hand, if you *don't* have to specify an element type, these aren't so bad:
>>
>> Array(forcedLazyBridging: myArray)
>> Dictionary(forcedLazyBridging: myDictionary)
>>
>> And it gets even better if you use something a little saner than `forcedLazyBridging` for the label.
>>
>>> * Is the problem being addressed significant enough to warrant a change to Swift?
>>
>> Yes. Conversions are a mess, and it'll be nice to clean them up.
>>
>>> * Does this proposal fit well with the feel and direction of Swift?
>>
>> Yes.
>>
>>> * If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?
>>
>> Most languages I've used have had much simpler cast systems with nothing particularly close to Swift's bridging casts.
>>
>>> * How much effort did you put into your review? A glance, a quick reading, or an in-depth study?
>>
>> Quick reading.
>>
>> --
>> Brent Royal-Gordon
>> Architechies
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160524/2cc41b05/attachment.html>
More information about the swift-evolution
mailing list