Dev*_*ist 9 arrays casting swift
我正式混淆为什么这不起作用(这里没有太多要解释):
protocol A {
var value: Int { get set }
}
struct B: A {
var value: Int
}
let array: [B] = [B(value: 10)]
let singleAValue: A = array[0] // extracting works as expected
var protocolArray: [A] = []
protocolArray.append(singleAValue) // we can put the value inside the `protocolArray` without problems
print(protocolArray)
let newProtocolArray: [A] = array // but why does this conversion not work?
Run Code Online (Sandbox Code Playgroud)
协议类型的数组具有与B结构数组不同的内存表示.因为数组A可以包含许多不同类型的对象,所以编译器必须创建间接(数组中元素的包装)以确保它们都具有相同的大小.
由于此转换可能成本很高(如果源数组很大),编译器会强制您通过映射源数组使其显式化.你可以这样写:
let newProtocolArray = array.map { $0 as A }
Run Code Online (Sandbox Code Playgroud)
或这个:
let newProtocolArray: [A] = array.map { $0 }
Run Code Online (Sandbox Code Playgroud)
两者都是等价的.
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |