Swift中有很多有用的小技巧,用好了能使代碼更加安全伊诵,簡潔单绑,易于理解或效率更加高效,在這記錄一些編寫swifty code的小技巧曹宴。
1搂橙、for in 循環(huán)中的可選值解包
當使用for in
循環(huán)一個包含可選值的數(shù)組時,我們可能會使用if let
或guard
解包:
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)工廠方法
賞我一個贊吧~~~