Ниже я вставил код, который вы можете вставить в игровую площадку Swift 3 и увидеть ошибку.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'
Обратите внимание, что сбор + = myClassCollection возвращает следующую ошибку:
error: cannot convert value of type '[MyProtocol]' to expected argument type 'inout _'
Это работает в более ранних версиях Swift.
Единственное решение, которое я нашел до сих пор является для перебора и добавить каждый элемент в новый массив так:
for item in myClassCollection {
collection.append(item)
}
Любая помощь приветствуется, спасибо!
EDIT
Решение, как показано ниже:
collection.append(contentsOf: myClassCollection as [MyProtocol])
Реальная проблема заключается в заблуждение ошибка компилятора, когда вам не хватает "как [MyProtocol]" ошибка
компилятор гласит:
error: extraneous argument label 'contentsOf:' in call
collection.append(contentsOf: myClassCollection)
Эта ошибка заставляет пользователей удалять contentsOf:
из кода, который затем вызывает ошибку, о которой я впервые упоминал.
Это работает. collection.append (contentsOf: myClassCollection as [MyProtocol]) Ошибка вводит в заблуждение, если вы отсутствовали как [MyProtocol]. Ошибка читает посторонний аргумент label 'contentsOf:' при вызове. –