您好,登錄后才能下訂單哦!
一、可選類型
有時候在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,不會出現異常
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。