Swift語法筆記之可選類型

1.可選類型

  • 可選類型表示變量可以有值, 也可以沒有值
  • C 和 Objective-C 中并沒有可選類型這個概念
  • Swift中只有可選類型才可以賦值為nil
  • 如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設置為nil

2.可選?類型格式

  • 格式: Optional<類型> 或 在類型后面加上?號
    var number: Optional<Int>

  • 可選類型的取值是一個枚舉

  • None 沒有值

  • Some 有值

  • 由于可選類型在Swift中隨處可見, 所以系統做了一個語法糖, 在類型后面加上?
    var number: Int?
    注意:

    • nil不能用于非可選的常量和變量。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型。
    • Swift 的nil和 Objective-C 中的nil并不一樣。在 Objective-C 中,nil是一個指向不存在對象的指針, 所以Objective-C只有對象類型才能被設置為nil(基本類型不行)。在 Swift 中,nil不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態都可以被設置為nil,不只是對象類型。

3.推薦寫法

var number1: Double?//如果初始化不寫值,那么默認為nil
number = 2;

// Swift中可選類型的值不能當做普通類型的值來使用
// 如果想使用可選類型的值必須進行`解包`操作
// 只需要在變量/常量后面加上! 就可以解包
// * 解包代表著告訴系統, 該變量/常量中一定有值

var pi: Double?
pi = 3.14
print(pi)//打印出來是Optional(3.14)

4.解包

4.1強制解析(forced unwrapping)
  • 通過感漢號實現:!,如:number!
  • init? 構造函數, ?表示不一定能夠實例化出對象
  • !表示告訴編譯器一定有值, 編譯能夠通過, 如果運行時沒有值就會直接崩潰
  • 提示: ? 和 ! 是所有剛剛接觸Swift的OC程序員最最蛋疼的問題, 前期開發要注意多看文檔和利用編譯器提示解決(option + 左擊鼠標變量)
    注意
  • 在Swift開發中, 盡量不要使用強制解包, 不安全
//let url: NSURL?
let url = NSURL(string: "http://www.baidu.com")
print(url)
url!
4.2可選綁定解包(optional binding)
  • 不需要考慮url是否有值, 能進入{}一定有值
  • 不僅可以用來判斷可選類型中是否有值,同時可以將可選類型中的值賦給一個常量或者變量
  • 可選綁定可以用在if和while語句中
  • 提示: 在實際開發中,使用頻率很高
  • 可選綁定中的變量/常量只能在if后面的{}中使用
if let temp = url {
    url//能進來,那么url是一定有值的
}
//但是當可選類型過多時,出現下面情況,代碼看起來就非常low了
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40

if let temp1 = value1 {
    if let temp2 = value2 {
        if let temp3 = value3 {
            if let temp4 = value4 {
                let sum = temp1 + temp2 + temp3 + temp4
            }
        }
    }
}

guard

  • guard語句是在Swift 2.0中引進的,它是用途是在未滿足某個條件時,提供一個退出的路徑
  • 格式:guard 表達式 else{}
    注意:
  • guard中的變量/常量 可以在guard后面使用
  • guard一般用于避免使用強制拆包, 優化代碼結構
func test() {
    let value1: Int? = 10
    let value2: Int? = 20
    let value3: Int? = 30
    let value4: Int? = 40
    
    guard let temp1 = value1 else {//guard一般寫在函數里
        return
    }
    guard let temp2 = value2 else {
        return
    }
    guard let temp3 = value3 else {
        return
    }
    guard let temp4 = value4 else {
        return
    }
    
    let sum = temp1 + temp2 + temp3 + temp4
    print(sum)
}

4.3隱式解析可選類型(implicitly unwrapped optionals)
  • 有時候在程序架構中,第一次被賦值之后,可以確定一個可選類型總會有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值
  • 隱式解析可選類型, 并不需要每次都使用解析來獲取可選值, 一個隱式解析可選類型其實就是一個普通類型,但是可以被當做非可選類型來使用
  • 格式: 將可選類型后面的?改為!
    示例: let loginBtn: UIButton!
  • 注意:如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型
//這種多用于storyboard或xib連線時定義的屬性
var button: UIButton!
button = UIButton()
print(button)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容