Hopefully we will one day have generalized existentials which would at least 
allow a heterogeneous array of protocols with an associated type; however it is 
not clear how such an existential could conform to Hashable in a general way, 
given that Hashable implies Equatable which has a Self requirement.

Slava

> On Jul 18, 2017, at 10:36 PM, Glen Huang via swift-users 
> <swift-users@swift.org> wrote:
> 
> Do you think if there will be any evolution proposal to address this 
> limitation? Or it’s an inherent tradeoff that is unlikely to be changed?
> 
>> On 19 Jul 2017, at 8:49 AM, Jordan Rose <jordan_r...@apple.com 
>> <mailto:jordan_r...@apple.com>> wrote:
>> 
>> 
>> 
>>> On Jul 18, 2017, at 10:33, Vladimir.S via swift-users 
>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>> 
>>> On 17.07.2017 4:51, Glen Huang via swift-users wrote:
>>>> Thanks for the code sample and link, but if I’m not wrong, this pattern 
>>>> doesn’t allow heterogeneous items.
>>> 
>>> Support the question. Trying to understand if we can have something like 
>>> [AnyHashable] for our custom protocol(with associated type) or AnyHashable 
>>> has a very special support from compiler and we can use only [Any] or such 
>>> kind of wrapper:
>>> 
>>> struct AnyMyProtocol {
>>>  let actualInstance: Any
>>>  init<T: MyProtocol>(_ instance: T) { actualInstance = instance}
>>> }
>>> 
>>> let instances: [AnyMyProtocol] = [AnyMyProtocol(...), AnyMyProtocol(...)]
>>> 
>>> if let some = instances[0].actualInstance as? 
>>> SpecificImplementationOfMyProtocol {
>>>     // use 'some' as SpecificImplementationMyProtocol instance
>>>     // seems like no way to refer to just MyProtocol
>>> }
>> 
>> AnyHashable is special, sorry. You'll have to use this sort of indirect 
>> unwrapping instead. You can write a little convenience method for it though, 
>> if you want:
>> 
>> extension AnyMyProtocol {
>>   func get<T: MyProtocol>(as: T.Type) -> T? {
>>     return self.actualInstance as? T
>>   }
>> }
>> 
>> if let some = instances[0].get(as: SpecificImplementationOfMyProtocol.self) {
>>   // use 'some' here
>> }
>> 
>> Jordan
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

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

Reply via email to