【发布时间】:2016-07-23 15:18:03
【问题描述】:
我正在尝试创建一个方法,该方法采用符合 Swift 协议的结构数组。
对于这个最简单的例子,我定义了一个空协议和一个方法,该方法接受一个符合该协议的对象数组并打印它们
protocol SomeProtocol {}
func methodTakingProtocol(objects: [SomeProtocol]) {
// do something with the array of objects
print(objects)
}
但是,当我尝试向此方法提供符合 SomeProtocol 的结构数组时,我收到了错误
struct SomeStruct: SomeProtocol {}
let arrayOfStructs = [ SomeStruct(), SomeStruct() ]
methodTakingProtocol(arrayOfStructs)
// ^ "Cannot convert value of type '[SomeStruct]' to expected argument type '[SomeProtocol]'"
查了一下,我发现我可以通过明确指出SomeStruct 采用SomeProtocol 来解决这个问题
let arrayOfStructs: [SomeProtocol] = [ SomeStruct(), SomeStruct() ]
// This will work
methodTakingProtocol(arrayOfStructs)
谁能告诉我这里发生了什么?这是一个我应该提交雷达的错误,还是有一些理由解释为什么编译器不识别这个结构数组符合它们被标记为采用的协议?
【问题讨论】:
-
我不认为这是一个错误。编译器看到
SomeStruct的实例,因此将数组的类型设置为[SomeStruct]。要更改类型,您需要明确您的意图。不过,您可能会提交功能雷达。