4

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

4

1 回答 1

6

由于ORKTextChoice的初始化程序有一个抽象参数类型 for value:,Swift 将回退将传递给它的整数文字解释为Int– 不符合NSCoding,NSCopyingNSObjectProtocol. 它是 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:完全消除来自 Swift 的隐式桥接转换,情况不再如此。您需要使用as.

于 2016-10-08T18:50:41.370 回答