1. lazy新用法
在日常开发中,lazy
常被用来标识懒加载,但是还可以用来避免多余开销,优化代码结构,案例如下:
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()
的形式去执行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)
}