Swift 2.2:无法将'[B]'类型的值转换为指定类型'[A]'

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)

Ole*_*ann 9

协议类型的数组具有与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)

两者都是等价的.