Swift学习(Optional Value+Guard)

前言

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

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

    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))