2016-10-07 92 views
4

我是Swift的新手,正在嘗試一些教程來學習並在Swift上磨練我的知識。我偶然發現了這個我不明白的代碼中的錯誤。如果你們中的任何人有想法,請在此解釋最新情況。參數類型'Int'不符合期望的類型'NSCoding&NSCopying&NSObjectProtocol'

let textChoices = [ 
    ORKTextChoice(text: "Create a ResearchKit app", value:0), 
    ORKTextChoice(text: "Seek the Holy grail", value:1), 
    ORKTextChoice(text: "Find a shrubbery", value:2) 
] 

我決心通過建議由Xcode中提供的錯誤,現在我的代碼看起來像

let textChoices = [ 
    ORKTextChoice(text: "Create a ResearchKit app", value:0 as NSCoding & NSCopying & NSObjectProtocol), 
    ORKTextChoice(text: "Seek the Holy grail", value:1 as NSCoding & NSCopying & NSObjectProtocol), 
    ORKTextChoice(text: "Find a shrubbery", value:2 as NSCoding & NSCopying & NSObjectProtocol) 
] 

還有另一種解決方案,我從answer了。雖然它有效,但我仍然不清楚問題和解決方案。我錯過了什麼概念。

回答

5

作爲ORKTextChoice的初始化劑有一個抽象參數類型value:,SWIFT將回退到上解釋傳遞給它的Int整數常量 - 它不符合NSCodingNSCopyingNSObjectProtocol。它是Objective-C的對象,NSNumber,但是。

雖然,而不是鑄造NSCoding & NSCopying & NSObjectProtocol,這將導致橋樑NSNumber(雖然是間接的和不明確的),你可以簡單地直接這座橋:

let textChoices = [ 
    ORKTextChoice(text: "Create a ResearchKit app", value: 0 as NSNumber), 
    ORKTextChoice(text: "Seek the Holy grail", value: 1 as NSNumber), 
    ORKTextChoice(text: "Find a shrubbery", value: 2 as NSNumber) 
] 

你原來的代碼會工作在Swift 3之前,因爲Swift類型能夠隱式地連接到它們的Objective-C對應物。但是,根據SE-0072: Fully eliminate implicit bridging conversions from Swift,這不再是這種情況。你需要用as來明確橋樑。

相關問題