2016-10-07 3 views
4

Я новичок в Swift и пытался изучить некоторые уроки, чтобы изучить и отполировать мои знания в Swift. Я наткнулся на ошибку выше в этом коде, который я не понял. В случае, если у кого-то из вас есть идея, пожалуйста, объясните, что здесь не так.Тип аргумента 'Int' не соответствует ожидаемому типу 'NSCoding & NSCopying & NSObjectProtocol'

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. Хотя он работает, я до сих пор не совсем понимаю проблему и решение. Какая концепция отсутствует.

ответ

5

Как инициализатор ORKTextChoice «s имеет абстрактный тип параметра для 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.