Бинарный оператор '<^>' нельзя применять к операндам типа

У меня есть следующий код, реализованный для работы с фреймворком 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

Другие вопросы по тегам