> On Aug 24, 2016, at 6:27 PM, Greg Parker <gpar...@apple.com> wrote:
> 
> 
>> On Aug 23, 2016, at 3:36 PM, Douglas Gregor via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> Proposed solution
>> 
>> When an Optional<T> value is bridged to an Objective-C object, if it 
>> contains some value, that value should be bridged; otherwise, NSNull or 
>> another sentinel object should be used.
>> 
> I don't think I like this.
> 
> Let me verify my understanding. If I have this:
> 
>     // imported from ObjC
>     func f(with object: Any)
>     
>     let s: String? = nil
>     f(s)
> 
> then at runtime it will call 
>     f([NSNull null])
> ?
> 
> The problem is that NSNull is in fact rare in Cocoa. They are used in the 
> Foundation containers and almost nowhere else. Passing NSNull into almost any 
> API is going to do something confusing at runtime. If you're lucky you get a 
> prompt error "-[NSNull something]: unrecognized selector". If you're not 
> lucky you'll get that error somewhere much later, or something even less 
> obviously related to NSNull and your call site. That sounds like the wrong 
> outcome for developers who are confused or careless or unaware of an optional.

I think there’s some confusion about what’s already in place due to SE-0116 
<https://github.com/apple/swift-evolution/blob/master/proposals/0116-id-as-any.md>
 vs. what’s being proposed here. Specifically, your example:

>     // imported from ObjC
>     func f(with object: Any)
>     
>     let s: String? = nil
>     f(with:s)


Is accepted as part of SE-0116, because any Swift type can be placed in an Any, 
and anything can be bridged to Objective-C. Nearly all of the concerns in this 
thread are about this aspect of the already-accepted-and-implemented SE-0116: 
that an optional can get passed through to an Objective-C ‘id’ without being 
explicitly unwrapped. That behavior exists, and the type of the object seen in 
Objective-C is an opaque Swift wrapper type. I’d thought we were going to get 
some warnings when putting an optional into an Any that would end up going into 
Objective-C, but I don’t see the warning: maybe Joe can weigh in as to why we 
didn’t do that. 

*This* proposal is to make the object seen from Objective-C [NSNull null], so 
at least it’s predictable/detectable on the Objective-C side.

Now, for the related example:

        let s2: String? = “hello”
        f(with: s2)

Objective-C will see an NSString (well, Swift’s private subclass of NSString), 
rather than an opaque Swift wrapper type.

        - Doug


_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to