喷子的自我修养 發表於 2022-8-24 09:25:02

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>初始化器</li><ul class="second_class_ul"><li>required</li><li>属性观察器</li><li>可失败初始化器</li><li>反初始化器(deinit)</li></ul><li>可选链(Optional Chaining)</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>初始化器</h2>
<p class="maodian"></p><h3>required</h3>
<p>用required修饰指定初始化器,表明其所有子类都必须实现该初始化器(通过继承或者重写实现)</p>
<p>如果子类重写了required初始化器,也必须加上required,不用加上override</p>
<div class="jb51code"><pre class="brush:java;">class Person {
    required init() {}
    init(age: Int) {}
}
class Student: Person {
    init(no: Int) {
      super.init(age: 0)
    }
    required init() {
      super.init()
    }
}</pre></div>
<p class="maodian"></p><h3>属性观察器</h3>
<p>父类的属性在它自己的初始化器中赋值不会触发属性观察器,但在子类的初始化器中赋值会触发属性观察器</p>
<div class="jb51code"><pre class="brush:java;">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
    }
}</pre></div>
<p class="maodian"></p><h3>可失败初始化器</h3>
<p>类、结构体、枚举都可以使用init?定义可失败初始化器</p>
<div class="jb51code"><pre class="brush:java;">class Person {
    var name: String
    init?(name: String) {
      if name.isEmpty {
            return nil
      }
      self.name = name
    }
}</pre></div>
<p>不允许同时定义参数标签、参数个数、参数类型相同的可失败初始化器和非可失败初始化器</p>
<p>可以用init!定义隐式解包的可失败初始化器</p>
<p>可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包</p>
<div class="jb51code"><pre class="brush:java;">class Person {
    var name: String
    init?(name: String) {
      if name.isEmpty {
            return nil
      }
      self.name = name
    }
    convenience init() {
      self.init(name: "")!
    }
}</pre></div>
<p>如果初始化器调用一个可失败初始化器导致初始化失败,那么整个初始化过程都失败,并且之后的代码都停止执行</p>
<p>可以用一个非可失败初始化器重写一个可失败初始化器,但反过来是不行的。</p>
<p class="maodian"></p><h3>反初始化器(deinit)</h3>
<p>deinit叫做反初始化器,类似于C++的析构函数、OC中的dealloc方法</p>
<p>当类的实例对象被释放内存时,就会调用实例对象的deinit方法</p>
<div class="jb51code"><pre class="brush:java;">class Person {
    deinit {
      print("Person对象销毁了")
    }
}
</pre></div>
<p>deinit不接受任何参数,不能写小括号,不能自行调用</p>
<p>父类的deinit能被子类继承</p>
<p>子类的deinit实现执行完毕后会调用父类的deinit</p>
<p class="maodian"></p><h2>可选链(Optional Chaining)</h2>
<div class="jb51code"><pre class="brush:java;">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() -&gt; Int {
      18
    }
    func eat() {
      print("Person eat")
    }
    subscript(index: Int) -&gt; 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? // Int?</pre></div>
<p>如果可选项为nil,调用方法、下标、属性失败,结果为nil</p>
<p>如果可选项不为nil,调用方法、下标、属性成功,结果会被包装成可选项</p>
<p>如果结果本来就是可选项,不会进行再次包装</p>
<p>判断方法有没有调用成功:</p>
<div class="jb51code"><pre class="brush:java;">if let age = person?.age() { // ()?
    print("调用age成功", age)
} else {
    print("调用age失败")
}
</pre></div>
<p>形成可选链:</p>
<p>多个?可以链接在一起</p>
<p>如果链中任何一个节点是nil,那么整个链就会调用失败,可选链应用的地方还是很多的,在OC里面我们通常会加很多判断以避免崩溃,在Swift里面,因为有了可选链会减少很多我们自己的判断,提高了安全性。</p>
<div class="jb51code"><pre class="brush:java;">var dog = person?.dog // Dog?
var weight = person?.dog.weight // Int?
var price = person?.car?.price // Int?
</pre></div>
<div class="jb51code"><pre class="brush:java;">var scores = [
    "Jack" : ,
    "Rose" :
]
scores["Jack"]? = 100
scores["Rose"]? += 10
scores["Kate"]? = 88</pre></div>
<div class="jb51code"><pre class="brush:java;">var num1: Int? = 5
num1? = 10 // Optional(10)
var num2: Int? = nil
num2? = 10 // nil</pre></div>
<div class="jb51code"><pre class="brush:java;">var dict: = [
    "sum" : (+), //两个Int类型相加,返回一个Int类型
    "difference" : (-)
]
var result = dict["sum"]?(10, 20) // Optional(30), Int?</pre></div>
<p>到此这篇关于Swift初始化器与可选链的使用方法介绍的文章就介绍到这了,更多相关Swift初始化器与可选链内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Swift中类与结构的初始化示例解析</li><li>Swift中初始化init的方法小结</li><li>Swift编程中的初始化与反初始化完全讲解</li><li>Swift中初始化方法的顺序介绍</li><li>Swift初始化方法的使用介绍</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Swift初始化器与可选链的使用方法介绍