参数类型' Int'不符合预期的类型&#NS; NSCoding& NSCopying& NSObjectProtocol'

时间:2016-10-07 10:31:24

标签: swift researchkit

我是Swift的新手,正在尝试一些教程来学习和完善我对Swift的知识。我在这段代码中偶然发现了上述错误,我对此并不了解。如果您有任何想法,请在此解释错误。

    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获得了另一种解决方案。虽然它有效,但我仍然不清楚问题和解决方案。我错过了什么概念。

1 个答案:

答案 0 :(得分:6)

由于ORKTextChoice的初始化程序具有value:的抽象参数类型,因此Swift将在解释传递给它的整数文字时回退为Int - 这与{{1}不一致},NSCodingNSCopying。它是Objective-C对应物NSObjectProtocol,但是确实如此。

虽然,而不是转向NSNumber,这会导致与NSCoding & NSCopying & NSObjectProtocol的桥梁(虽然是间接的和不明确的桥梁),但您可以直接建立这座桥梁:

NSNumber

你的原始代码在Swift 3之前会有效,因为Swift类型可以隐式桥接到它们的Objective-C对应物。但是,根据SE-0072: Fully eliminate implicit bridging conversions from Swift,情况已不再如此。您需要使用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) ] 明确显示网桥。