以下 Swift 3 代码崩溃。通过删除显式可选类型或强制解包view
,可以轻松解决崩溃问题。任何人都可以解释为什么这个代码崩溃了?
let view: UIView? = UIView() // note the explicit *optional* type
_ = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 44.0)
注意:它不会使用Swift 2.3或更低版本
进行编译答案 0 :(得分:4)
NSLayoutConstraint(item:, attribute:, relatedBy:, toItem:, attribute:, multiplier:, constant:)
的{{1}}参数类型为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
:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'NSLayoutConstraint for Optional(UIView:0x7fa0fbd06650; frame =(0 0; 0 0); layer = CALayer:0x60800003bb60):约束项必须各自为UIView的实例,或UILayoutGuide 。'
编译器在编译期间无法检查UILayoutGuide
的类型。它被定义为接受任何东西。但是在我们无法访问的实现细节中,该方法仅接受非可选item
或UIView
s。
所以只需添加一个UILayoutGuide
语句:
guard
答案 1 :(得分:3)
崩溃的原因是UIView
和UIView?
是完全不同的类型。 UIView
是 Objective-C类,而UIView?
是 Swift枚举,可以包含UIView
。相反,在Objective-C nullable
只是编译器的提示。