Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift 3无法将符合协议的对象数组附加到该协议的集合中_Arrays_Swift_Swift3_Protocols - Fatal编程技术网

Arrays 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

下面我已经粘贴了代码,您应该能够将其粘贴到Swift 3游乐场中并看到错误

我定义了一个协议,并创建了一个该类型的空数组。然后,我有一个符合协议的类,我试图将它附加到数组中,但得到以下错误

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)
}