为什么不能在Swift中为@IBOutlet分配let而不是var?

Cos*_*ows 13 xcode ios swift

我正在关注Swift的教程,我注意到作者使用var而不是let在声明@IBOutlet变量时.所以我很好奇为什么我不能使用,let因为即使对象是常量,对象的属性仍然是可变的,或者不是这样的情况?

错误使用时,Xcode中显示let

@IBOutlet 属性要求属性是可变的

但我很困惑,因为它questionLabel是一个UILabel对象,不一定是对象的属性.或者questionLabel对象是当前viewController的属性?

import UIKit

class ViewController: UIViewController {

    @IBOutlet let questionLabel: UILabel!

}
Run Code Online (Sandbox Code Playgroud)

如果我过度分析,请提前感谢您.

luk*_*302 17

@IBOulet标记的性质通常是正在使用该界面生成器相连接的视图控制器的性能.您在界面构建器中创建的视图必须在实际应用程序运行时期间将其中的界面元素实际连接到属性.

出于这个原因,它首先使用一些 init不连接任何接口元素的新ViewController创建.它们仅在稍后阶段连接.为了使运行时能够在对象创建完成后将属性挂钩到视图元素,它们不能是常量,它们必须是可变的.因为初始化程序完成后它们没有值,所以它们必须是可选项.并且不使使用繁琐的属性事后却隐含展开自选,这样你就不必写label!.property,但label.property就足够了.

这就是为什么你的代码一旦尝试对IBOutlet你未能连接的变量做一些事情就会崩溃的原因,这也是你不能在初始化程序中使用/更改/操作这些字段的原因.

关于你的实际var/ let混乱.是的,let可以更改使用的对象本身,例如text,UILabel但是不能更改实际对象引用.这意味着如果你没有在初始化程序中给常量一个特定值,它将永远保留nil.


Sul*_*han 7

原因很简单,它不是在初始化期间(在initXXX方法中)分配,而是在以后加载视图时分配.

编译器实际上甚至无法确定是否已分配变量,因为视图加载是完全动态的.


Dun*_*n C 5

在swift中,所有vars和let都可以被认为是属性.

如果声明了属性,则属性是不可变的(常量)let.如果使用var关键字声明它是可变的(变量).这是和之间明确差异.letvar

出口必须是可变的,因为它们的值在初始化对象之后才会被设置.(视图控制器被初始化,它的出口不会立即加载.)