Swift:可選類型(Optional)

來源:互聯網
上載者:User

標籤:swift   closures   可選類型optional   

在我們使用objective-c表示字串資訊的時候,可以用下面方法書寫。

NSString *str = @"秋恨雪";str = nil;

因為objective-c是弱類型語言,所以這裡的str既可以是具體的字串也可以是nil。但到了Swift中就不可以了,因為Swift是型別安全的語言,一個String類型的變數不可能既能是具體的字串,又可以為nil(更嚴格的說String類型的內容只能是字串)。所以,在Swift中有了可選類型的概念。(其實這一概念也是“借鑒”於其他程式設計語言,比如C#,只不過在C#中稱之為可空類型)

一、可選類型的定義

可選類型的格式: 類型名?

例如:

var phone: String?
問號 "?" 表明phone 的值是可選的,可能是一個String,也可能不存在。

phone的值要麼是String類型,要麼是nil。

二、可選類型的應用

String有一個toInt方法,可以將字串轉為對應的整數。

有些字串能轉成整數: 比如 "123", 可以轉成 123。

有些字串不能轉成整數, 比如 "秋恨雪", 無法轉成整數。

因此toInt方法的返回值是一個可選的Int類型(即 Int?)

所以轉換結果如下:

let num = "123".toInt()      // 123let num2 = "秋恨雪".toInt()   // nil
注意: num和num2 都是 Int? 類型,而不是 Int類型。

三、可選類型的本質

Int? 其實是對Int的一層封裝,它們是兩種不同的資料類型。

var num: Int? = 10
可以理解為num包含了 "Some" 和 "None" 這兩個 "屬性",而上面的操作只是將Int類型的10,封裝到了Int? 中的 "Some" 中。如下:


四、強制解包(拆包)

在可選類型的後面加個驚嘆號 "!" , 就可以將可選類型(封裝)的值取出來,賦值給具體類型。

比如下面的寫法:

var num: Int? = 10var numValue: Int = num!
其實就是將 "Some" 中的值取出來。如下:


注意:如果可選類型(封裝)的值不存在,即 "Some" 的值不存在,任然進行強制解包,會報錯。

var num: Int?var numValue: Int = num!

錯誤資訊:fatal error: unexpectedly found nil while unwrapping an Optional value.

因此,在強制解包之前,一定要先檢查可選類型(封裝)的值是否存在。

針對上面的情況,我們可以使用if語句來檢測一個可選類型(封裝)的值是否存在。例如:

if let num = "156".toInt() {    println("num的值是\(num)")} else {    println("num的值不存在")}

五、隱式解包(拆包)

預設情況下,如果想將可選類型(封裝)的值賦給具體類型,比如將Int?的值賦給Int類型,需要使用驚嘆號 "!"

如果將可選型別宣告為隱式解包。

1. 不用再進行強制解包。

2. 能夠自動解包:自動把可選類型(封裝)的值取出來賦給具體類型。

隱式解包的聲明只需將 "?" 改為 "!" 即可。例如:

var num: Int! = 20var numValue: Int = num // 自動解包
隱式解包的原理:

1. 相當於告訴編譯器,這個可選類型的值一直都存在,絕對能取出裡面的值。

2. 取值時不用手動加驚嘆號 "!", 編譯器會自動加上一個驚嘆號 "!" 。

六、"?" 和 "!" 使用情境

1. 在Swift中閉包(如有疑問,請參照我上一章節《Swift:閉包(Closures)》)已經取代了block,定義一個閉包:

var testClosure: ((str1: String) -> Void)?

可以看出,這個閉包的類型後面有一個問號 "?", 因為這個閉包屬性很有可能為nil。


2. 在Swift中的IBOutlet的連線操作,就表明了這個控制項是一定存在的。例如:

@IBOutlet weak var testLabel: UILabel!

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Swift:可選類型(Optional)

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.