为什么在Swift中,@IBOutlet不能用let来赋值,而必须用var?

15 浏览
0 Comments

为什么在Swift中,@IBOutlet不能用let来赋值,而必须用var?

我正在跟随一个关于Swift的教程,并注意到作者在声明一个@IBOutlet变量时使用var而不是let。因此,我很好奇为什么我不能使用let,因为对象的属性即使对象是常量也是可变的,或者这不是这种情况吗?

当使用let时,Xcode显示的错误是

@IBOutlet属性要求属性可变

但我感到困惑,因为questionLabel是一个UILabel对象,而不一定是一个对象的属性。或者questionLabel对象是当前视图控制器的属性吗?

import UIKit

class ViewController: UIViewController {

@IBOutlet let questionLabel: UILabel!

}

如果我过于深入分析,提前谢谢您。

0
0 Comments

在Swift中,为什么一个@IBOutlet不能被赋值为let而必须是var?

简单来说,这是因为@IBOutlet在初始化过程中(在initXXX方法中)并没有被赋值,而是在视图加载时才被赋值。

编译器实际上无法确定变量是否被赋值,因为视图加载是完全动态的过程。

那么,有没有解决办法呢?

实际上,我们可以通过使用弱引用(weak)来解决这个问题。在Swift中,我们可以使用weak关键字来修饰@IBOutlet变量,这样它就可以被声明为let而不是var。

示例代码如下:

@IBOutlet weak var titleLabel: UILabel!

通过使用weak关键字,我们告诉编译器这是一个弱引用,它不会增加引用计数,也就避免了循环引用的问题。

总结起来,@IBOutlet不能被赋值为let而必须是var的原因是因为它在初始化过程中并没有被赋值,而是在视图加载时才被赋值。解决办法是使用weak关键字将@IBOutlet声明为弱引用。

0
0 Comments

在Swift中,所有的变量和常量都可以被看作是属性。如果使用let关键字声明,属性就是不可变的(常量)。如果使用var关键字声明,属性就是可变的(变量)。这是letvar之间的区别。

Outlet必须是可变的,因为它们的值直到对象初始化之后才被设置。(视图控制器在初始化时,其outlet并不会立即加载。)

你通常不需要为视图控制器子类创建自定义初始化器。由于IBOutlet属性被声明为可选类型,它们可以保持为nil,直到视图加载完成。

0
0 Comments

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

@IBOutlet被标记的属性通常是ViewController的属性,这些属性是使用界面生成器连接的。在界面生成器中创建的视图必须在实际的应用程序运行时将界面元素连接到属性。

因此,它首先使用某个init创建一个不连接任何界面元素的新ViewController。它们只会在稍后的阶段连接。为了使运行时能够在对象创建完成后将属性连接到视图元素,它们不能是常量,它们必须是可变的。因为在初始化程序完成后它们没有值,所以它们必须是可选的。为了在之后使用属性时不显得麻烦,它们被隐式地解包成可选值,这样你就不必写label!.property,而是label.property就足够了。

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

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

0