变量怎么可能是类的一种类型?



我目前正在学习委托的工作方式,但是我不明白为什么变量被初始化为类的一种类型,而不是实例化。变量怎么可能是类的一种类型,当你可以实例化类时,为什么需要这样做?

VaR 人:人!

变量

如何成为类的类型,当您可以实例化类时,为什么有必要这样做?

显然,您可以只创建该类的实例:

var person = Person(...)   // Note, class names generally begin with uppercase letter

但请考虑以下几点:

var person: Person!

这意味着person现在是一个可选,可以引用Person实例。!指示当您在代码中引用此可选时,它将隐式解包。

所以问题是为什么要使用后者(尚未设置的隐式解包引用(而不是前者(只是立即实例化Person(。答案是,您通常在最初无法设置person变量但稍后会设置时执行此操作。

一个常见的例子是"详细信息"视图控制器,它将向我们显示有关从先前视图控制器中选择的Person对象的详细信息。如果此详细信息视图控制器是从情节提要场景实例化的,则显然尚未设置person变量,因此它必须是可选的。但是,呈现视图控制器(或协调器或其他任何对象(将在场景的视图控制器首次实例化之后,但在视图控制器出现在屏幕上之前设置person引用。例如,我们可以在呈现视图控制器的prepare(for:sender:)方法中设置目标的person

因此,在这种情况下,我们会将person声明为可选(因此可以实例化视图控制器,即使尚未设置person(,但将其声明为隐式解包(Person!(,因为我们知道演示者将确保在详细信息视图控制器出现在屏幕上之前设置person

引用的语句是没有初始值设定项表达式的变量声明。正常格式为:

var variable name: type = expression

冒号后跟 type 是类型批注,而等号后面的表达式是实际的初始化表达式。

var person: Person!

因此,这里我们声明了一个名为 person 的变量,用 Person 类型进行注释,感叹号将其标记为隐式解包的可选。

可能有几个原因可以解释为什么变量(无论是类、结构还是其他类型(可能在不被初始化的情况下被声明:

例如,使用在视图控制器类中声明的 IBOutlet 变量时。 这些变量通常声明为隐式解包的可选变量。 首次创建视图控制器对象时,尚未初始化这些变量。 但是,它们始终由调用 viewDidLoad 的时间设置。

另一个原因可能是,就应用程序逻辑而言,立即实例化变量是没有意义的。 延迟初始化是一种特例,其中所讨论的变量在需要的第一个点自动初始化。

最新更新