[swift-evolution] Pitch: Deprecate/remove AnyObject method dispatch

Slava Pestov spestov at apple.com
Tue Oct 24 17:27:52 CDT 2017


It is possible that they implement equality, but not hashing. So two equal values could hash differently. I don’t really know how NSObject implements but stuff, sorry.

Slava

> On Oct 24, 2017, at 3:26 PM, Jon Shier <jon at jonshier.com> wrote:
> 
> 	Thanks, Slava, that works. Do you have any idea why that works, but sets of the two arrays are always disjoint? The Set method works for SecCertificate but not SecKey.
> 
> 
> 
> Jon
> 
> 
>> On Oct 24, 2017, at 6:10 PM, Slava Pestov <spestov at apple.com> wrote:
>> 
>> isEqual is defined on NSObject. You could also try using an array of AnyHashable and calling == instead of isEqual.
>> 
>> Slava
>> 
>>> On Oct 24, 2017, at 3:09 PM, Jon Shier <jon at jonshier.com> wrote:
>>> 
>>> Slava:
>>> 	How would this change affect this code from Alamofire, used to compare two SecKey instances for public key pinning:
>>> 
>>> outerLoop: for serverPublicKey in ServerTrustPolicy.publicKeys(for: serverTrust) as [AnyObject] {
>>>  for pinnedPublicKey in pinnedPublicKeys as [AnyObject] {
>>>      if serverPublicKey.isEqual(pinnedPublicKey) {
>>>          serverTrustIsValid = true
>>>          break outerLoop
>>>      }
>>>  }
>>> }
>>> 
>>> I’m not sure why, but the AnyObject casting makes this work correctly, even in Swift 4. I’ve tried to “modernize” it by using Sets (compare the pinned keys with the available keys Sets) but it doesn’t work (hash implementation for SecKey is weird?).  I’m guessing that with the AnyObject case and isEqual, some underlying implementation is changed and equality works properly (or well enough for this use). I’m happy to get rid of this hack, but I’m not sure of any other method to accomplish our goals here.
>>> 
>>> 
>>> 
>>> Jon Shier
>>> 
>>>> On Oct 24, 2017, at 6:02 PM, Slava Pestov via swift-evolution <swift-evolution at swift.org> wrote:
>>>> 
>>>> Hi all,
>>>> 
>>>> Dynamic dispatch of methods through AnyObject is a source of implementation complexity, has many known bugs which we are not going to fix, and no longer makes sense now in an id-as-Any world; AnyObject is not the ‘common currency’ type for arbitrary Objective-C objects anymore.
>>>> 
>>>> I would like to propose we deprecate it as follows:
>>>> 
>>>> - Unconditional warning in Swift 4.1, with a fixit to add an ‘as’ cast to cast the base value to the right type
>>>> - Error in Swift 5 in -swift-version 5 mode
>>>> 
>>>> Thoughts? Does anyone actually rely on this feature, instead of just stumbling on it by accident once in a while?
>>>> 
>>>> Slava
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> 
>> 
> 



More information about the swift-evolution mailing list