可選類型 * 可選類型表示變量能夠有值, 也能夠沒有值 * C 和 Objective-C 中並無可選類型這個概念 * Swift中只有可選類型才能夠賦值爲nil * 若是你聲明一個可選常量或者變量可是沒有賦值,它們會自動被設置爲nil * 格式: Optional<類型> 或 在類型後面加上?號 可選類型的取值是一個枚舉 * None 沒有值 * Some 有值 * 因爲可選類型在Swift中隨處可見, 因此係統作了一個語法糖, 在類型後面加上? 注意: * nil不能用於非可選的常量和變量。若是你的代碼中有常量或者變量須要處理值缺失的狀況,請把它們聲明成對應的可選類型。 * Swift 的nil和 Objective-C 中的nil並不同。在 Objective-C 中,nil是一個指向不存在對象的指針, 因此Objective-C只有對象類型才能被設置爲nil(基本類型不行)。在 Swift 中,nil不是指針——它是一個肯定的值,用來表示值缺失。任何類型的可選狀態均可以被設置爲nil,不僅是對象類型。
var number: Optional<Int>程序員
number = 10安全
number = nil架構
var number1: Intapp
number1 = 10函數
//number1 = nil優化
// 推薦url
var number2: Double?spa
number2 = 20.1指針
//number2 = nil code
// Swift中可選類型的值不能當作普通類型的值來使用
// 若是想使用可選類型的值必須進行解包操做
// 只須要在變量/常量後面加上! 就能夠解包
// 解包表明着告訴系統, 該變量/常量中必定有值
var number3: Double
number3 = 3.14
print(number2)
print(number2!)
print(number3)
let sum = number2! + number3
強制解析(forced unwrapping) * init? 構造函數, ?表示不必定可以實例化出對象 * !表示告訴編譯器必定有值, 編譯可以經過, 若是運行時沒有值就會直接崩潰 * 提示: ? 和 ! 是全部剛剛接觸Swift的OC程序員最最蛋疼的問題, 前期開發要注意多看文檔和利用編譯器提示解決(option + click) 注意 * 在Swift開發中, 儘可能不要使用強制解包, 不安全 let url = NSURL(string: "http://www.520it.com") print(url) //print(url!) let url1 = NSURL(string: "http://www.520it.com/圖片/abc.png") print(url1)
可選綁定(optional binding) * 不須要考慮url是否有值, 能進入{}必定有值 * 不只能夠用來判斷可選類型中是否有值,同時能夠將可選類型中的值賦給一個常量或者變量 * 可選綁定能夠用在if和while語句中 提示: * 在實際開發中,使用頻率很高 注意: * 可選綁定中的變量/常量只能在if後面的{}中使用 if let temp = url { print(temp) } 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{ 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) } test()
隱式解析可選類型(implicitly unwrapped optionals) * 有時候在程序架構中,第一次被賦值以後,能夠肯定一個可選類型_總會_有值。在這種狀況下,每次都要判斷和解析可選值是很是低效的,由於能夠肯定它總會有值 * 隱式解析可選類型, 並不須要每次都使用解析來獲取可選值, 一個隱式解析可選類型其實就是一個普通類型,可是能夠被當作非可選類型來使用 * 格式: 將可選類型後面的?改成! * let xmgButton: UIButton! 注意: * 若是一個變量以後可能變成nil的話請不要使用隱式解析可選類型。若是你須要在變量的生命週期中判斷是不是nil的話,請使用普通可選類型 let intValue: Int? intValue = 10 print(intValue) print(intValue!) if intValue != nil { print(intValue!) } if let temp = intValue { print(temp) } var doubleValue: Double! doubleValue = nil doubleValue = 3.14 print(doubleValue)