Как исправить ошибку: бинарный оператор '==' не может быть применен к операндам типа 'NSExpression.ExpressionType' и '_'

Я просматриваю старый код из Каталог HomeKit: создание домов, сопряжение и управление аксессуарами, а также настройка триггеров, когда столкнулся с выражением, которое говорит

.KeyPathExpressionType

Я не могу сказать, что

.

в

.KeyPathExpressionType

имеется в виду с левой стороны

.

Я ничего не нахожу, когда ищу в Google и stackпереполнение «KeyPathExpressionType». То же самое с

.ConstantValueExpressionType

Я ничего не нахожу.

Каждое из этих сравнений равенства

comparison.leftExpression.expressionType == .KeyPathExpressionType

а также

comparison.rightExpression.expressionType == .ConstantValueExpressionType

в приведенном ниже коде сгенерируйте сообщение об ошибке, в котором говорится:

Binary operator '==' cannot be applied to operands of type 'NSExpression.ExpressionType' and '_'

extension NSPredicate {

    /**
        Parses the predicate and attempts to generate a characteristic-value `HomeKitConditionType`.

        - returns:  An optional characteristic-value tuple.
    */
    private func characteristic() -> HomeKitConditionType? {
        guard let predicate = self as? NSCompoundPredicate else { return nil }
        guard let subpredicates = predicate.subpredicates as? [NSPredicate] else { return nil }
        guard subpredicates.count == 2 else { return nil }

        var characteristicPredicate: NSComparisonPredicate? = nil
        var valuePredicate: NSComparisonPredicate? = nil

        for subpredicate in subpredicates {
            if let comparison = subpredicate as? NSComparisonPredicate, comparison.leftExpression.expressionType == .KeyPathExpressionType && comparison.rightExpression.expressionType == .ConstantValueExpressionType {
                switch comparison.leftExpression.keyPath {
                    case HMCharacteristicKeyPath:
                        characteristicPredicate = comparison

                    case HMCharacteristicValueKeyPath:
                        valuePredicate = comparison

                    default:
                        break
                }
            }
        }

        if let characteristic = characteristicPredicate?.rightExpression.constantValue as? HMCharacteristic,
            characteristicValue = valuePredicate?.rightExpression.constantValue as? NSCopying {
                return .Characteristic(characteristic, characteristicValue)
        }
        return nil
    }

Я получаю ошибку, чтобы уйти, когда я заменяю

comparison.leftExpression.expressionType == .KeyPathExpressionType

с участием

comparison.leftExpression.expressionType.rawValue == NSExpression.ExpressionType.keyPath.rawValue

а также

comparison.rightExpression.expressionType == .ConstantValueExpressionType

с участием

comparison.rightExpression.expressionType.rawValue == NSExpression.ExpressionType.constantValue.rawValue

Это правильно? Может ли кто-нибудь сказать мне просветить меня по этой проблеме?

Не уверен, но кажется, что .KeyPathExpressionType — это старое имя .keyPath. Можете попробовать comparison.leftExpression.expressionType == .keyPath?

rraphael 22.05.2019 14:46

да. Это работает. На самом деле я набрал «NSExpression.ExpressionType.keyPath».

Daniel Brower 22.05.2019 14:54
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
313
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код является устаревшим кодом Swift 2.

Замените .KeyPathExpressionType на .keyPath и .ConstantValueExpressionType на .constantValue

Тип NSExpression.ExpressionType, читайте документация

Я использовал «NSExpression.ExpressionType.keyPath» и «NSExpression.ExpressionType.constantValue», и это работает. Спасибо.

Daniel Brower 22.05.2019 14:56

Вы можете опустить NSExpression.ExpressionType, компилятор определяет тип.

vadian 22.05.2019 14:56

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