1. lazy新用法
在日常開發(fā)中信粮,lazy
常被用來標識懶加載,但是還可以用來避免多余開銷趁啸,優(yōu)化代碼結構强缘,案例如下:
func test() {
enum A {
case a1
case a2
case a3
}
var a: A = .a2
lazy var user = getUser()
switch a {
case .a1:
print(user.name)
case .a2:
print(user.age)
case .a3:
print("other")
}
}
func getUser() -> People {
print("========")
return People(name: "JC", age: 12)
}
- 在上面的代碼中,如果不使用
lazy
不傅,如果對象a是a2旅掂,則還是會調用getUser()
方法,造成沒必要的開銷访娶; - 如果將
var user = getUser()
分別放到case a1
和case a2
中商虐,則會造成代碼臃腫;
2. callAsFunction
如果我們給一個類實現了callAsFunction
方法,則該類的實例對象可以直接通過obj()
的形式去執(zhí)行callAsFunction方法秘车。
extension String {
public func callAsFunction(_ s: String) -> Self {
return self + s
}
}
// 調用
print("0"("123"))
輸出
0123
3. 使用withExtendedLifetime擴展self的生命周期
self.closure = { [weak self] in
withExtendedLifetime(self) {
// ...
}
}
4. 圖片Base64字符串轉為圖片Data
func getCleanBase64String( _ base64String: String) -> Data? {
let cleanStr = base64String
.replacingOccurrences(of: "data:image/png;base64,", with: "")
.replacingOccurrences(of: "data:image/jpeg;base64,", with: "")
return Data.init(base64Encoded: cleanedBase64String, options: .ignoreUnknownCharacters)
}