Тип аргумента 'Int' не соответствует ожидаемому типу '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)
]
Есть еще одно решение, которое я получил из ответа. Пока это работает, мне все еще не ясно о проблеме и решении. Какую концепцию мне не хватает.
1 ответ
Как 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: полностью исключить неявные мостовые преобразования из Swift, это уже не так. Вам нужно сделать мост явным с помощью as
,