Я просматриваю старый код из Каталог 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
Это правильно? Может ли кто-нибудь сказать мне просветить меня по этой проблеме?
да. Это работает. На самом деле я набрал «NSExpression.ExpressionType.keyPath».
Код является устаревшим кодом Swift 2.
Замените .KeyPathExpressionType
на .keyPath
и .ConstantValueExpressionType
на .constantValue
Тип NSExpression.ExpressionType
, читайте документация
Я использовал «NSExpression.ExpressionType.keyPath» и «NSExpression.ExpressionType.constantValue», и это работает. Спасибо.
Вы можете опустить NSExpression.ExpressionType
, компилятор определяет тип.
Не уверен, но кажется, что
.KeyPathExpressionType
— это старое имя.keyPath
. Можете попробоватьcomparison.leftExpression.expressionType == .keyPath
?