参数类型 'Int' 不符合预期类型 'NSCoding & NSCopying & NSObjectProtocol'

Argument type 'Int' does not conform to expected type 'NSCoding & NSCopying & NSObjectProtocol'

我是 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 那里得到了另一个解决方案。虽然它有效,但我仍然不清楚问题和解决方案。我缺少的概念是什么。

由于 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.

显式设置桥接