Swift-从OC到Swift 二
KVC/KVO
- Swift 支持KVC/KVO的条件
- 属性所在的类、监听器最终继承自 NSObject
- 用 @objc dynamic 修饰对应的属性
KVO
1 | // 监听器 |
block方式的KVO
1 | class Person: NSObject { |
关联对象(Associated Object)
- 在Swift中,class依然可以使用关联对象
- 默认情况,extension不可以增加存储属性
- 借助关联对象,可以实现类似extension为class增加存储属性的效果
1 | class Person {} |
资源名管理
- 参考Android的资源名管理方式
改善前
1 | let img = UIImage(named: "logo") |
改善后
1 | //枚举封装 |
资源名管理的其他思路
优化前
1 | let img = UIImage(named: "logo") |
优化后
1 | //枚举进行封装 |
多线程开发 - 异步
1 | public typealias Task = () -> Void |
多线程开发 - 异步延迟
一般用法
1 | @discardableResult //忽略返回值 |
封装使用
1 | @discardableResult |
多线程开发 - once
- dispatch_once在Swift中已被废弃,取而代之
- 以用类型属性或者全局变量\常量
- 默认自带 lazy + dispatch_once 效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17fileprivate let initTask2: Void = {
print("initTask2---------")
}()
class ViewController: UIViewController {
static let initTask1: Void = {
print("initTask1---------")
}()
override func viewDidLoad() {
super.viewDidLoad()
let _ = Self.initTask1
let _ = initTask2
}
}
多线程开发 - 加锁
- gcd信号量
1
2
3
4
5
6
7
8
9class Cache {
private static var data = [String: Any]()
private static var lock = DispatchSemaphore(value: 1)
static func set(_ key: String, _ value: Any) {
lock.wait()
defer { lock.signal() }
data[key] = value
}
} - Foundation
1
2
3
4
5
6
7
8
9
10
11
12
13//正常加锁
private static var lock = NSLock()
static func set(_ key: String, _ value: Any) {
lock.lock()
defer { lock.unlock() }
}
// 递归锁
private static var lock = NSRecursiveLock()
static func set(_ key: String, _ value: Any) {
lock.lock()
defer { lock.unlock() }
}
参考
李明杰老师课件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









