91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swift可選類型和可選鏈

發布時間:2020-06-28 12:06:03 來源:網絡 閱讀:1257 作者:hehemmm 欄目:移動開發

一、可選類型


    有時候在Swift程序的表達式可以看到?和!等符號,它們代表的含義是什么,這些符號都和可選類型有關。

    有時候使用一個變量和常量,它保存的值可能有也可能沒有


    1、比較給一個變量賦值nil,需要下面的表達式賦值

    class Empoyee{
        var  int : = 0
        var name:String = ""
        var job : String =""
}
    var emp : Employee? = nil //后面加上?號可以接受空值,不加?不能賦予空值
    emp1=Employee()
    println(emp!.no)


        如果Employee?沒有賦值,調用它的成員的時候可能出現fatal error:unexpected found nil while upwrapping an optional value.


    2、引用代碼

        emp1?.no=1000
        emp1?.name="張三"
        emp1?.job="clerk"


    3、再看示例

        func divided(n1:Int,n2:Int)->Double?{
            if n2==0{
            return nil
}
        Double(n1)/Double(n2)
}
    let result : Double? = divide(100,200)


    使用原則:如果一個常量、變量或函數能夠接受nil空值,那就需要給這個類型設為可選類型(正常類型+?),允許接受nil控制則是正常類型


    (1)強制拆封


        如果我們能確定可選類型一定有值,那么在讀取它的時候,可以在可選類型的后面加一個感嘆號(!)來獲取該值,這種感嘆號的表達方式稱為可選類型的強制拆封,如下代碼所示:

        let result1 :Double? = divided(10,20)

        println(result1!)

        println對result1中的語句進行了強制拆封



        

        前問號,后感嘆號,強制拆封


    (2)隱式拆封

            

            為了能夠方便的訪問可選類型,可以將可選類型后面的問號改成感嘆號(!),這種可選類型在拆封時變量和常量不加感嘆號的方式稱為隱式拆封,如下代碼所示:


                let result3 : Double! = divided(10,20)

                 println(result3)

        在變量或常量聲明的時候,數據類型后面跟的是感嘆號而不是問號,在拆封的時候,變量或常量后面不用加感嘆號,這就是隱式拆封,隱式拆封的變量或常量使用起來就像普通變量或常量一樣


            前感嘆后省略,隱式拆封


      (3)可選類型的綁定


            可選類型賦值有風險性,可以先判斷再賦值,如下代碼所示:

        func divided(n1:Int,n2:Int)->Double?{
            if n2==0{
            return nil
}
        Double(n1)/Double(n2)
}

    if let result : Double = divided(10,20) {
    let sum = 10.2 + result
    
    println(sum)
    
}

          調用函數進行計算,然后把結果直接賦值給變量或常量,如果result不為nil,則if語句的邏輯變大時為true, 這種可選類型在if 或while語句中進行判斷賦值,叫做可選綁定。      



二、可選鏈


      class Empoyee {
            var no:Int = 0
            var name : String = "tony"
            var job:String? = ""
            var salary:Double = 0
            var dept : Deartment = Department()
}
            class Department {
            var no : Int = 0
            var name:String = "sales"
            var com:Company = Company()
}
            class Company {
                var no : Int = 0
                var name : String = ""
}
        var emp = Employee()
        println(emp.dept.com.name)


        給定一個Employee實例,通過代碼emp.dept.com.name 可以引用到Company實例,形成一個引用的鏈條,但是這個鏈條的人一個環節斷裂,都無法引用到最后的目標。


        修改代碼如下:

            

        2、Employee、Department,Company可以沒有對應關系

      class Empoyee {
            var no:Int = 0
            var name : String = "tony"
            var job:String? = ""
            var salary:Double = 0
            var dept : Deartment? = Department()
}
            class Department {
            var no : Int = 0
            var name:String = "sales"
            var com:Company? = Company()
}
            class Company {
                var no : Int = 0
                var name : String = ""
}
        var emp = Employee()
        println(emp.dept!.com!.name)


        但是強制拆封有一個弊端,如果可選鏈中某個環節為nil,將會導致代碼運行時錯誤,可以采用更加溫柔的引用方式,使用問號?來代替感嘆號!,如下所示:

            

        println(emp.dept?.com?.name)

            ?問號表示引用的時候,如果某個環節為nil,她不會出現錯誤,而是把nil返回給引用者,這種使用問號引用可選類型的方式叫做可選鏈



三、使用問號?和感嘆號!的總結


        1、可選類型中的問號?


            聲明這個類型為可選類型,訪問這種類型的常量或變量時要使用感嘆號!


        2、可選類型中的感嘆號!


            聲明這個類型也是可選類型,但是訪問這種類型的常量或變量時不適用感嘆號!,下列代碼是隱式拆封:


            let result3 : Double! = divide(10,20)

             println(result3)


          3、可選類型中的感嘆號


            多個對象具有關聯關系,當從一個對象引用另一個對象的方法、屬性和下標的成員時,就會形成引用鏈,由于這個鏈條某些環節可能有錢,有些可能沒值,因此需要如下方法引用:


            emp.dept!.com!.name


            4、可選鏈中的問號


            在可選鏈中使用感嘆號訪問時,一旦鏈條某些環節沒值,程序將會發生異常,于是可把感嘆號改成問號,如下所示:

            emp.dept?.com?.name


              這樣某些環節沒值會返回nil,不會出現異常          

  

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

澜沧| 汝州市| 东明县| 平安县| 维西| 吉水县| 颍上县| 泽普县| 攀枝花市| 乌海市| 禹城市| 西安市| 青冈县| 濮阳市| 共和县| 宁陕县| 大丰市| 定南县| 泗水县| 嘉祥县| 武陟县| 洪雅县| 平南县| 周宁县| 象山县| 运城市| 麦盖提县| 鲁甸县| 当涂县| 金寨县| 德钦县| 兴山县| 宝清县| 延长县| 南丰县| 清水县| 泾源县| 泸水县| 鄂托克旗| 崇左市| 华宁县|