引言
Swift 有很多其他語(yǔ)言所沒(méi)有的獨(dú)特的結(jié)構(gòu)和方法,因此很多剛開(kāi)始接觸 Swift 的開(kāi)發(fā)者并沒(méi)有發(fā)揮它本身的優(yōu)勢(shì)。
所以,我們就來(lái)看一看那些讓你的 Swift 代碼更 Swift 的寫(xiě)法吧~
有條件的 for 循環(huán)
現(xiàn)在,我們要對(duì)
view.subviews中的UIButton做一些不可描述的事情,用 for 循環(huán)怎么來(lái)遍歷呢?
在下面的寫(xiě)法中,更推薦后面兩種寫(xiě)法:
?
for subView in view.subviews {
if let button = subView as? UIButton {
//不可描述的事情
}
}
?
for case let button as UIButton in view.subviews {
//不可描述的事情
}
?
for button in view.subviews where button is UIButton {
//不可描述的事情
}
enumerated()
在 Swift 中進(jìn)行 for 循環(huán),要拿到下標(biāo)值,一般的寫(xiě)法要么定義局部變量記錄下標(biāo)值,要么遍歷
0..<view.subviews.count。其實(shí)還有個(gè)更方便的寫(xiě)法:enumerated(),可以一次性拿到下標(biāo)值和遍歷的元素。
? 第一種肯定是不推薦的,因?yàn)檫€要定義額外的局部變量,容易出錯(cuò),pass
? 第二種在只需要用到下標(biāo)值的時(shí)候,是可以用的,但如果還要用到下標(biāo)值對(duì)應(yīng)的元素,就還得再取一次,麻煩,pass
? 第三種就比較完美,雖然一次性可以拿到下標(biāo)值和元素,但其中一個(gè)用不到就可以用_
?
var index: Int = 0
for subView in view.subviews {
//不可描述的事情
index += 1
}
?
for index in 0..<view.subviews.count {
let subView = view.subviews[index]
//不可描述的事情
}
?
//index 和 subView 在循環(huán)體中都能使用到
for (index, subView) in view.subviews.enumerated() {
//不可描述的事情
}
//只用到 index
for (index, _) in view.subviews.enumerated() {
//不可描述的事情
}
//只用到 subView
for (_, subView) in view.subviews.enumerated() {
//不可描述的事情
}
first(where: )
filter是 Swift 中幾個(gè)高級(jí)函數(shù)之一,過(guò)濾集合中的元素時(shí)非常的好用,不過(guò)在某些情況下,比如獲取集合中滿足條件的第一個(gè)元素時(shí),有一個(gè)更好的選擇first(where: )
let article1 = ArticleModel(title: "11", content: "內(nèi)容1", articleID: "11111", comments: [])
let article2 = ArticleModel(title: "11", content: "內(nèi)容2", articleID: "22222", comments: [])
let article3 = ArticleModel(title: "33", content: "內(nèi)容3", articleID: "3333", comments: [])
let articles = [article1, article2, article3]
?
if let article = articles.filter({ $0.articleID == "11111" }).first {
print("\(article.title)-\(article.content)-\(article.articleID)")
}
?
if let article = articles.first(where: {$0.articleID == "11111"}) {
print("\(article.title)-\(article.content)-\(article.articleID)") //11-內(nèi)容1-11111
}
contains(where: )
這個(gè)和上面的
first(where: )幾乎一樣,比如這里要判斷文章列表里是否包含 articleID 為 11111 的文章:
?
if !articles.filter({ $0.articleID == "11111" }).isEmpty {
//不可描述的事情
}
?
if articles.contains(where: { $0.articleID == "11111"}) {
//不可描述的事情
}
forEach
當(dāng)循環(huán)體內(nèi)的邏輯比較簡(jiǎn)單時(shí),
forEach往往比for...in...來(lái)的更加簡(jiǎn)潔:
func removeArticleBy(ID: String) {
//刪庫(kù)跑路
}
?
for article in articles {
removeArticleBy(ID: $0.articleID)
}
?
articles.forEach { removeArticleBy(ID: $0.articleID) }
結(jié)語(yǔ)
讓我們的 Swift 代碼更 Swift 的方法遠(yuǎn)不止上面這些,這里要說(shuō)的是,平時(shí)寫(xiě)代碼時(shí),要刻意的使用 Swift 強(qiáng)大的特性,才能發(fā)揮它本身的價(jià)值。
而這些特性就需要大家去多看看官網(wǎng)的例子,或者一些主流的 Swift 第三方庫(kù),看看他們是如何運(yùn)用 Swift 的特性的。