Swift初始化器与可选链的使用方法介绍

 更新时间:2022年08月24日 09:25:02   作者:扑腾的蛾子  
初始化器初始化是准备类、结构或枚举的实例以供使用的过程。此过程涉及为该实例上的每个存储属性设置初始值,并执行在新实例准备就绪可供使用之前所需的任何其他设置或初始化,可选链是一种可以请求和调用属性、方法和子脚本的过程,用于请求或调用的目标可能为nil

初始化器

required

用required修饰指定初始化器,表明其所有子类都必须实现该初始化器(通过继承或者重写实现)

如果子类重写了required初始化器,也必须加上required,不用加上override

class Person {
    required init() {}
    init(age: Int) {}
}
class Student: Person {
    init(no: Int) {
        super.init(age: 0)
    }
    required init() {
        super.init()
    }
}

属性观察器

父类的属性在它自己的初始化器中赋值不会触发属性观察器,但在子类的初始化器中赋值会触发属性观察器

class Person {
    var age: Int {
        willSet {
            print("willSet", newValue)
        }
        didSet {
            print("didSet", oldValue, age)
        }
    }
    init() {
        self.age = 0
    }
}
class Student: Person {
    override init() {
        super.init()
        self.age = 1
    }
}

可失败初始化器

类、结构体、枚举都可以使用init?定义可失败初始化器

class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
}

不允许同时定义参数标签、参数个数、参数类型相同的可失败初始化器和非可失败初始化器

可以用init!定义隐式解包的可失败初始化器

可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包

class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
    convenience init() {
        self.init(name: "")!
    }
}

如果初始化器调用一个可失败初始化器导致初始化失败,那么整个初始化过程都失败,并且之后的代码都停止执行

可以用一个非可失败初始化器重写一个可失败初始化器,但反过来是不行的。

反初始化器(deinit)

deinit叫做反初始化器,类似于C++的析构函数、OC中的dealloc方法

当类的实例对象被释放内存时,就会调用实例对象的deinit方法

class Person {
    deinit {
        print("Person对象销毁了")
    }
}

deinit不接受任何参数,不能写小括号,不能自行调用

父类的deinit能被子类继承

子类的deinit实现执行完毕后会调用父类的deinit

可选链(Optional Chaining)

class Car {
    var price = 0
}
class Dog {
    var weight = 0
}
class Person {
    var name: String = ""
    var dog: Dog = Dog()
    var car: Car? = Car()
    func age() -> Int {
        18
    }
    func eat() {
        print("Person eat")
    }
    subscript(index: Int) -> Int {
        return index
    }
}
var person: Person? = Person()
var age = person?.age()//Int? Optional(18)
var age1 = person!.age() // Int
var name = person?.name //String?
var index = person?[6] // Int?

如果可选项为nil,调用方法、下标、属性失败,结果为nil

如果可选项不为nil,调用方法、下标、属性成功,结果会被包装成可选项

如果结果本来就是可选项,不会进行再次包装

判断方法有没有调用成功:

if let age = person?.age() { // ()?
    print("调用age成功", age)
} else {
    print("调用age失败")
}

形成可选链:

多个?可以链接在一起

如果链中任何一个节点是nil,那么整个链就会调用失败,可选链应用的地方还是很多的,在OC里面我们通常会加很多判断以避免崩溃,在Swift里面,因为有了可选链会减少很多我们自己的判断,提高了安全性。

var dog = person?.dog // Dog?
var weight = person?.dog.weight // Int?
var price = person?.car?.price // Int?
var scores = [
    "Jack" : [86, 82, 84],
    "Rose" : [79, 94, 81]
]
scores["Jack"]?[0] = 100
scores["Rose"]?[2] += 10
scores["Kate"]?[0] = 88
var num1: Int? = 5
num1? = 10 // Optional(10)
var num2: Int? = nil
num2? = 10 // nil
var dict: [String : (Int, Int) -> Int] = [
    "sum" : (+), //两个Int类型相加,返回一个Int类型
    "difference" : (-)
]
var result = dict["sum"]?(10, 20) // Optional(30), Int?

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

相关文章

  • Swift流程控制之循环语句和判断语句详解

    Swift流程控制之循环语句和判断语句详解

    这篇文章主要介绍了Swift流程控制之循环语句和判断语句详解,文中还使用了一个游戏例子来讲解循环语句和判断语句的使用,需要的朋友可以参考下
    2014-07-07
  • Swift 3.1聊天界面键盘效果的实现详解

    Swift 3.1聊天界面键盘效果的实现详解

    这篇文章主要给大家介绍了Swift 3.1聊天界面键盘效果实现的相关资料,文中介绍的非常详细,相信对大家的学习或者工作具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • Swift编程中实现希尔排序算法的代码实例

    Swift编程中实现希尔排序算法的代码实例

    希尔排序是对插入排序的一种改进版本,算法本身并不稳定,存在优化空间,这里我们来讲一下希尔排序的大体思路及Swift编程中实现希尔排序算法的代码实例
    2016-07-07
  • 分析Swift性能高效的原因

    分析Swift性能高效的原因

    绝大多数公司选择Swift语言开发iOS应用,主要原因是因为Swift相比Objc有更快的运行效率,更加安全的类型检测,更多现代语言的特性提升开发效率;这一系列的优点使Swift语言的热度越来越高。
    2020-10-10
  • 利用Swift实现一个响应式编程库

    利用Swift实现一个响应式编程库

    最近在学习swift,最近有空所以总结一下最近学习的内容,下面这篇文章主要给大家介绍了关于利用Swift实现一个响应式编程库的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • R.swift的使用与安装教程

    R.swift的使用与安装教程

    这篇文章主要给大家介绍了关于R.swift使用与安装的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Swift 3.0基础学习之下标

    Swift 3.0基础学习之下标

    这篇文章主要介绍了Swift 3.0基础学习之下标的相关资料,文中介绍的非常详细,对大家学习或者使用swift具有一定的参考价值,需要的朋友下面来一起看看吧。
    2017-03-03
  • Swift中defer的正确使用方法

    Swift中defer的正确使用方法

    准备把 swift 文档再扫一遍,发现了defer这个关键字,所以下面这篇文章主要给大家介绍了关于Swift中defer的正确使用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-11-11
  • swift实现自动轮播图效果(UIScrollView+UIPageControl+Timer)

    swift实现自动轮播图效果(UIScrollView+UIPageControl+Timer)

    这篇文章主要为大家详细介绍了swift实现自动轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Swift4.1转场动画实现侧滑抽屉效果

    Swift4.1转场动画实现侧滑抽屉效果

    这篇文章主要为大家详细介绍了Swift4.1转场动画实现侧滑抽屉效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论