Я пытаюсь создать метод, который принимает массив структур, которые соответствуют протоколу в 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] '. Чтобы изменить тип, вам нужно сделать свое намерение явным. Однако вы можете зарегистрировать радар функции. – dasdom
Связанные: http://stackoverflow.com/questions/34820240/assigning-an-array-of-structs-to-an-array-of-protocols. –