iOS开发Swift

Swift中的@IBOutlet用 var 及 Optional 定义的原因

熟悉IOS的朋友们一定很熟悉@IBOutlet了,它是链接到界面元素(storyBoard 或 xib)的一个变量。

通常用以下代码表示:

@IBOutlet weak var label: UILabel!

但是为什么要用 var 和 Optional 来声明 @IBOutlet 呢?

我们来做个试验,先将var替换成let:

发生两个错误:

  • ViewController 缺少初始化方法,
  • @IBOutlet 标识的属性必须是可变的。

接着用 UILabel! 替换 UILabel:

发生两个错误:

  • ViewController 缺少初始化方法,
  • @IBOutlet 不能声明为非 Optional 类型。

这是为什么呢?

Swift 官方文档中对 initializer 有如下解释:

“Initialization involves setting an initial value for each stored property on that instance and performing any other setup or initialization that is required before the new instance is ready for use.”

意思是,在类的新实例可用之前必须执行构造过程,这个过程包括设置实例中每个存储属性的初始值并执行其它必须的设置或初始化工作。即类的每个属性包括@IBOutlet,在 init() 阶段都必须被赋值。

由于 @IBOutlet 对应的界面元素在 loadView() 才会被加载,而 loadView() 又是在 init() 之后才会被执行的,所以在 init 阶段,@IBOutlet还未被初始化,即使 @IBOutlet 在初始化完成之后其指针指向的对象不会再改变,但是,相对而言它还是一个变量。所以需要用 var 声明。

既然 @IBOutlet在 loadView() 时才会被加载,那么它在 init 阶段的值就为 nil ,而 UILabel 不能够被 nil 赋值,因此我们需要选择定义它为 Optional。Optional 能够允许变量在 init() 阶段为 nil,loadView() 时再完成初始化。