arrays - 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?可以修改此代码段以将数组转换行为赋予切片吗?
解决方案
这基本上是由于 Swift 中的泛型变化是如何工作的。
在 Swift 中只有少数类型是变体的,包括Array<T>
和Set<T>
。大多数其他类型以及您定义的类型都是不变的。
不变性意味着T<A>
和T<B>
是不相关的类型,即使A
和B
是相关的。
Array<T>
并且Set<T>
是协变的,这意味着如果a 是 的子Array<A>
类型,则可以将 a 分配给类型的变量。您可以使用.Array<B>
A
B
as!
ArraySlice<T>
,像许多其他类型一样,只是不变的。您需要这样做才能转换:
let d: ArraySlice<Int> = ArraySlice(b.map { $0 as! Int })
推荐阅读
- python - 读取整个文件并将其存储在列表中而不会丢失内容拆分它
- javascript - 在 Firestore 中进行动态过滤是否有更优化的方法?
- angular - 设置 nativescript-purchase 组件
- google-app-engine - 如何在标准环境中使用 Appengine Gradle 插件
- php - Twig 在 for 循环中添加空格
- java - 在抽象方法中比 instanceof/cast 更好的选择?
- python-3.x - 由于精度问题,Python 浮点加法测试用例失败
- python-3.x - 修改跳过空列表并继续功能
- javascript - xhr "progress" 监听器只被调用一次
- angular - Ngrx Action 需要确保在发送之前检索到来自 http 调用的数据