swift-析構函數和可選鏈

說在前面的話

析構器只適用於類類型,當一個類的實例被釋放之前,析構器會被立即調用。析構器用關鍵字 deinit 來標示,類似於構造器要用 init 來標示。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可選鏈式調用是一種可以在當前值可能爲 nil 的可選值上請求和調用屬性、方法及下標的方法。如果可選值有值,那麼調用就會成功;如果可選值是 nil,那麼調用將返回 nil。多個調用可以連接在一起形成一個調用鏈,如果其中任何一個節點爲 nil,整個調用鏈都會失敗,即返回 nil。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1.析構函數

個人理解

當我們需要銷燬一個對象的時候 就需要釋放內存 這時候就會用到析構函數

基本格式

deinit {
    // 執行析構過程
}

示例代碼

class xiazai{
    
    var imgs:[String] = []
    var file = " "
    
    init!(fileName:String) {
        if fileName.isEmpty {
            print("文件名不能爲空!")
        } else{
            self.file=fileName
            print("加載成功")
            ingDowling()
        }
    }
    
    
    deinit {
        if imgs.count<0 {
            print("數據庫爲空無需釋放資源")
        }else{
            self.imgs.removeAll()
            print("釋放資源成功")
        }
    }
   
    func ingDowling() {
        print("正在下載!")
    }
}

var xz = xiazai(fileName: "imgs")
xz?.imgs.append("one")
xz=nil

這裏模仿了一個 數據庫存儲的案例 創建一個下載類 可失敗構造函數 可=和析構函數
當數據庫爲空的時候 可失敗構造函數初始化的時候 作出判斷 ,當我們添加一個元素後 我們把實力化對象 設置爲nil的時候 析構函數 會執行釋放資源成功。

2.可選鏈

Swift 的可選鏈式調用和 Objective-C 中向 nil 發送消息有些相像,但是 Swift 的可選鏈式調用可以應用於任意類型,並且能檢查調用是否成功。

示例代碼

class hero {
    
    var name:String
    
    init(name:String) {
        self.name=name
    }
    
    var aepaen:aepaen?
  
}

class aepaen{
    var name:String
   
    
    init(name:String) {
        self.name=name
       
    }
    
    var skills:[skill] = [skill]()
    
    subscript (i:Int) -> skill{
        get {
            return skills[i]
        }
        set{
            skills[i] = newValue
        }
    }
    
    var skillName:String?{
        
        if skills.count > 0{
            return self.skills[0].name
        }else{
            return nil
        }
        
    }
    
}


class skill{
    
    var name:String
    
    init(name:String) {
        self.name=name
    }
    
    func skilldesk() {
        print("這裏是武器的描述 該技能的name:\(name)")
    }
    
    func deskString() -> String? {
        return("技能的描述")
    }
    
}

屬性的訪問

if let name = name.aepaen?.skillName {
    print("\(name)")
}else{
    print("訪問技能名字失敗!")
}

訪問方法使用可選鏈

if (name.aepaen?.skills[0].skilldesk()) != nil {
    print("訪問方法成功!")
}else{
    print("訪問失敗!")
}

訪問下標使用可選鏈

if let name = name.aepaen?[0].name  {
   print("訪問武器名字爲 \(name)")
}else{
    print("訪問失敗!")
}

訪問返回值使用可選鏈

if let name = name.aepaen?[0].deskString()  {
   print("訪問武器名字爲 \(name)")
}else{
    print("訪問失敗!")
}


爲英雄添加技能:

var name = hero(name: "ssj")
var jn = aepaen(name: "boss")

var jn1 = skill(name: "順手牽羊2")
var jn2 = skill(name: "順手牽羊3")

jn.skills.append(jn1)
jn.skills.append(jn2)

name.aepaen=jn

最後看下運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章