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