gpt4 book ai didi

arrays - swift - 使用协议(protocol)转换 Array 与 ArraySlice

转载 作者:行者123 更新时间:2023-11-28 05:50:46 25 4
gpt4 key购买 nike

在这段代码中

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>

dCast from 'ArraySlice<MyProtocol>' to unrelated type 'ArraySlice<Int>' always fails 警告.

为什么 Slice 不能以与原始 Array 相同的方式进行转换?是否可以修改此代码段以将 Array 转换行为赋予 Slice?

最佳答案

这主要是由于 Swift 中泛型变体的工作原理。

Only few types are variant in Swift , 包括 Array<T>Set<T> .大多数其他类型以及您定义的类型都是不变的。

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

Array<T>Set<T>是协变的,这意味着 Array<A>可以分配给类型为 Array<B> 的变量如果AB 的子类型.您可以使用 as! 强制它走另一条路(就像您在第三行所做的那样) .

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

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

关于arrays - swift - 使用协议(protocol)转换 Array 与 ArraySlice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53029508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com