> On Nov 10, 2016, at 11:51 AM, Matthew Johnson <matt...@anandabits.com> wrote:
> 
>> 
>> On Nov 10, 2016, at 1:44 PM, Joe Groff <jgr...@apple.com 
>> <mailto:jgr...@apple.com>> wrote:
>> 
>>> 
>>> On Nov 10, 2016, at 11:42 AM, Matthew Johnson <matt...@anandabits.com 
>>> <mailto:matt...@anandabits.com>> wrote:
>>> 
>>> 
>>>> On Nov 10, 2016, at 1:34 PM, Joe Groff via swift-dev <swift-...@swift.org 
>>>> <mailto:swift-...@swift.org>> wrote:
>>>> 
>>>> 
>>>>> On Nov 10, 2016, at 10:30 AM, Philippe Hausler <phaus...@apple.com 
>>>>> <mailto:phaus...@apple.com>> wrote:
>>>>> 
>>>>> So I think there are a few rough edges here not just the hashing or 
>>>>> equality. I think the issue comes down to the subclass of NSNumber that 
>>>>> is being used - it is defeating not only hashing but also performance and 
>>>>> allocation optimizations in Foundation.
>>>>> 
>>>>> So what would we have to do to get rid of the “type preserving” NSNumber 
>>>>> subclass?
>>>> 
>>>> The type-preserving subclasses remember the exact Swift type that a value 
>>>> was bridged from, to preserve type specificity of casts so that e.g. `0 as 
>>>> Any as AnyObject as Any as? Float` doesn't succeed even if the Any <-> 
>>>> AnyObject round-trip involves ObjC, thereby providing somewhat more 
>>>> consistent behavior between Darwin and Corelibs-based Swift. If we were 
>>>> willing to give that up, and say that NSNumbers just flat-out lose type 
>>>> info and can cast back to any Swift number type, then it seems to me we 
>>>> could use the pure Cocoa subclasses.
>>> 
>>> Would these only be value-preserving casts and return nil if information 
>>> loss would occur?  I think that might be preferable anyway.  Maybe I’m just 
>>> not thinking hard enough, but when would the original type information be 
>>> important as long as information isn’t lost?  When I interact with these 
>>> casts and NSNumber (JSON parsing, etc) I generally *do not* want an 
>>> attempted cast that would be value-preserving to ever fail.
>> 
>> I'm inclined to agree that the cast should be value-preserving rather than 
>> type-preserving. There was concern about the behavior being different on 
>> Darwin and Linux, which is why we try to be type-preserving so that pure 
>> Swift code that uses number values with Any or other polymorphic interfaces 
>> behaves consistently with Cocoa Foundation code that has to traffic in 
>> NSNumber for the same effect.
> 
> Are you saying that Swift on Darwin can’t have value-preserving behavior?  It 
> seems like I’m missing something here.  If value-preserving is the desirable 
> behavior can you elaborate on the specific challenges getting in the way of 
> having that behavior everywhere?

It would require a change to the type relationships between the number value 
types on Swift. They are currently plain, unrelated struct types, so you can't 
do something like:

        let x: Int = 1
        x as? Float // produces nil

We could conceivably special-case the number types in Swift so that they do 
value-preserving casts, and maybe that's even a good idea, but we don't today.

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

Reply via email to