【问题标题】:Assigning an array of structs to an array of protocols将结构数组分配给协议数组
【发布时间】:2016-01-15 21:35:20
【问题描述】:

假设我有以下内容:

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]'

我希望由于数组中的每个对象都符合协议,因此可以说“符合某种协议的结构数组”可以分配给期望“符合该协议的任何东西的数组”的东西协议”。但是,当类型是“数组”而不是“事物”时,也许这并不适用,如果这有意义的话。

例如,这是有效的:

var p1:MyProtocol = s1

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

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

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

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

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

我对 Swift 还很陌生,所以我可能会遗漏一些琐碎的事情。

【问题讨论】:

  • 有一个关于这个的错误报告。可能是你提交的?如果您没有,您可能有兴趣关注错误报告:bugs.swift.org/browse/…
  • @BarbaraRodeker 我没有存档,但感谢分享链接!

标签: swift struct protocols


【解决方案1】:

我通常只是 map 将数组转换为我需要的类型:

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

当你这样做时,你实际上可以摆脱类型注释,因此整个表达式实际上并没有那么长:

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

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

【讨论】:

  • Swift 编译器不允许在这里进行原始分配有什么深层原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多