Swift編程小技巧

swift tips

Swift中有很多有用的小技巧,用好了能使代碼更加安全伊诵,簡潔单绑,易于理解或效率更加高效,在這記錄一些編寫swifty code的小技巧曹宴。

1搂橙、for in 循環(huán)中的可選值解包

當使用for in循環(huán)一個包含可選值的數(shù)組時,我們可能會使用if letguard解包:

 let animals = ["dog", nil, "pig", "cat", nil]
 for obj in animals {
     if let animal = obj {
         print(animal)
     }
 }

上述代碼完全沒問題浙炼,但是我們可以在for in中使用case let來簡化代碼:

for case let animal? in animals {
    print(animal)
}

或者使用compactMap解包,可以參考Swift:map(), flatMap() 和 compactMap() 的區(qū)別

for animal in animals.compactMap({$0}) {
    print(animal)
}

如上兩種方法都能時代碼更加簡潔

2份氧、for in 循環(huán)中使用 where 語句

我們都會遇到寫類似如下代碼的地方:

let items = [1, 2, 3, 4]
for item in items {
    if(item % 2 == 0) {
        print(item)
    }
}
Output: 2 4 

使用where語句可以使代碼變得更簡潔:

for item in items where item % 2 == 0 {
    print(item)
}
Output: 2 4

3、使用filter + forEach替代 for in + where

let items = [1, 2, 3, 4]
items.filter{$0 % 2 == 0}.forEach {
    print($0)
}

可以看出代碼簡潔度并沒有很大的提升弯屈,但是語義更加清晰更容易理解蜗帜。

4、Defer保證代碼塊在控制流退出前被調(diào)用

defer 所聲明的代碼塊會在當前代碼執(zhí)行退出后被調(diào)用:

func test(code: Int) {
    defer {
        print("end print in defer")
    }
    if code < 0 {
        print("less than 0")
        return
    }
    if code > 10 {
        print("big than 10")
    }
}
test(code: -1)
test(code: 11)

Output:
less than 0
end print in defer
big than 10
end print in defer

Objective-C中也可以實現(xiàn)類似的功能资厉,可以參考:Objective-C中實現(xiàn)Swift中的defer

5厅缺、布爾值取反

在任何編程語言中,布爾值都是最常用和最簡單的數(shù)據(jù)類型之一。而取反操作也是非常常見的湘捎,比如:

var isSelect = true
if isSelect {
  isSelect = false
}

上面的代碼應該不會有人寫吧诀豁,這很難說哦,哈哈哈

if isSelect {
  isSelect = !isSelect
}

這種寫法應該人多一些窥妇,也不容易出錯一些舷胜,但是我覺得下面的更好:

if isSelect {
  isSelect.toggle()
}

toggle()是一個swift提供的函數(shù),用來切換布爾變量的值活翩。

6烹骨、數(shù)組內(nèi)元素的類型轉(zhuǎn)換

常見的情況在獲取一個視圖的所有子視圖后,需要給某一類視圖做一些操作材泄,以UILabel為例

  • 使用for in 循環(huán)
for subview in self.view.subviews {
    if subview is UILabel {
        (subview as! UILabel).text = "find"
    }
}

for subview in self.view.subviews where subview is UILabel {
   (subview as! UILabel).text = "find"
}

for subview in self.view.subviews.compactMap({$0 as? UILabel}) {
    subview.text = "find"
}

for case let subview as UILabel in self.view.subviews {
    subview.text = "find"
}

此處for in 循環(huán)中明顯使用 case let 和 compactMap是最方遍沮焕,代碼最簡潔的

  • compactMap的另一種使用
self.view.subviews
    .compactMap{$0 as? UILabel}
    .forEach {
        $0.text = "find"
}

個人比較推薦這一種寫法,語義更加清晰

7拉宗、同時遍歷數(shù)組的索引和元素

let array = ["a","b","c","d"]
for (index, element) in array.enumerated() {
    print("\(index)--\(element)")
}

利用元組在swift中遍歷出索引和元素非常簡潔峦树,OC中需要使用enumerateObjectsUsingBlock來實現(xiàn)

[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"%d -- %@", idx, obj);   
}];

8、靜態(tài)工廠方法

在Swift使用靜態(tài)工廠方法和屬性來執(zhí)行對象的設置可能是一種將設置代碼與實際邏輯清晰分開的好方法,具體可以參考:Swift:靜態(tài)工廠方法

賞我一個贊吧~~~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旦事,一起剝皮案震驚了整個濱河市魁巩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌族檬,老刑警劉巖歪赢,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異单料,居然都是意外死亡,警方通過查閱死者的電腦和手機点楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門扫尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掠廓,你說我怎么就攤上這事换怖。” “怎么了蟀瞧?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵沉颂,是天一觀的道長。 經(jīng)常有香客問我悦污,道長铸屉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任切端,我火速辦了婚禮彻坛,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己昌屉,他們只是感情好钙蒙,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著间驮,像睡著了一般躬厌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竞帽,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天扛施,我揣著相機與錄音,去河邊找鬼抢呆。 笑死煮嫌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的抱虐。 我是一名探鬼主播昌阿,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恳邀!你這毒婦竟也來了懦冰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤谣沸,失蹤者是張志新(化名)和其女友劉穎刷钢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乳附,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡内地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赋除。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱缓。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖举农,靈堂內(nèi)的尸體忽然破棺而出荆针,到底是詐尸還是另有隱情,我是刑警寧澤颁糟,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布航背,位于F島的核電站,受9級特大地震影響棱貌,放射性物質(zhì)發(fā)生泄漏玖媚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一键畴、第九天 我趴在偏房一處隱蔽的房頂上張望最盅。 院中可真熱鬧突雪,春花似錦、人聲如沸涡贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽问词。三九已至督函,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間激挪,已是汗流浹背辰狡。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垄分,地道東北人宛篇。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像薄湿,于是被迫代替她去往敵國和親叫倍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 132.轉(zhuǎn)換錯誤成可選值 通過轉(zhuǎn)換錯誤成一個可選值,你可以使用 try? 來處理錯誤豺瘤。當執(zhí)行try?表達式時,如果...
    無灃閱讀 1,244評論 0 3
  • 引言 今天吆倦,開始系統(tǒng)學習Swift,以前都是零零散散的看看的let和var的區(qū)別坐求、泛型蚕泽,只知道它是一個面向協(xié)議且類...
    shiyueZ閱讀 3,642評論 0 11
  • 通常來說,編程語言教程中的第一個程序應該在屏幕上打印“Hello, world”桥嗤。在 Swift 中须妻,可以用一行代...
    雨影閱讀 825評論 0 0
  • 原文排版 有點讓我蛋疼, 將它的精髓技巧整理一下, 于是就有了本文. (侵刪) Defer管理程序控制流 defe...
    南國青天閱讀 166評論 0 0
  • 本篇主要是對《A站 的 Swift 實踐》[https://ming1016.github.io/2021/05/...
    星光社的戴銘閱讀 735評論 0 1