swift 基礎語法二 (元組、可選類型)

這是我參與更文挑戰的第2天,活動詳情查看: 更文挑戰markdown

元組(tuples)

元組把多個值組合成一個複合值。元組內的值能夠是任意類型,並不要求是相同類型。數據結構

eg: (Int,String)(Int,Int,Bool)等等app

  • 元組的定義
    • 定義元組時,能夠在元組中命名各個元素
    let http404Error = (statusCode: 404, description: "Not Found")
    複製代碼
    • 也能夠直接定義
    let http404Error = (404,"Not Found")
    複製代碼
  • 元組的訪問
    • 能夠將元組的內容分解爲單獨的常量或變量
    let http404Error = (404,"Not Found")
    let (statusCode,statusMessage) = http404Error;
    print(statusCode)     //404
    print(statusMessage)  //Not Found
    複製代碼
    • 若是你只須要一部分元組值,分解的時候能夠把要忽略的部分用下劃線(_)標記
    let http404Error = (404,"Not Found")
    let (statusCode, _) = http404Error
    print("The status code is \(statusCode)")  //The status code is 404
    複製代碼
    • 經過下標來訪問元組中的單個元素,下標從零開始
    let http404Error = (404,"Not Found")
    print("The status code is \(http404Error.0)")    //The status code is 404
    print("The status message is \(http404Error.1)") //The status code is 404
    複製代碼
    • 若是在元組中命名元素,則可使用元素名稱來訪問這些元素的值
      let http200Status = (statusCode: 200, description: "OK")
      print("The status code is \(http200Status.statusCode)")      // Prints "The status code is 200"
      print("The status message is \(http200Status.description)")  // Prints "The status message is OK"
      複製代碼
    注意:
    元組在臨時組合值的時候頗有用,可是並不適合建立複雜的數據結構。若是你的數據結構並非臨時使用,請使用類或者結構體而不是元組

可選類型(optionals)

在 OC 中不存在可選項的概念,一個方法的返回值是一個對象,若是沒有對象會返回 nil 。nil 只適用於對象,不適用與結構體和枚舉。對於結構體和枚舉,OC 一般用 NSNotFound 表示值的缺失。 而在 Swift 中,使用optionals 處理任何類型,判斷它們是否有值post

optionals

  • 使用可選類型(optionals)來處理值可能缺失的狀況
  • 可選的表明兩種可能性
    • 有值
    • 沒值
  • 一個可選的 XXX 被寫做 XXX?,問號(?)暗示包含的值是可選類型,也就是說可能包含 XXX 值也可能不包含值
let strNum = "123"
let a = Int(strNum)
print(a) //Optional(123) //a 被推斷爲Int類型,或 optional Int 類型

let str = "b"
let b = Int(str)
print(b) //nil
複製代碼

由於 Int 初始化可能會失敗,因此它返回一個可選類型optional Int,而不是一個Int。也就是說可能包含 Int 值也可能不包含值。ui

nil

  • 給可選變量賦值爲nil來表示它沒有值
var value: Int? = 10  //value 包含一個可選的 Int 值 10
value = nil  // value 如今不包含值
複製代碼
  • 聲明一個可選常量或者變量可是沒有賦值,它們會自動被設置爲nil
var message: String?  //message 被自動設置爲 nil
複製代碼
  • nil不能用於非可選的常量和變量。若是你的代碼中有常量或者變量須要處理值缺失的狀況,請把它們聲明成對應的可選類型
var a:String  = nil   //報錯
let b: Int = nil      //報錯

var a:String?  = nil  //正確 nil
let b: Int? = nil     //正確 nil
複製代碼

if語句以及強制解析

可使用 if語句nil 比較來判斷一個可選值是否包含值,使用==!= 來執行比較spa

  • 若是可選類型有值,它將不等於 nil
var code: Int? = 10
if code != nil {
   print("code是個整數") //code是個整數
}
複製代碼
  • 當你肯定可選類型確實包含一個非nil的值以後,你能夠在可選的名字後面加一個感嘆號!來獲取值。這個感嘆號!表示「這個可選有值,可使用」。這被稱爲可選值的強制解析(forced unwrapping)
var code: Int? = 10
if code != nil {
    print("code 值爲 \(code!)")code 值爲 10
}
複製代碼

可選綁定(optional binding)

使用可選綁定來判斷可選類型是否包含值,若是包含就把值賦給一個臨時常量或者變量,可選綁定能夠與ifwhile語句一塊兒使用,以檢查可選中的值,並將該值提取到常量或變量中,做爲單個操做的一部分code

  • if語句爲例,進行可選綁定
let strNum = "123"
if let actualNum = Int(strNum) {
    print("字符串 \"\(strNum)\"轉爲數字爲 \(actualNum)")
} else {
    print("字符串 \"\(strNum)\" 不能被轉爲數字")
}

//字符串 "123"轉爲數字爲 123
複製代碼

若是Int初始化返回的可選Int(strNum)值包含一個值,則賦值給一個新常量 actualNum並執行if語句的第一個分支orm

  • 單個if語句中能夠包含任意數量的可選綁定和布爾條件,它們之間須要用逗號,隔開,若是可選綁定中有nil或布爾條件計算結果爲false,則整個if語句的條件被視爲false
if let firstNumber = Int("2"), let secondNumber = Int("8"), firstNumber < secondNumber && secondNumber < 10 {
    print("\(firstNumber) < \(secondNumber) < 10")
}else{
    print("其餘處理")
}

// 2 < 8 < 10
複製代碼

隱式解析可選類型(implicitly unwrapped optionals)

有時候在代碼邏輯中,第一次被賦值以後,能夠肯定一個可選類型總會有值。這種類型的可選狀態被定義爲隱式解析可選類型,Swift中隱式解析可選類型主要用在類初始化。對象

把想要用做可選的類型的後面的問號?改爲感嘆號!來聲明一個隱式解析可選類型生命週期

一個隱式解析可選類型其實就是一個普通的可選類型,可是能夠被當作非可選類型來使用,並不須要每次都使用解析來獲取可選值。下面的例子展現了可選類型 String 和隱式解析可選類型 String 之間的區別:

let name: String? = "xiaoming."
let studentName: String = name!  // 須要感嘆號來獲取值

let city: String! = "Shanghai."
let studentCity: String = city // 不須要感嘆號
複製代碼

注意:
若是一個變量以後可能變成nil的話請不要使用隱式解析可選類型。若是你須要在變量的生命週期中判斷是不是nil的話,請使用普通可選類型。

相關文章
相關標籤/搜索