我目前正在学习委托的工作方式,但是我无法理解为什么变量被初始化为类的类型而不被实例化。变量如何成为类的类型?为什么仅在实例化该类时为什么要这样做?
各种人:人!
答案 0 :(得分:1)
变量如何成为类的类型?为什么仅在实例化该类时为什么要这样做?
您显然可以只创建该类的实例:
var person = Person(...) // Note, class names generally begin with uppercase letter
但是请考虑以下事项:
var person: Person!
这意味着person
现在是可选的,可以引用Person
实例。并且!
表示当您在代码中引用此可选内容时,该可选内容将被隐式解包。
所以问题是,为什么要使用后者(尚未设置的隐式解引用)而不是前者(只需立即实例化Person
)。答案是通常在person
变量最初不能简单设置,而稍后再设置的情况下执行此操作。
一个常见的示例是“详细信息”视图控制器,它将向我们显示有关从先前视图控制器中选择的Person
对象的详细信息。如果此详细信息视图控制器是从例如故事板场景实例化的,则显然person
变量尚未设置,因此它必须是可选的。但是,在首先实例化场景的视图控制器之后,但在视图控制器出现在屏幕上之前,呈现的视图控制器(或协调器或任何其他控件)将设置person
参考。例如,我们可以在呈现视图控制器的person
方法中设置目标的prepare(for:sender:)
。
因此,在这种情况下,我们将声明person
为Optional(即使尚未设置person
,也可以实例化视图控制器),但将其声明为成为隐式解包的(Person!
),因为我们知道演示者将确保在详细信息视图控制器出现在屏幕上之前先设置person
。
答案 1 :(得分:0)
所引用的语句是不带初始化表达式的变量声明。正常格式为:
var variable name: type = expression
后跟类型的冒号是类型注释,而等号后的表达式是实际的初始化表达式。
var person: Person!
因此,我们在这里声明一个名为person的变量,并用一种Person类型进行注释,并且感叹号将其标记为隐式未包装的可选变量。
可能有几个原因可以声明变量(无论是类,结构还是其他类型)而无需初始化:
一个示例是使用在视图控制器类中声明的IBOutlet变量时。这些变量通常被声明为隐式展开的可选变量。首次创建视图控制器对象时,这些变量尚未初始化。但是,它们总是在调用viewDidLoad时设置。
另一个原因可能是,就应用程序逻辑而言,立即实例化变量没有任何意义。延迟初始化是这种情况的一种特殊情况,其中所涉及的变量会在需要它的第一点自动进行初始化。