Swift初始化方法的使用介绍

 更新时间:2022年08月24日 09:57:05   作者:扑腾的蛾子  
Swift有着超级严格的初始化方法,不仅强化了designated初始化方法的地位,所有不加修饰的init方法都需要在方法中确保非Optional的实例变量被赋值初始化,下面这篇文章主要给大家介绍了关于Swift中初始化init的相关资料,需要的朋友可以参考下。

初始化

初始化器

1、类、结构体、枚举都可以定义初始化器

class Size {
    init(age: Int) {
    }
}
var s = Size(age: 10)

2、类有2种初始化器:指定初始化器(deaignated initializer)、便捷初始化器(convenience initializer)

class Size {
    //指定初始化器
    init(age: Int) {
    }
    //便捷初始化器
    convenience init(age: Int) {
    }
}

3、每个类至少有一个指定初始化器,指定初始化器是类的主要初始化器

4、默认初始化器总是类的指定初始化器

5、类偏向于少量指定初始化器,一个类通常只有一个指定初始化器

6、初始化器的相互调用规则,会更安全

指定初始化器必须从它的直系父类调用指定初始化器;

class Person {
    var age: Int
    init(age: Int) {
        self.age = age
    }
    convenience init() {
        self.init(age: 0)
    }
}
class Student: Person {
    var score: Int
    init(age: Int, score: Int) {
        self.score = score
        super.init(age: age)
    }
}

便捷初始化器必须从相同的类里调用另一个初始化器;

便捷初始化器最终必须调用一个指定初始化器;

class Size {
    var width: Int
    var height: Int
    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
    convenience init(width: Int) {
        self.init(width: width, height: 0)
    }
    convenience init(height: Int) {
        self.init(width: 0, height: height)
    }
    convenience init() {
        self.init(width: 0, height: 0)
    }
}
var s1 = Size(width: 10, height: 20)
var s2 = Size(width: 10)
var s3 = Size(height: 20)
var s4 = Size()

初始化器的相互调用

两段式初始化

1、Swift在编码安全方面是煞费苦心,为了保证初始化过程的安全,设定了两段式初始化、安全检查。

2、两段式初始化,第1阶段:初始化所有存储属性

  1. 外层调用指定\便捷初始化器
  2. 分配内存给实例,但未初始化
  3. 指定初始化器确保当前类定义的存储属性都初始化
  4. 指定初始化器调用父类的初始化器,不断向上调用,形成初始化器链

3、两段式初始化,第2阶段:设置新的存储属性值

从顶部初始化器往下,链中的每一个指定初始化器都有机会进一步定制实例

初始化器现在能够使用self(访问、修改它的属性,调用它的实例方法等等)

最终,链中任何便捷初始化器都有机会定制实例以及使用self

class Person {
    var age: Int
    init(age: Int) {
        self.age = age
        self.test()
    }
    func test() {
    }
}
class Student: Person {
    var score: Int
    init(age: Int, score: Int) {
        self.score = score
        super.init(age: age)
    }
    convenience init() {
        self.init(age: 0, score: 0)
    }
}

安全检查

1、指定初始化器必须保证在调用父类初始化器之前,其所在类定义的所有存储属性都要初始化完成

2、指定初始化器必须先调用父类初始化器,然后才能为继承的属性设置新值

3、便捷初始化器必须先调用同类中的其他初始化器,然后再为任意属性设置新值

4、初始化器在第1阶段初始化完成之前,不能调用任何实例方法,不能读取任何实例属性的值,也不能引用self

重写

1、当重写父类的指定初始化器时,必须加上override(即使子类的实现是便捷初始化器)

2、如果子类写了一个匹配父类便捷初始化器的初始化器,不用加上override

因为父类的便捷初始化器永远不会通过子类直接调用,因此,严格来说,子类无法无法重写

父类的便捷初始化器。

class Person {
    var age: Int
    init(age: Int) {
        self.age = age
    }
    convenience init() {
        self.init(age: 0)
    }
}
class Student: Person {
    var score: Int
    init(age: Int, score: Int) {
        self.score = score
        super.init(age: age)
    }
    init() {
        self.score = 0
        super.init(age: 0)
    }
}

自动继承

1、如果子类没有自定义任何指定初始化器,他会自动继承父类所有的指定初始化器

2、如果子类提供了父类所有指定初始化器的实现(要么通过方式1继承,要么重写)

子类会自动继承所有的父类便捷初始化器

3、就算子类添加了更多的便捷初始化器,这些规则仍然适用

class Person {
    var age: Int
    var name: String
    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
    init() {
        self.age = 0
        self.name = ""
    }
    convenience init(age: Int) {
        self.init(age: age, name: "")
    }
    convenience init(name: String) {
        self.init(age: 0, name: name)
    }
}
class Student: Person {
    var no: Int = 0
    convenience init(no: Int) {
        self.init()
    }
}

到此这篇关于Swift初始化方法的使用介绍的文章就介绍到这了,更多相关Swift初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • swift自定义表格控件(UITableView)

    swift自定义表格控件(UITableView)

    这篇文章主要为大家详细介绍了swift自定义表格控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Swift实现“或”操作符的3种方法示例

    Swift实现“或”操作符的3种方法示例

    这篇文章主要给大家介绍了关于Swift实现“或”操作符的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Swift中使用正则表达式的一些方法

    Swift中使用正则表达式的一些方法

    这篇文章主要介绍了Swift中使用正则表达式的一些方法,Swift语言对正则表达式的支持也在不断改进中,需要的朋友可以参考下
    2015-07-07
  • Swift学习教程之SQLite的基础使用

    Swift学习教程之SQLite的基础使用

    这篇文章主要给大家介绍了关于Swift学习教程之SQLite的基础使用,文中通过示例代码介绍的非常详细,对大家学习或者使用Swift SQLite具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Swift网络请求库Alamofire使用详解

    Swift网络请求库Alamofire使用详解

    这篇文章主要为大家详细介绍了Swift网络请求库Alamofire的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 详解Swift语言的while循环结构

    详解Swift语言的while循环结构

    这篇文章主要介绍了Swift语言的while循环结构,包括do...while循环的用法,需要的朋友可以参考下
    2015-11-11
  • swift4更新中所遇到的一些问题总结

    swift4更新中所遇到的一些问题总结

    这篇文章主要给大家介绍了关于在swift4更新中所遇到的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Swift心得笔记之运算符

    Swift心得笔记之运算符

    区别于 C 语言,在 Swift 中你可以对浮点数进行取余运算(%),Swift 还提供了 C 语言没有的表达两数之间的值的区间运算符,(a..b和a...b),这方便我们表达一个区间内的数值。
    2015-04-04
  • swift3.0键盘弹起遮挡输入框问题的解决方案

    swift3.0键盘弹起遮挡输入框问题的解决方案

    这篇文章主要介绍了swift3.0键盘弹起遮挡输入框问题的解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Swift hello world!Swift快速入门教程

    Swift hello world!Swift快速入门教程

    这篇文章主要介绍了Swift hello world!Swift快速入门教程,本文在快速了解Swift编程语言,需要的朋友可以参考下
    2014-07-07

最新评论