可选绑定、guard else weak unowned

这几个关键字放一起也是醉了,本来想放到上一篇一起,想了想放哪里好像都一样。主要是去了解一下这些语句(关键字)的作用以及使用场景及优势。

func sayHello(name:String?) {
    if name == nil {
        print("姓名是空的")
    } else {
        print("hello world" + " " + name!)
    }
}
sayHello(name: nil)

func sayHello1(name:String?) {
    if let tmpName = name {
        print("hello world" + " " + tmpName)
    }
    print("姓名是空的")
}
sayHello1(name: "zhangsan")

func sayHello2(name:String?) {
    guard let tmpName = name  else {
        print("姓名是空的 from guard")
        return
    }
    print("hello world" + " " + tmpName)
}
sayHello2(name: "zhangsan")


//defer 推迟到最后执行
func sayHello3() {
    print("first")
    defer {
        print("defer statement")
    }
    print("last")
}
sayHello3()

结论

可选绑定本质和if else没区别,好处在于会解包数据 ,在之后使用不必要再去解包,guard else 和可选绑定也非常相似,可以在else里面抛异常或者return。 defer推迟到最后执行,这个得到具体场景具体使用。

weak

class Person {
    var name : String?
    var book : Book?
    deinit {
        print("person release")
    }
}

class Book {
    var name : String?
    weak var person : Person?
    deinit {
        print("book release")
    }
}

var person : Person? = Person()
person?.book = Book()
person = nil

person 强引用book,而book弱引用person,所以在person被释放时,book也没有任何强引用而释放,达到解除循环引用的问题,同时weak标记的对象,在释放之后会自动置为nil,避免了野指针问题。

unowned

class Person {
    var name : String?
    var book : Book?
    
    init(name:String?) {
        self.name = name
        self.book = Book(name: "", person: self)
    }
    
    deinit {
        print("person release")
    }
}

class Book {
    var name : String?
    unowned let person : Person
    
    init(name:String?, person:Person) {
        self.name = name
        self.person = person
    }
    
    deinit {
        print("book release")
    }
}

var person : Person? = Person(name: "zhangsan")
person = nil

无主引用和weak一样可以打破循环引用,区别在于无主引用通常都被期望拥有值, 无法在实例被销毁后将无主引用设为nil,因为非可选类型的变量不允许被赋值为nil。具体引用计数请前往这里

最近的文章

python自动化的使用

背景之前在某公司,发现测试人员每天固定时间点都要发一些巡检报告,有些时间点很早,并且感觉时时都要知道线上情况,看着真的为他们感觉到累。于是写代码的就不安分了,这么无聊的重复性工作为啥要人来做,让代码去做不是很好吗?初窥python作为这么一门网红语言,不会真是有点说不过去。出于上面的需求,直接不管青红皂白就创建了一个python项目,虽然不知道python的相关api,但是程序思路是有的。大概思路就是写一个无限循环的程序,让他定时去check服务器的相关接口,然后检查接口的返回情况来决定服...…

人生苦短,就用python继续阅读
更早的文章

swift 常用高阶函数

mapvar arr = [1, 2, 3]//map函数是有返回值的,想要arr里面的值map过去需要arr重新接收新值arr.map { (a : Int) -> Int in return a * 2}//这种写法只是尾随闭包的简写。。arr = arr.map { $0 * 2}flatMap//floatMap函数可以降维var arr1 = [[1, 2], [4, 5], [6, 7]]var aaa = arr1.flatMap { $0}//flo...…

码农世界继续阅读