NSLayoutConstraint(item:, attribute:, relatedBy:, toItem:, attribute:, multiplier:, constant:)
имеет параметр item
с типом Any
:
public convenience init(item view1: Any, attribute attr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem view2: Any?, attribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat)
Но из сбоя вы можете понять, что параметр действительно может принимать только UIView
или UILayoutGuide
:
Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «NSLayoutConstraint для необязательного (UIView: 0x7fa0fbd06650; кадр = (0 0; 0 0); слой = CALayer: 0x60800003bb60): Каждый элемент ограничения должен быть экземпляром UIView или UILayoutGuide.'
Компилятор не может проверить тип item
во время компиляции. Определено принимать что угодно. Но в деталях реализации, которые нам недоступны, этот метод принимает только необязательные UIView
или UILayoutGuide
.
Поэтому просто добавьте оператор guard
:
let view: UIView? = UIView()
guard let view = view else { // Proceed only if unwrapped
fatalError()
}
let _ = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 44.0)
25.08.2016