UIViewController子视图属性应该是隐式解包的选项吗?

时间:2015-02-15 19:47:58

标签: swift uiviewcontroller properties subview optional

我们假设我正在创建名为UIViewController的{​​{1}}自定义子类。

我想以编程方式向其添加属性ViewController

我应该var textField: UITextField!隐式展开的可选项并在textField初始化它吗?

2 个答案:

答案 0 :(得分:0)

不,尽可能避免隐式解包的选项。您应该使用隐式展开的选项的唯一时间是在视图控制器初始化期间不能进行初始化。这在以下情况下很常见:

  1. 它们是您在笔尖/故事板文件中连接的出口
  2. 它们依赖于从nib / storyboard
  3. 加载的其他对象

    当您使用隐式展开的选项时,您将失去Swift添加的某些保护。最重要的是,在使用之前,您将失去编译器强制初始化属性。

答案 1 :(得分:0)

  1. 您应该在loadView初始化它,而不是viewDidLoad:
  2. 您可以使用lazy变量来避免子视图的选项,同时有效地将初始化推迟到loadView,或者在调用loadView之前引用属性时,这会将我们带到:< / LI>
  3. 在所有情况下,我认为隐式展开的选项(并强制解包)是代码气味。在调用loadView之前,完全可以访问其中一个,因此它们应该是真正的选项。类型和空安全性重要
  4. 声明一个这样的惰性变量:

    private(set) lazy var imageView = UIImageView(...)
    

    作为第三点的简单参考:

    let imageViewController = ImageViewController()
    imageViewController.imageView.image = ...
    

    如果隐式展开imageView而不是延迟非可选,则会崩溃。