gpt4 book ai didi

swift - 将结构数组分配给协议(protocol)数组

转载 作者:搜寻专家 更新时间:2023-10-31 22:21:30 25 4
gpt4 key购买 nike

假设我有以下内容:

protocol MyProtocol {
}

struct MyStruct: MyProtocol {
}

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

var structArray = [s1, s2, s3]

当我尝试将这个结构数组分配给协议(protocol)数组时(structArray 中的每个结构都符合):

var protocolArray:[MyProtocol] = structArray

我收到此错误:无法将类型为“[MyStruct]”的数组转换为指定类型“[MyProtocol]”

我希望因为数组中的每个对象都符合协议(protocol),所以可以说“符合某些协议(protocol)的结构数组”可分配给期望“符合该协议(protocol)的任何数组”的东西协议(protocol)”。但是当类型是“数组”而不是“事物”时,这可能不适用,如果这有意义的话。

例如,这是有效的:

var p1:MyProtocol = s1

因为 s1 符合 MyProtocol。但是,如果您使用数组,那么它似乎就不再适用了。

顺便说一句,这似乎也有效:

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

大概是因为数组的类型被确定为 [MyProtocol] 并且不是由某些先前的变量预先确定的(如我上面的示例)。

所以无论如何,所有这一切都是为了问:解决这个问题的最佳方法是什么?我如何将一个结构数组(符合某些协议(protocol))分配给另一个数组,该数组的类型只是“符合该协议(protocol)的事物的数组”。

我是 Swift 的新手,所以我可能遗漏了一些微不足道的东西。

最佳答案

我通常只是将数组映射到我需要的类型:

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

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

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

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

关于swift - 将结构数组分配给协议(protocol)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34820240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com