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のイニシャライザには の抽象パラメータ型があるため、Swift はそれvalue:に渡された整数リテラルを-またはにInt準拠しないものとして解釈することにフォールバックします。これは Objective-C の対応物ですが、そうです。NSCodingNSCopyingNSObjectProtocolNSNumber

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 に答える