Swift 编程语言指南,语言引用页 -> Expressions , Postfix Expressions -> Initializer Expression 部分讨论了语法
<expression>.init(<initializer arguments>)
你什么时候使用它(除了 self.init()
和 super.init()
已经在语法的其他部分涵盖)?在我看来,在上述表达式有效的任何情况下(并且表达式不是 self
或 super
),您还可以:
<expression>(<initializer arguments>)
最佳答案
虽然语法模板看起来像这样:
<expression>.init(<initializer arguments>)
语法只是定义了一个initializer-expression作为:
initializer-expression → postfix-expression . init
请注意,不包括调用参数。这匹配像 A.init
这样的结构,并且是必需的,因为 init
是一个关键字,所以 A.init
不会匹配 explicit-member-expression (这需要标识符而不是关键字作为成员名称)。
初始化器表达式是语法的一部分,因为您可以调用属于不是您正在编写的类的直接父类(super class)的类的初始化器(C
调用 A.init
在这个例子中):
class A {
var property: String
init() {
property = "hello"
}
}
class B: A {
init() {
super.init()
property = "goodbye"
}
}
class C: B {
init() {
super.init()
A.init()
}
}
C().property // "hello"
我不认为这有很多用例,但语法和编译器都允许这样做,并且这个示例可以正确编译和运行。
您还可以像使用普通初始化器一样在全局范围内使用初始化器表达式。下面两行是等价的:
String(10)
String.init(10)
关于initialization - Swift 中 expression.init() 有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102244/