Swift LearnigNote: Optional & Forced Unwrapping & Optional Binding

本篇文章主要介紹的是swift代碼中基礎的相對與其餘語言的一些特性和優秀的地方swift

可選項

## 定義 通常也叫可選類型,它是容許將值設置爲nil的,表示方式就是在類型的後面加上? 來定義可選項
複製代碼
var a:Int?              var b:Int              
    var a:Int? = nil        var b:Int = 0
複製代碼

左邊的是等價的,右邊就不同了 舉個🌰:數組

我定義一個數組,若是返回是數組內的成員就返回,若是不是就返回nil,可是這裏報錯了: 'nil' is incompatible with return type 'Int' 這是爲何呢?可能之後在寫swift代碼中也必定會出現此類的錯誤 若是你的返回值有可能爲空,又有可能返回值,那麼就在返回值的後面加上?

這樣便編譯成功了...... 咱們把它打印出來

這裏就出現了我打印第一個的時候是數組的第二個,前面有個可選(optional)的選項,後面的-1和4都已經越界了

強制解包

可選項是對其餘類型的一層包裝,能夠將它理解成一個盒子,若是爲nil,表示是個空盒子,若是不爲nil,表示盒子裏面有被包裝的數據
複製代碼
var age:Int?                            
    age = 10
    age = nil
複製代碼

以上的代碼能夠理解成以下的圖app

若是要從可選項中取出數據就叫作解包,須要用感嘆號!來強制解包
複製代碼
var age:Int? = 10                            
    var num = age + 11
複製代碼
同窗們看下,上面的代碼有什麼問題嗎?本身能夠嘗試在pg裏面嘗試寫一下,它會報錯:
Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
這裏就是說:你要用age來加上11 賦值給 變量num,可是num並不知道你裏面有沒有值,可選項可能會nil,因此要強制解包!
複製代碼
var age:Int? = 10                            
    var num = age! + 11
複製代碼
咱們這個時候不妨打印下age:發現仍是optional(10),因此說強制解包只是把盒子裏面值拿出來用一下,不能改變它
複製代碼

若是對值爲nil,也就是空盒子強制解包,就會出現運行時錯誤函數

判斷可選項是否包含值

var num = Int("xixi123")
複製代碼

Int 進行強制解包這麼個東西,究竟是返回啥呢,給0 行不行?固然不行! 由於你可能Int裏面的可能就是「0」,-1 同樣。ui

如上圖所示: 是個可選類型.

可選項綁定

可使用可選項綁定來判斷可選項是否包含值
若是包含就自動解包而且把值賦值給一個臨時常量let或者變量var,並返回true/false
複製代碼
if let num = Int("123") {
    print("字符串轉整數成功\(num)")
    }else{
    print("字符串轉整數失敗!")
    }
複製代碼
這裏自動解包成功之後,獲取到num是值123,不是optional,所以不須要加!
複製代碼

等價寫法

if let number = Int("4") {
        if let count = Int("32"){
            if number < count && count < 100{
                print("\(number) <\(count) < 100")
            } 
        }
    }
    // 4<32<100
複製代碼

等價於:spa

if  let number = Int("4"),
        let count = Int("32"),
        number < count && count < 100{
           print("\(number) <\(count) < 100")
        } 
    // 4<32<100
複製代碼

空合併運算符??

a??b
複製代碼

注意:3d

1. a是可選項
2. b是可選或者是不可選項
3. 若是a不爲nil,就返回a,若是a爲nil,就返回b
4. 若是b不是可選項,返回a時候會自動解包
複製代碼

內置函數看一下:code

b是可選結果就是可選,b是非可選結果就是非可選

舉個🌰:cdn

多個??一塊兒使用:

c_1, c_2, c_3 三個參數就是多個?? 一塊兒使用的結果

??跟if let 配合使用

let a:Int? = nil
    let b:Int? = 12
    if let c = a ?? b{
        print(c)
    }
    // 相似 if a!=nil || b!=nil
    if let c = a, d = b{
        print(c)
        print(d)
    }
    // 相似 if a!=nil && b!=nil
複製代碼

上面代碼,先看a??b,b是可選項,也就是結果也是可選項,就能夠用可選項綁定處理blog

當之後若是變量中可能有nil的狀況下,能夠用這種組合拳去處理問題

guard語句

guard 條件 else {
    // do something...
    退出當前做用域
    //return,break,continue,throw error
}
複製代碼

當guard 條件爲false的時候才執行大括號裏面的語句, 當guard 條件爲true的時候就會跳出guard語句, guard 語句特別適合提早退出 當使用guard語句進行可選項綁定時,綁定的常量let,變量var 也能在外層做用域內使用

func login(_ info:[String:String]){
    guard let username = info["username"] else{
        print("請輸入用戶名")
        return
    }
    guard let password = info["password"] else{
        print("請輸入密碼")
        return
    }
}
複製代碼

隱式解包

let num11 : Int? = 10
let num22 : Int = num11
複製代碼

在某種狀況下,可選項一旦被設定了值,就會一直擁有它,沒必要要每次訪問都去進行解包,由於它每次訪問都有值,這種可選值賦值是須要解綁

let num11 : Int! = 10
let num22 : Int = num11
複製代碼

? 要改爲!,先要進行強制解包

多重可選項

相關文章
相關標籤/搜索