将结构数组分配给协议数组

时间:2016-01-15 21:35:21

标签: swift struct protocols

我们说我有以下内容:

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相当新,所以我可能会遗漏一些微不足道的东西。

1 个答案:

答案 0 :(得分:4)

我通常只需map数组到我需要的类型:

var protocolArray: [MyProtocol] = structArray.map { $0 as MyProtocol }

当你这样做时,你实际上可以摆脱类型注释,这样整个表达式实际上不会那么长:

var protocolArray = structArray.map { $0 as MyProtocol }

Swift不会自动在数组类型之间进行转换,即使它们是兼容的。你必须以某种方式明确它。