Это в основном связано с тем, как работает универсальная дисперсия в Swift.
Только несколько типов являются вариациями в Swift , включая Array<T>
и Set<T>
.Большинство других типов и определяемые вами типы являются инвариантами.
Инвариантность означает, что T<A>
и T<B>
являются несвязанными типами, даже если A
и B
связаны между собой.
Array<T>
и Set<T>
являются ковариантными, что означает, что Array<A>
можно присвоить переменной типа Array<B>
, если A
является подтипом B
.Вы можете заставить его идти другим путем (как вы это делали в третьей строке), используя as!
.
ArraySlice<T>
, как и многие другие типы, просто инвариантно.Вам нужно сделать это для конвертации:
let d: ArraySlice<Int> = ArraySlice(b.map { $0 as! Int })