swift 4.x 可選類型

有時可能會存在“值缺失”的情況,比如數據類型相互轉換時轉換失敗。
“值缺失”用nil表示。

Int("123")
Int("123abc")

為了處理可能存在“值缺失”的情況,Swift引入了可選類型。
在聲明任何數據類型的變量或常量時,都可以在數據類型的后面添加一個問號?,這樣,聲明的變量或常量就是可選類型的。
可選類型的變量或常量有兩種情況:要么有值,但是該值被包裝起來了;要么沒有值,用nil表示。

var i: Int?

i = Int("123")
print(i)

i = Int("123abc")
print(i)

/*
 對于可選的變量或常量,其默認值是nil。
 */
var b: Bool?


/*
 nil只能被賦值給可選類型的變量或常量,不能被賦值給普通的變量或常量。
 */
var d: Double? = nil

// var d2 = nil


/*
 可以使用比較運算符==或!=把一個可選類型的變量或常量和nil作比較,以判斷該變量或常量是否是有值的。
 */
d = 1.8

if d != nil {
    print("d是有值的")
}

2.可選類型的解包之強制解包

對于可選類型的變量或常量,如果想要訪問其包裝的實際值,可以在變量或常量的后面添加感嘆號!進行強制解包。

var i: Int?

i = Int("123")
print(i!)


var f1: Float? = 1.8
var f2: Float? = 1.5
var f3: Float? = 1.6

print((f1! + f2! + f3!) / 3)

對nil進行強制解包會導致運行時錯誤。因此,在對可選類型的變量或常量進行強制解包時要進行判斷。

i = Int("123abc")

// print(i!)

if i != nil {
    print(i!)
}

f3 = nil

// print((f1! + f2! + f3!) / 3)

if f1 != nil && f2 != nil && f3 != nil {
    print((f1! + f2! + f3!) / 3)
}

3. 可選類型的解包之可選綁定

對于可選類型的變量或常量,如果想要訪問其包裝的實際值,除了強制解包外,還可以使用可選綁定。

  • 可選綁定的語法格式為:
    if var或let 臨時的變量或常量 = 可選類型的變量或常量 {
    條件執行語句
    }

以上語句相當于:
if 可選類型的變量或常量 != nil {
var或let 臨時的變量或常量 = 對可選類型的變量或常量進行解包得到的實際值
條件執行語句
}

  • 對于可選類型的變量或常量,如果想要訪問器包裝的實際值,推薦使用可選綁定而不是強制解包,因為強制解包可能會因為被強制解包的變量或常量的值是nil而導致運行時錯誤。
var i: Int?

i = Int("123")
// i = Int("123abc")

if let actualI = i {
    print(actualI)
} else {
    print("轉換失敗")
}

// 以上語句相當于:
if i != nil {
    let actualI = i!
    print(actualI)
} else {
    print("轉換失敗")
}

/*
 在可選綁定的if語句中創建的臨時變量或常量,其作用域僅僅存在于if語句中。
 */
// print(actualI)

在可選綁定的if語句中,可以同時使用多個可選的綁定和判斷條件,并用逗號進行分隔。
只要其中一個可選綁定的值為nil,或其中一個判斷條件的值為false,那么整個if語句的判斷結果就為false。

var f1: Float? = 1.8
var f2: Float? = 1.5
var f3: Float? = 1.6

// f3 = nil

if let actualF1 = f1, let actualF2 = f2, let actualF3 = f3 {
    print((actualF1 + actualF2 + actualF3) / 3)
} else {
    print("計算失敗!")
}

// 上面的語句等價于:
if let actualF1 = f1 {
    if let actualF2 = f2 {
        if let actualF3 = f3 {
            print((actualF1 + actualF2 + actualF3) / 3)
        } else {
            print("計算失敗!")
        }
    } else {
        print("計算失敗!")
    }
} else {
    print("計算失敗!")
}

if let firstNumber = Int("16"), let secondNumber = Int("18"), firstNumber < secondNumber && secondNumber < 13 {
    print("\(firstNumber) < \(secondNumber) < 20")
}

// 上面的語句等價于:
if let firstNumber = Int("16") {
    if let secondNumber = Int("18") {
        if firstNumber < secondNumber && secondNumber < 20 {
            print("\(firstNumber) < \(secondNumber) < 20")
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容