Avatar
↑の件です。 まず、↓はできません。 protocol Animal {} struct Cat: Animal {} func bar<T: Animal>(_ x: T) { print(x) } let b: Animal = Cat() bar(b) // NG (edited)
1:49 PM
しかし、↓はできます。 func foo<T: Sequence>(_ x: T) { print(x) } let a: AnySequence<Int> = AnySequence([2, 3, 5]) foo(a) // OK (edited)
1:50 PM
そして、 Generalized Existential が実現されたら↓になることが示唆されています。 typealias AnySequence<Element> = Any<Sequence where .Iterator.Element == Element> https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#generalized-existentials (edited)
swift - The Swift Programming Language
1:51 PM
そうすると、現状との互換性を考えると当然 fooAny<Sequence where .Iterator.Element == Element> という Existential Type を渡せるということになります。
1:52 PM
ここで、 Existential をサブタイプとして振る舞わせるのであれば、 Animalbar に渡せてもいいように思うのですがいかがでしょう?