Swift 3无法将符合协议的对象数组附加到该协议的集合

Kri*_*lci 4 arrays protocols swift swift3

下面我粘贴了你应该能够粘贴到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'
Run Code Online (Sandbox Code Playgroud)

请注意,collection + = myClassCollection会返回以下错误:

error: cannot convert value of type '[MyProtocol]' to expected argument type 'inout _'
Run Code Online (Sandbox Code Playgroud)

这在早期版本的Swift中有效.

到目前为止我找到的唯一解决方案是迭代并将每个元素添加到新数组中,如下所示:

for item in myClassCollection {
    collection.append(item)
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示感谢,谢谢!

编辑

如下所示的解决方案是:

collection.append(contentsOf: myClassCollection as [MyProtocol])
Run Code Online (Sandbox Code Playgroud)

当您缺少"as [MyProtocol]"时,真正的问题是误导性的编译器错误

编译器错误如下:

error: extraneous argument label 'contentsOf:' in call
collection.append(contentsOf: myClassCollection)
Run Code Online (Sandbox Code Playgroud)

此错误导致用户contentsOf:从代码中删除,然后导致我首先提到的错误.

Mar*_*n R 11

append(_ newElement: Element)附加单个元素.你想要的是什么append(contentsOf newElements: C).

但是你要转换[MyClass]阵列,以[MyProtocol]明确:

collection.append(contentsOf: myClassCollection as [MyProtocol])
// or:
collection += myClassCollection as [MyProtocol]
Run Code Online (Sandbox Code Playgroud)

正如在Swift中使用协议时的类型转换中所解释的那样,这会将每个数组元素包装成一个包含"符合某些内容"的框MyProtocol,这不仅仅是对数组的重新解释.

编译器会自动为单个值执行此操作(这就是原因

for item in myClassCollection {
    collection.append(item)
}
Run Code Online (Sandbox Code Playgroud)

编译)但不是数组.在早期的Swift版本中,你甚至无法使用整个数组as [MyProtocol],你必须强制转换每个元素.