本篇文章主要介紹的是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 三個參數就是多個?? 一塊兒使用的結果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 條件 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
複製代碼
? 要改爲!,先要進行強制解包