#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)
}