Два типа (назовите их T
и R
) не обязательно являются эквивалентными только потому, что они соответствуют одному и тому же протоколу и используют один и тот же связанный тип.
По этой причине Array<Int>
то же самое, что и Set<Int>
, и должны быть свободно взаимозаменяемыми, потому что они оба соответствуют Collection
, где Element
равно Int
.
Вот еще один контрпример:
protocol MyProtocol {
associatedtype AssociatedType
init()
}
protocol MySubProtocol1: MyProtocol where AssociatedType == Int {}
protocol MySubProtocol2: MyProtocol where AssociatedType == Int {}
struct S1: MySubProtocol1 {}
struct S2: MySubProtocol2 {}
func myFunc<T: MyProtocol, R: MyProtocol>(arg: T) -> R
where T.AssociatedType == R.AssociatedType {
return arg as! R // Let's see what would happen. Don't do this!
}
func produce<T: MySubProtocol1>(type: T.Type) -> T {
return T()
}
func consume<T: MySubProtocol2>(arg: T, ofType: T.Type) {
print(arg)
}
consume(arg: myFunc(arg: produce(type: S1.self)), ofType: S2.self)
Завершено из-за сигнала: ABORT TRAP (6)
Невозможно привести значение типа 'main.S1'
(0x100e44210
) к 'main.S2'
(0x100e44228
).