2016-05-13 69 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 = [狗()作爲CanJump]工作A S以及 – LoVo

+1

這是一個事實,即仿製藥在斯威夫特不變的結果。 [查看此問答以獲取更多信息](http://stackoverflow.com/questions/37188580/why-isnt-somestruct-convertible-to-any)。儘管請注意,您只會遇到一個結構數組而不是類的問題。 – Hamish

+0

@ originaluser2:謝謝!這是我正在尋找的答案。 – ciauri

回答

1

這發生在你身上let d實際上是[Dog]的類型,而Swift對類型安全性相當嚴格。

這解決這個問題,你可以做到以下幾點:

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

希望這有助於

相關問題