将一个结构体数组分配给协议数组

3

假设我有以下内容:

protocol MyProtocol {
}

struct MyStruct: MyProtocol {
}

var s1 = MyStruct()
var s2 = MyStruct()
var s3 = MyStruct()

var structArray = [s1, s2, s3]

当我尝试将这个结构体数组分配给一个由每个structArray结构体都符合的协议数组时:
var protocolArray:[MyProtocol] = structArray

我遇到了这个错误:无法将类型为 '[MyStruct]' 的数组转换为指定类型 '[MyProtocol]' 我本以为,由于数组中的每个对象都符合协议,所以可以说“符合某个协议的结构体数组”可以分配给期望“任何符合该协议的数组”的东西。但是也许当类型为“数组”而不是“东西”时,这种情况不适用,如果这有任何意义的话。
例如,这是有效的:
var p1:MyProtocol = s1

因为 s1 符合 MyProtocol。但如果使用数组,似乎就不再适用。

顺便提一句,这个也可以工作:

var p1Array:[MyProtocol] = [s1, s2, s3]

可能是因为数组的类型被确定为[MyProtocol],而不是由先前的某个变量预先确定(就像上面我的示例中一样)。

那么无论如何,所有这些都是要问的:有什么最好的方法来解决这个问题?我如何将符合某个协议的结构体数组分配给另一个类型只是“符合该协议的东西的数组”的数组。

我对Swift还比较新,所以可能会漏掉一些微不足道的东西。


2
这方面有一个错误报告。可能是你提交的吗?如果不是,请关注以下错误报告:https://bugs.swift.org/browse/SR-1043?jql=text%20~%20%22cannot%20convert%22 - Barbara R
@BarbaraRodeker,我没有提交它,但感谢您分享链接! - nebs
1个回答

4

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

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

当你这样做时,实际上可以摆脱类型注释,使整个表达式并不那么长:
var protocolArray = structArray.map { $0 as MyProtocol }

Swift不会自动转换数组类型,即使它们是兼容的。您必须以某种方式明确表达。


Swift编译器不允许在这里进行原始赋值,是否有一些深层次的原因? - Vlad Soroka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接