Swift构造器

关键词:swift, 构造器, init, required

概述

  • 类、结构体或枚举类型,使用实例前的准备过程。
  • 可以自定义参数。
  • 可以在构造器里给常量属性赋值。
  • 可以在一个便利构造器里调用其他构造器。
  • 默认情况下,子类不会继承父类的构造器。但是当子类没有实现任何构造器时,会自动继承父类的所有构造器。

与OC不一样的地方:

  • swift的构造器没有返回值,它的作用是使实例在使用前完成正确的初始化。
  • swift的子类默认不会继承父类的构造器。

构造器在创建某个特定类型的新实例时被调用。以 init 命名。

//最简形式,一个无形参的实例方法。
init() {
    // 在此处执行构造过程
}

自定义构造过程

就是自定义init方法,自己随意加一些参数,传进构造器里。

init(name: String, size: Float) {
    print("这是在自定义构造器里:name:\(name) size:\(size)")
}

给常量属性赋值

class FileClass {
    let name: String
    init() {
        print("这里是在极简构造器里")
        //可以在构造器里给常量赋值
        self.name = "aa"
    }
}

指定构造器

  • 每个类必须至少有一个指定构造器。
  • 指定构造器会被自动继承。
  • 创建实例时构造过程会沿父类链往上进行。
init(parameters) {
    statements
}

便利构造器

  • 写法与指定构造器一样,加关键词convenience修饰。
  • 在便利构造器里必须调用同类中的其他构造器。
  • 便利构造器的最后,必须调用指定构造器。
convenience init(name: String, size: Float) {
    print("这是在自定义构造器里:name:\(name) size:\(size)")
    //可以在构造器里调用另一个构造器
    self.init(name: "zzz")
}

构造器的重写

重写指定构造器时,必须加override修饰。 重写便利构造器时,不需要加override修饰。 子类不能直接调用父类的便利构造器。确切的说,子类不能继承父类的便利构造器,不存在重写。

构造器的自动继承

默认情况下,子类不会继承父类的构造器。但是当子类没有实现任何构造器时,会自动继承父类的所有构造器。

class MovieFileClass: FileClass {
}

可失败构造器

用init?表示,返回一个自身类型的可选对象。 子类的可失败构造器也能向上代理到父类的可失败构造器。

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty {
            return nil
        }
        self.species = species
    }
}

必要构造器

添加 required 修饰,该类的所有子类都必须实现该构造器。

class SomeClass {
    required init() {
        // 构造器的实现代码
    }
}
//重写必要构造器时,不需要加override修饰。
class SomeSubclass: SomeClass {
    required init() {
        // 构造器的实现代码
    }
}

通过闭包或函数设置属性的默认值

闭包后面()的作用是,立即执行前面的闭包。

class SomeClass {
    let someProperty: SomeType = {
        // 在这个闭包中给 someProperty 创建一个默认值
        // someValue 必须和 SomeType 类型相同
        return someValue
    }()
}