Swift学习(Optional Value+Guard)

作者: 爱偷懒的万万 | 来源:发表于2016-07-13 12:02 被阅读43次

    前言

    oc里面没有 optional value 和 guard 这两个概念,下面讲解一下swift里面的这两个很有用的东西。

    1. Optional Binding

        var a :Int = 10
        a = nil   //这里会编译错误
    

    在oc中,所有类型都不能接受nil的,所以swift给出了一种可选类型:

       var a Int? = 10 
       a = nil   //编译正确
    

    表示的就是 ,该变量可以有值也可以为nil.

        optional 值的声明:
        var str :String ! = "haha"
        var str :Optional<String>
    

    拆包:
    *显式拆包和隐式拆包
    一个变量有可能有值有可能没有值的时候 就用 但是当用到这个变量的时候 说明一定是有值的,需要在后面加上 ,即为显式拆包

        var n1 : int? = 10    print(n1)   //打印为 optional(10)
    
        var n1 : int? = 10   print(n1+10)  // 编译错误
        这里需要拆包
        *显示拆包
        var n1 : int? = 10        print(n1 !+10) 
         *隐式拆包
        var n1 : int! =10  print(n1+10)
    

    例子:

        *显式拆包
        var count :Int?
        count = 100
        if count != nil{
                "count is" + String(count !)   //count is 100
        } else{
                "nil"
        }
        *隐式拆包
        var count :Int?
        count = 100
        if let a = count{
                "count is" + String(a)   //count is 100
        } else{
                "nil"
        }
    

    2. Optional Chaining

    直接上例子

        class Person{
                var pet : Pet?
        }
        
        class Pet{
                var name:String
                var toy: Toy?
                init(name:String){
                        self.name = name
                }
        }
    
        class Toy{
                var name:String
                init(name:String){
                        self.name = name
                }
        }
    

    如果用 optional binding 将每个optional值赋给临时变量,再做if判断:

        let jack = Person()
        jack.pet =Pet(name:"hehe")
        jack.pet?.toy = Toy(name:"haha")
        if let pet = jack.pet{
                if let toy = pet.toy{
                        toy.name
                }
        }
    

    如果用optional chainng 用一个optional值去调用下一个optional值,只要其中有一个为nil,整条chaining就为nil:

        let jack = Person()
        jack.pet =Pet(name:"hehe")
        jack.pet?.toy = Toy(name:"haha")
        if let toy = jack.pet?.toy{
                toy.name
        }
        使用optional chaining能使我们的代码变得更加简洁,
        如果我们Pet类有一个玩玩具的play方法的话,可以这样判断:
        if let p:Void = jack.pet?.play(){
                "play is yes"
        }
        注意:Void也算一个类型:typealias Void = ()
    

    3.Guard

    一般的if判断是这样的:将不符合的条件全部排除,剩下的就是符合要求的:

        func text(a:Int?){
                if a ==nil || a<= 0{
                        return    //不符合值的要求
                }
                //符合值的要求
                a!.description
        }
    

    上面这样的判断有可能导致有很多个判断条件,不简洁美观,而且在判断完后,即使符合值的要求,还需要进行拆包。

    上面的代码可以优化成这样:

         func text(a:Int?){
                if let a = a where a> 0{
                        //符合值的要求
                        a!.description                        
                }
                 //不符合值的要求...
        }
    

    这次代码就是判断符合要求的值,并且能隐式拆包了。

    而guard语句,可以完美结合上述两种,既能排除不符合条件的判断,又能做隐式拆包:

        func text(a:Int?){
                guard let a = a where a> 0 else{
                        return    //不符合值的要求                    
                }
                 //符合值的要求
                  a!.description
        } 
    

    上市意思是:判断满不满足该条件,满足该条件之外的条件就是不满足的条件,就return.

    以上是我对Optional Value 和 Guard的理解,说的不对的地方或者有更多见解的地方欢迎一起讨论

    相关文章

      网友评论

        本文标题:Swift学习(Optional Value+Guard)

        本文链接:https://www.haomeiwen.com/subject/vbvsjttx.html