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

最后看下运行结果:
在这里插入图片描述

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