我是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获得了另一种解决方案。虽然它有效,但我仍然不清楚问题和解决方案。我错过了什么概念。
答案 0 :(得分:6)
由于ORKTextChoice
的初始化程序具有value:
的抽象参数类型,因此Swift将在解释传递给它的整数文字时回退为Int
- 这与{{1}不一致},NSCoding
或NSCopying
。它是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)
]
明确显示网桥。