首页 > 解决方案 > swift - 使用协议投射 Array 与 ArraySlice

问题描述

在此代码段中

protocol MyProtocol {}
extension Int: MyProtocol {}

let a: Array<MyProtocol> = Array<Int>()
let b: ArraySlice<MyProtocol> = a[...]
let c: Array<Int> = a as! Array<Int>
let d: ArraySlice<Int> = b as! ArraySlice<Int>

d用 警告Cast from 'ArraySlice<MyProtocol>' to unrelated type 'ArraySlice<Int>' always fails

为什么不能以与原始数组相同的方式投射 Slice?可以修改此代码段以将数组转换行为赋予切片吗?

标签: arraysswift

解决方案


这基本上是由于 Swift 中的泛型变化是如何工作的。

在 Swift 中只有少数类型是变体的,包括Array<T>Set<T>。大多数其他类型以及您定义的类型都是不变的。

不变性意味着T<A>T<B>是不相关的类型,即使AB是相关的。

Array<T>并且Set<T>是协变的,这意味着如果a 是 的子Array<A>类型,则可以将 a 分配给类型的变量。您可以使用.Array<B>ABas!

ArraySlice<T>,像许多其他类型一样,只是不变的。您需要这样做才能转换:

let d: ArraySlice<Int> = ArraySlice(b.map { $0 as! Int })

推荐阅读