Swift 构造函数的 `init` 关键字后面添加问号 `?`

5 min read
open class UIViewController : UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment {

    public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)

    public init?(coder: NSCoder)

在 Swift 中,构造函数通常以init开头。

如果在构造函数的 init 关键字后面添加问号 ?,这意味着这个构造函数可以返回 nil。这个特性常用于创建可选类型的实例。

例如,如果我们定义了一个名为 Person 的类,并且希望这个类可以通过一个构造函数来初始化,那么我们可以使用一个可选构造函数来初始化类,

class Person {
    let name: String
    let age: Int

    init?(name: String, age: Int) {
        if age < 0 {
            return nil
        }

        self.name = name
        self.age = age
    }
}

意味着在构造函数内部有可能发生错误,导致构造失败,这时候构造函数会返回一个可选值(Optional)。