> Am 08.06.2016 um 23:37 schrieb Austin Zheng via swift-evolution
> <[email protected]>:
>
> func doSomething<T : Collection where T.Element == Int>(x: T, y: T) {
> // Get indexes out of x and use them to index into y
> var idx = x.startIndex
> while (idx != x.endIndex || idx != y.endIndex) {
> print(x[idx])
> print(y[idx])
> idx = x.nextIndex(idx)
> }
> }
> let someSeq : Any<Collection where .Element == Int> = // ...
> let anotherSeq : Any<Collection where .Element == Int> = // ...
> // Trouble!
> // someSeq and anotherSeq are the same existential type
> // But the concrete index types within each of the existential variables may
> be different
> doSomething(someSeq, anotherSeq)
>
> It's this situation (using an existential type to fulfill a generic type
> parameter constrained to the same requirements that comprise that
> existential) that requires either of the two options that Dave presented, due
> to our lack of compile-time type information about the fulfilling type's
> associated types.
>
Ok, that’s indeed a type error and I think that I now see why Any<Collection
where .Element == Int> does not conform to T: Collection where T.Element ==
Int. This is because T stands for one *fixed* type out of the set of types
described by Any<Collection where .Element == Int> whereas Any<Collection where
.Element == Int> stands for *all* of them, which is more, so it cannot conform
to T.
So doSomething(someSeq, anotherSeq) would be a type error and I’m fine with
that.
We could try to write
func doSomething<T: Any<Collection where T.Element == Int>>(x: T, y: T) { … }
but then we wouldn’t be able to write the body as desired, because x.Index
would be a different type from y.Index (and rightly so).
I think all this is fine, though. The above method doSomething() can only be
written with runtime casts of the indices by opening them explicitly with one
of the proposed syntaxes.
-Thorsten
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution