2016-05-13 2 views
2

Вот некоторые настройки кода, чтобы объяснить, что происходит:Невозможно преобразовать значение типа '[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}) 

Может кто-нибудь объяснить, почему это происходит?

Я предполагаю, что это связано с тем, что компилятор не полностью оценивает типы и соответствие.

+1

FYI: пусть d = [Dog(), как CanJump] работает хорошо ы – LoVo

+1

Это следствие того, что дженерики являются инвариантными в Swift. [См. Этот вопрос и ответы для получения дополнительной информации] (http://stackoverflow.com/questions/37188580/why-isnt-somestruct-convertible-to-any). Хотя обратите внимание, что вы столкнулись с этой проблемой только с массивом структур, а не с классами. – Hamish

+0

@ originaluser2: Спасибо! Это тот ответ, который я искал. – ciauri

ответ

1

Это происходит, как и вы, let d на самом деле тип [Собака], и скорость довольно строгая относительно безопасности типа.

Это исправить это, вы можете сделать следующее:

let d: [CanJump] = [Dog()] 

Надеется, что это помогает

Смежные вопросы