博客> Swift: 初始化器 init 和 override init 的不同用法
Swift: 初始化器 init 和 override init 的不同用法
1小时前 评论:0 阅读:185 xiphap
ios xcode swift init override 不同 初始化器

Swift 版本: Swift 3 Xcode 版本: 8.2.1

预备知识:基类、超类(SuperClass)、子类(SubClass)

由于初始化涉及类的关系,因此在理解初始化之前,需先懂得基类、超类(SuperClass)和子类(Class)之间的关系点击访问

在 Swift 中,自定义类有几种方式:

  • 默认属性声明
    class A {
        /* 注释:在这里输入A类的属性内容 */
    }
    var x = A()    // 注释:实例化A类时,不需输入参数
  • 自定义属性声明
    class A {
        /* 注释:在这里输入A类的属性内容 */
        init(num : Int) {
            /* 注释:在这里输入A类的初始化属性内容 */
        }
    }
    var x = A(num : 8)    // 注释:实例化A类时,必须输入参数的名字、值(在这里名字是“num”、值是“8”)

由此可见,在类的属性声明时,初始化方法 init { } 或 init( ) { } 是在声明方法 class A { } 内声明的,是对自身属性的初始化方法。因此也有人把 init 叫做初始化器。

由于 Swift 中类的继承关系,以及子类可重写超类属性的特性,因此引入了 override 来表示初始化的是超类的属性,而不是初始化自己本身:

class A {
        /* 注释:在这里输入A类的属性内容 */
        var sum : Int

        // 注释:这里是初始化超类A本身
        init (a0 : Int) {
                /* 注释:在这里输入A类的初始化属性内容 */
                sum = 2 * a0
        }
}

// 注释:生成A类的子类B类
class B : A {
        /* 注释:在这里输入B类的自有属性内容 */
        var b1 : Int?

        // 注释:这里是重写A类的初始化器
        override init (a0 : Int) {    // 告诉编译器重写的初始化内容将限定在超类范围之内,同时定义了一个初始化参数
                /* 注释:在这里输入重写A类的属性内容 */
                super.init(a0 : a0)    // 将刚刚定义的初始化参数a0作为超类A的初始化参数
                sum = 6 * a0
                /* 注释:这里只能调用在A类中定义的参数,不能调用B类自定义的参数(如:b1) */
        }
}

let x = A(a0 : 6)
let y = B(a0 : 6)
print(x.sum,y.sum)    // 注释:输出“12 36”,在子类重写超类,只会影响字类自己,不会改动超类本身属性


Tips

如若要允许子类的新参数加入初始化,则直接使用 init 方法,对所有 init 进行重载:

class A {
    /* 注释:在这里输入A类的属性内容 */
    var sum : Int

    // 注释:这里是初始化超类A本身
    init (a0 : Int) {
        /* 注释:在这里输入A类的初始化属性内容 */
        sum = 2 * a0
    }
}
// 注释:以上为定义基类A,没有做任何改动

// 注释:生成A类的子类B类
class B : A {
    /* 注释:在这里输入B类的自有属性内容 */
    var b1 : Int?

    // 注释:这里是重载B类的初始化器
    init(a0 : Int, b0 : Int) {    // 告诉编译器重写的初始化内容将覆盖整个子类,同时定义了一个初始化参数
        /* 注释:在这里输入重载B类的属性内容 */
        super.init(a0 : a0)    // 将刚刚定义的初始化参数a0作为超类A的初始化参数
        sum = 8 * a0 + b0
    }
}

let x = A(a0 : 6)
let y = B(a0 : 6, b0 : 10)
print(x.sum,y.sum)    // 注释:输出“12 58”
收藏
0
sina weixin mail 回到顶部