我们说我有以下内容:
protocol MyProtocol {
}
struct MyStruct: MyProtocol {
}
var s1 = MyStruct()
var s2 = MyStruct()
var s3 = MyStruct()
var structArray = [s1, s2, s3]
当我尝试将这个结构数组分配给一个协议数组(structArray
中的每个结构符合)时:
var protocolArray:[MyProtocol] = structArray
我收到此错误:Cannot convert array of type '[MyStruct]' to specified type '[MyProtocol]'
我希望由于数组中的每个对象都符合协议,因此可以说"符合某些协议的结构数组"可分配给期望"符合该协议的任何事物的数组"。但是当类型是""数组时,这可能不适用。 vs just" thing",如果这是有道理的。
例如,这是有效的:
var p1:MyProtocol = s1
因为s1符合MyProtocol
。但是如果你使用数组那么它似乎就不再存在了。
顺便说一句,这似乎也有效:
var p1Array:[MyProtocol] = [s1, s2, s3]
大概是因为数组的类型被确定为[MyProtocol]
并且不是由某个先前的变量预先确定的(如我上面的例子中所示)。
所以无论如何,所有这一切都要问:最好的解决方法是什么?如何将一个结构数组(符合某些协议)分配给另一个类型只是"符合该协议的数组"。
我对Swift相当新,所以我可能会遗漏一些微不足道的东西。
答案 0 :(得分:4)
我通常只需map
数组到我需要的类型:
var protocolArray: [MyProtocol] = structArray.map { $0 as MyProtocol }
当你这样做时,你实际上可以摆脱类型注释,这样整个表达式实际上不会那么长:
var protocolArray = structArray.map { $0 as MyProtocol }
Swift不会自动在数组类型之间进行转换,即使它们是兼容的。你必须以某种方式明确它。