Arrays Swift 3无法将符合协议的对象数组附加到该协议的集合中
下面我已经粘贴了代码,您应该能够将其粘贴到Swift 3游乐场中并看到错误 我定义了一个协议,并创建了一个该类型的空数组。然后,我有一个符合协议的类,我试图将它附加到数组中,但得到以下错误Arrays Swift 3无法将符合协议的对象数组附加到该协议的集合中,arrays,swift,swift3,protocols,Arrays,Swift,Swift3,Protocols,下面我已经粘贴了代码,您应该能够将其粘贴到Swift 3游乐场中并看到错误 我定义了一个协议,并创建了一个该类型的空数组。然后,我有一个符合协议的类,我试图将它附加到数组中,但得到以下错误 protocol MyProtocol { var text: String { get } } class MyClass: MyProtocol { var text = "Hello" } var collection = [MyProtocol]() var myClassColle
protocol MyProtocol {
var text: String { get }
}
class MyClass: MyProtocol {
var text = "Hello"
}
var collection = [MyProtocol]()
var myClassCollection = [MyClass(), MyClass()]
collection.append(myClassCollection)
argument type '[MyClass]' does not conform to expected type 'MyProtocol'
请注意,collection+=myClassCollection返回以下错误:
error: cannot convert value of type '[MyProtocol]' to expected argument type 'inout _'
这在早期版本的Swift中起作用
到目前为止,我找到的唯一解决方案是迭代并将每个元素添加到新数组中,如下所示:
for item in myClassCollection {
collection.append(item)
}
感谢您的帮助,谢谢
编辑
解决方案如下所示:
collection.append(contentsOf: myClassCollection as [MyProtocol])
真正的问题是,当您缺少“as[MyProtocol]”时,会产生误导性的编译器错误
编译器错误为:
error: extraneous argument label 'contentsOf:' in call
collection.append(contentsOf: myClassCollection)
此错误会导致用户从代码中删除
contentsOf:
,从而导致我首先提到的错误。当集合只需要单个项时,您试图追加数组。例如,将集合更改为此编译:
var collection = [[MyProtocol]]()
以下是一种将两个阵列添加到一起的方法:
func merge<T: MyProtocol>(items: inout [T], with otherItems: inout [T]) -> [T] {
return items + otherItems
append(\newElement:Element)
追加单个元素。
您需要的是追加(新元素的内容:C)
但是你有
要将[MyClass]
数组显式转换为[MyProtocol]
,请执行以下操作:
collection.append(contentsOf: myClassCollection as [MyProtocol])
// or:
collection += myClassCollection as [MyProtocol]
如中所述,这
将每个数组元素包装到一个包含“符合MyProtocol
的内容”的框中,它不仅仅是一个重新解释
数组的一部分
编译器会为单个值自动执行此操作(这就是为什么
for item in myClassCollection {
collection.append(item)
}
编译),但不针对数组。在早期的Swift版本中,您可以
甚至无法将转换为[MyProtocol]
的整个数组,您
必须铸造每个单独的元素。这很有效。append(contentsOf:myClassCollection as[MyProtocol])如果您已经将其作为[MyProtocol]丢失,则该错误会产生误导。错误在调用中读取无关的参数标签“contentsOf:”。
for item in myClassCollection {
collection.append(item)
}