Бинарный оператор '<^>' нельзя применять к операндам типа
У меня есть следующий код, реализованный для работы с фреймворком Argo, который работал до обновления Xcode 11.2.1. когда я обновил свою версию Xcode, появляется следующая ошибка:
Двоичный оператор '<^>' не может применяться к операндам типа '(()) -> VoiceMailNumberResponse' и 'Decoded<_?>'
Вот мой код:
struct VoiceMailNumberResponse{
var name: String?
var value: String?
}
extension VoiceMailNumberResponse: Argo.Decodable {
static func decode(_ json: JSON) -> Decoded<VoiceMailNumberResponse> {
let voiceMailNumberResponse = curry(VoiceMailNumberResponse.init)
return voiceMailNumberResponse
<^> json <|? "name"
<*> json <|? "value"
}
}
Ошибка появляется в строке: "<^> json <|? "name"
Вдобавок я использую Арго, Карри и Руны для разбора JSON.
1 ответ
Примечание. Этот ответ основан только на вашем примере кода и не был протестирован.
Поскольку оба свойства VoiceMailNumberResponse
являются необязательными, тогда Xcode 10.1/Swift 4.2 (версия, с которой тестировалась) производит два init
методы:
init()
init(name: String?, value: String?)
Если ни одно, либо только одно свойство не является обязательным, только второе init
производится. Из вопроса кажется, что Xcode 11.2.1/Swift 5.1 ведет себя одинаково.
Тип сообщения об ошибке:
(()) -> VoiceMailNumberResponse
указывает, что компилятор выбрал init()
перейти к curry
, в то время как код ожидает init(name: String?, value: String?)
быть переданным.
Поскольку код, по-видимому, работал с некоторыми предыдущими Xcode/Swift, это могло бы показаться изменением поведения.
Это может быть изменение или "особенность" языка и / или компилятора. Вероятно, вы можете обойти это, явно указав, какойinit
использовать, включая имена параметров, например, что-то вроде:
...
let voiceMailNumberResponse = curry(VoiceMailNumberResponse.init(name:value:))
...
Тем не менее, было бы лучше выяснить, если:
это изменение языка / компилятора, и поэтому может потребоваться обновление Argo, Curry и Runes, о котором вы должны сообщить (история версий показывает, что ранее были устранены двусмысленности);
"функция", и в этом случае вам следует перейти на сайт feedbackassistant.apple.com и отправить отчет об ошибке; или
что-то другое
Вы также можете использовать SwiftDecodable
, представленный в Xcode 9, для декодирования JSON в качестве альтернативы использованию этих сторонних пакетов.
HTH