Вот некоторые настройки кода, чтобы объяснить, что происходит:Невозможно преобразовать значение типа '[SomeStruct]' для указанного типа '[SomeProtocol]
protocol CanJump{
func jump()
}
struct Dog: CanJump{
func jump(){
print("yay jump")
}
}
struct Cat: CanJump{
func jump(){
print("nothx")
}
}
let d = [Dog()]
let c = Cat()
Это не работает:
let thingsThatCanJump: [CanJump] = d
Невозможно преобразовать значение типа [собака] для указанного типа [CanJump]
Это делает работу:
let thingsThatCanJump: [CanJump] = [c]
Отвратительная обходной путь, который я придумал это:
let thingsThatCanJump: [CanJump] = d.map({$0 as CanJump})
Может кто-нибудь объяснить, почему это происходит?
Я предполагаю, что это связано с тем, что компилятор не полностью оценивает типы и соответствие.
FYI: пусть d = [Dog(), как CanJump] работает хорошо ы – LoVo
Это следствие того, что дженерики являются инвариантными в Swift. [См. Этот вопрос и ответы для получения дополнительной информации] (http://stackoverflow.com/questions/37188580/why-isnt-somestruct-convertible-to-any). Хотя обратите внимание, что вы столкнулись с этой проблемой только с массивом структур, а не с классами. – Hamish
@ originaluser2: Спасибо! Это тот ответ, который я искал. – ciauri