initialization - Swift 中 expression.init() 有什么用

标签 initialization swift

Swift 编程语言指南,语言引用页 -> Expressions , Postfix Expressions -> Initializer Expression 部分讨论了语法

<expression>.init(<initializer arguments>)

你什么时候使用它(除了 self.init()super.init() 已经在语法的其他部分涵盖)?在我看来,在上述表达式有效的任何情况下(并且表达式不是 selfsuper),您还可以:

<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/

相关文章:

c++ - 这种类似列表的初始化是如何工作的?

ios - 如何在没有 UIDocumentPickerViewController 的情况下访问所有 iCloud 驱动器文件(应用程序容器外部)?

swift - 将多行的 heightForRowAt indexPath 设置为 0

ios - swift4 中的 UITextfield 验证 - 动态单元格

Swift:XCTest 会修改状态吗?测试可以返回可选值的函数的约定是什么?

ios - 如何从 AVCaptureSession captureStillImageAsynchronouslyFromConnection 中删除屏幕 "flash"效果

ios - 应用程序第一次启动时 NSUserDefaults 键初始化

c++ - 声明时新的 C++11 成员初始化功能是否使初始化列表过时?

c++ - 成员变量驻留在哪个内存段?

python - __init__,继承和可变参数