Как исправить ошибку: бинарный оператор '==' не может быть применен к операндам типа '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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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