参数类型 '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
– 这确实不符合 NSCoding
、NSCopying
或 NSObjectProtocol
。它是 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
.
显式设置桥接
我是 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
– 这确实不符合 NSCoding
、NSCopying
或 NSObjectProtocol
。它是 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
.