为什么UIKit不喜欢Swift 3选项?

时间:2016-08-25 01:27:41

标签: ios swift uikit optional

以下 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或更低版本

进行编译

2 个答案:

答案 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的类型。它被定义为接受任何东西。但是在我们无法访问的实现细节中,该方法仅接受非可选itemUIView s。

所以只需添加一个UILayoutGuide语句:

guard

答案 1 :(得分:3)

崩溃的原因是UIViewUIView?是完全不同的类型。 UIView Objective-C类,而UIView? Swift枚举,可以包含UIView。相反,在Objective-C nullable只是编译器的提示。