返回

「iOS 面试之道」勘误(二)

IOS

Swift 初始化方法的真相

Swift 是一种强大的编程语言,它提供了许多特性来帮助开发者编写出健壮、高效的代码。其中,初始化方法就是 Swift 中非常重要的一个概念。

在 Swift 中,每一个类都可以定义多个初始化方法,这些方法可以用来创建该类的实例。初始化方法可以接收不同的参数,这些参数可以用来指定实例的初始状态。

在「iOS 面试之道」一书中,作者提到了一个关于 Swift 初始化方法的错误说法:

Swift 初始化方法必须保证所有非 Optional 的成员变量都完成初始化。

这个说法是不严谨的。事实上,Swift 初始化方法并不需要保证所有非 Optional 的成员变量都完成初始化。

stored property 与 computed property

为了理解为什么 Swift 初始化方法不需要保证所有非 Optional 的成员变量都完成初始化,我们需要了解 Swift 中的两个概念:stored property 和 computed property。

  • stored property:存储型属性,它会在内存中开辟一块空间来存储数据。
  • computed property:计算型属性,它不会在内存中开辟一块空间来存储数据,而是通过计算来获取数据。

在 Swift 中,所有的成员变量都可以分为 stored property 和 computed property。如果一个成员变量是 stored property,那么它必须在初始化方法中完成初始化。但是,如果一个成员变量是 computed property,那么它不需要在初始化方法中完成初始化。

示例

下面是一个简单的示例,演示了如何在 Swift 中定义一个 stored property 和一个 computed property:

class Person {
    var name: String // stored property
    var age: Int { // computed property
        return 2023 - birthYear
    }

    var birthYear: Int // stored property
}

在上面的示例中,namebirthYear 都是 stored property,而 age 是一个 computed property。namebirthYear 需要在初始化方法中完成初始化,而 age 不需要在初始化方法中完成初始化。

结论

综上所述,Swift 初始化方法并不需要保证所有非 Optional 的成员变量都完成初始化。只有 stored property 需要在初始化方法中完成初始化,而 computed property 不需要在初始化方法中完成初始化。