前言
在swift
中, 我們要將幾個(gè)String
組合在一起是極其方便的,比如
第一種: 使用類似C++中的 "+" 運(yùn)算符重載
let dog = "string1" + "_string2"
print(dog)
輸出結(jié)果:
string1_string2
第二種: 使用Swift牛逼的插入法
又比如
let string2 = "string2"
let cat = "string1_\(string2)"
print(cat)
輸出結(jié)果:
string1_string2
第三種所禀,使用Swift的 append(_ other: String) 函數(shù)
再比如
let string2 = "string2"
var string1 = "string1_"
string1.append(string2)
print(string1)
輸出結(jié)果:
string1_string2
以上三種方式稚机,都可以達(dá)到我們想要的效果伦仍。
但是,我們今天聊的并不是怎么拼接Swift
中的字符串, 而是Swift
中的另一種常見的類型:可選類型(Optional Type)怖喻。
可選類型
在Swift
中底哗,可選類型是十分常見的類型之一。我們都知道锚沸,當(dāng)我們定義一個(gè)可選類型是跋选,其默認(rèn)值就是nil
,如
var optionalVariable: String?
可選類型在Swift
會使我們更為方便地處理一些特殊情況,比如值不存在哗蜈,可以使我們的Swift
代碼更加安全前标,因?yàn)閺?qiáng)制拆包一個(gè)未賦予任何值的可選類型坠韩,必然Crash!!!, 如
var dogVariable: String?
print(dogVariable!) // 奔潰炼列,報(bào)錯(cuò)只搁,因?yàn)閺?qiáng)制拆包一個(gè)沒有值的可選類型
但是在Swift
中,這種奔潰在編碼前期俭尖,可以給我們更好安全保障氢惋,因?yàn)槲覀兛梢酝ㄟ^一個(gè)可選值,去判斷我們接收的服務(wù)端返回字段是否存在稽犁,或者在一個(gè)計(jì)算方法中是否合理使用所定義的可選值焰望,在前期我們就可以檢測到數(shù)據(jù)是否合理,變量定義是否冗余已亥,書寫是否規(guī)范等
當(dāng)然熊赖,我相信幾乎所有的程序猿都不會說喜歡自己寫的代碼奔潰,故此陷猫,Swift
也不是說專門定義一個(gè)可選的概念給你秫舌,卻沒有解決的辦法,辦法還是有的绣檬,比如
var rabbit: String?
// 通過提供一個(gè)默認(rèn)值來防止奔潰足陨,rabbit的值不存在(即為nil),就輸出默認(rèn)值
print(rabbit ?? "defaultValue")
// 輸出結(jié)果
defaultValue
再比如娇未,我們可以使用 if let
綁定來安全并合理使用可選值
var elephant: String?
// 使用 if let 來安全檢查
if let value = elephant {
print(value)
} else {
print("not exist!")
}
// 輸出結(jié)果:
not exist墨缘!
我們還可以使用判斷是否為nil
來檢查
var eagle: String?
if eagle == nil {
print("eagle does not exist!")
}
輸出結(jié)果:
eagle does not exist!
除此之外,我們也可以使用 guard let
語句零抬,用法和 if let
類似镊讼,這里不贅述。
下面我們講的是第一種方式平夜,使用可選默認(rèn)值結(jié)合Swift
的字符串拼接符 "+"蝶棋, 來判斷哪個(gè)的優(yōu)先級更高!可能到這里忽妒,有人就說了玩裙,這么簡單的問題誰不明白?還用得著小題大做寫一篇博客段直,還啰嗦了這么多吃溅?很好,非常好的疑惑以及問題鸯檬,那么下面决侈,首先,請嘗試做下面這道題目
var value: String?
for _ in 1...3 {
value = value ?? "default" + "-swift"
print(value!)
}
好喧务,第一次就做對上面這個(gè)題目的人赖歌,恭喜你枉圃,這篇文章你不需要繼續(xù)看下去了。那么你的答案應(yīng)該看下來是這個(gè)樣子
default-swift
default-swift
default-swift
那么俏站,錯(cuò)誤的答案應(yīng)該看起來是下面這個(gè)樣子
default-swift
default-swift-swift
default-swift-swift-swift
剖析優(yōu)先級 + 和 ??
從上面正確答案讯蒲,其實(shí)我們已經(jīng)可以看出 +
的優(yōu)先級 比 ??
的優(yōu)先級更高,因?yàn)橐拊?code>for in的3次循環(huán)遍歷中
表面上墨林,
第一次,
value
的值肯定不存在犯祠,為nil
旭等, 所以值應(yīng)該是 default-swift第二次,
value
由于第一次已經(jīng)賦值default-swift衡载,所以理論上值應(yīng)該變成 default-swift-swift第三次搔耕,
value
由于第二次已經(jīng)賦值 default-swift-swift,所以理論上值應(yīng)該變成 default-swift-swift-swift
實(shí)際上痰娱,由于優(yōu)先級的原因( "+" > "??")
第一次弃榨,
value = value ?? "default" + "-swift"
, 先算??
右邊,所以value
等于default-swift
第二次梨睁,由于第一次鲸睛,
value
的值為default-swift
,不再為nil
, 所以值存在,值還是第一次的值default-swift
第三次坡贺,由于第二次官辈,
value
的值還是default-swift
,不再為nil
, 所以值還是存在,值還是第二次的值default-swift
綜上遍坟,遍歷循環(huán)三次拳亿,就算每次遍歷都將值賦予value
, 但是由于優(yōu)先級的原因,打印的值永遠(yuǎn)是第一次的默認(rèn)值愿伴,也就是 ??
右邊的 "default" + "-swift"
肺魁。
現(xiàn)在,回想一下你的答案隔节,正確與否万搔?
然后,我們來想一下官帘,在項(xiàng)目中是否會總是不經(jīng)意間犯這樣低級的錯(cuò)誤,那么如果這種情況下昧谊,我們想優(yōu)先使用 ??
的話刽虹,必須必須必須要加一個(gè) 括號()
,如下
var value: String?
for _ in 1...3 {
value = (value ?? "default") + "-swift"
print(value!)
}
輸出結(jié)果:
default-swift
default-swift-swift
default-swift-swift-swift
所以呢诬,在項(xiàng)目中涌哲,如果遇到類似的運(yùn)算符交叉混合運(yùn)算的情況下胖缤,務(wù)必要弄清楚優(yōu)先級,當(dāng)然阀圾,實(shí)在是不知道優(yōu)先級的情況下哪廓,最最最安全的做法就是加上括號()
,這樣就確保萬無一失了初烘。
補(bǔ)充
事實(shí)上涡真,+
的優(yōu)先級也比三目運(yùn)算符? :
的要高,比如
var value: String?
for _ in 1...5 {
value = value == nil ? "default1":"default2" + "-swift"
print(value!)
}
輸出結(jié)果為:
default1
default2-swift
default2-swift
default2-swift
default2-swift
再看
var value: String?
for _ in 1...5 {
value = (value == nil ? "default1":"default2") + "-swift"
print(value!)
}
輸出結(jié)果
default1-swift
default2-swift
default2-swift
default2-swift
default2-swift
歡迎加入 iOS(swift)開發(fā)互助群:QQ群號:558179558肾筐, 相互討論和學(xué)習(xí)哆料!