欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

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

来源: 开发者 投稿于  被查看 6276 次 评论:206

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


目录
  • 初始化器
    • required
    • 属性观察器
    • 可失败初始化器
    • 反初始化器(deinit)
  • 可选链(Optional Chaining)

    初始化器

    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初始化器与可选链内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Swift中类与结构的初始化示例解析
    • Swift中初始化init的方法小结
    • Swift编程中的初始化与反初始化完全讲解
    • Swift中初始化方法的顺序介绍
    • Swift初始化方法的使用介绍

    用户评论