Сравнение атрибута NSLayoutAttribute в swift 3

#swift #swift3

#swift #swift3

Вопрос:

Следующий код хорошо работал с swift 2, но он не работает с swift 3.

     let constraints: NSArray = contentView.constraints as NSArray
    let indexOfConstraint = constraints.indexOfObject (passingTest: { (constraint, idx, stop) in
        return (constraint.firstItem ).tag == bubbleTag amp;amp; (constraint.firstAttribute == NSLayoutAttribute.left || constraint.firstAttribute == NSLayoutAttribute.right)
    })
 

Я получаю следующую ошибку:

Двоичный оператор ‘==’ не может быть применен к операндам типа ‘_’ и ‘NSLayoutAttribute’

Я получаю эту ошибку для следующей строки:

 constraint.firstAttribute == NSLayoutAttribute.left
 

Как я могу это исправить?

Ответ №1:

Это сообщение об ошибке показывает только первую ошибку, которую может вызвать ваш код, и вам может потребоваться еще несколько исправлений для работы с ней.

Предполагая, что вы используете NSArray (или NSMutableArray ) для constraints , почему бы вам не объявить constraints as [NSLayoutAttribute] ?

С этим изменением вам может потребоваться исправить некоторые другие части, но код, получающий индекс, может быть написан следующим образом:

 let indexOfConstraint = constraints.index {constraint in
    return constraint.firstItem.tag == bubbleTag amp;amp; (constraint.firstAttribute == NSLayoutAttribute.left || constraint.firstAttribute == NSLayoutAttribute.right)
}
//indexOfConstraint becomes `Int?`, so you may need to use Optional binding
if let index = indexOfConstraint {
    //Do something for found case
} else {
    //Do something for not-found case
}
 

Если вы не можете изменить тип constraints глобально, вы можете поместить этот код в свой локальный блок кода непосредственно перед приведенным выше кодом.

 guard let constraints = constraints as? [NSLayoutConstraint] else {
    fatalError("something wrong with `constraints`")
}
 

Комментарии:

1. Пожалуйста, проверьте мою правку. Я поделился своей строкой констант. Также я нашел этот код в Интернете, поэтому я не знаю логики на самом деле.

2. @TolgayToklar как правило, вам, вероятно, следует попытаться понять код, прежде чем его внедрять…….

3. @TolgayToklar, предполагая, что ваш contentView является (подтипом) UIView , знаете ли вы constraints тип свойства [NSLayoutAttribute] ? Почему вы осмеливаетесь использовать его NSArray , и я рекомендую вам НЕ работать с ним?

Ответ №2:

Пожалуйста, проверьте обновленный код ниже:

 let constraints: NSArray = contentView.constraints as NSArray
let indexOfConstraint = constraints.indexOfObject (passingTest:){ ( constraint, idx, stop) in
     return ((constraint as AnyObject).firstItem as! UIView).tag == bubbleTag amp;amp; ((constraint as AnyObject).firstAttribute == NSLayoutAttribute.left || (constraint as AnyObject).firstAttribute == NSLayoutAttribute.right)
}