在 Swift 中使用选择器有什么理由吗?
Is There Any Reason to Use Selectors in Swift?
具体来说,当一项任务可以使用或不使用选择器进行补充时,是否有任何 (objective) 理由选择一种方式而不是另一种方式?
例如,NSTimer 可以通过两种方式 运行 间隔上的方法:
A) 使用选择器:
let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction()), userInfo: nil, repeats: true)
dynamic func timerAction() {
print("foo")
}
B) 没有选择器:
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
self.timerAction()
}
func timerAction() {
print("foo")
}
两个版本都完全可用,那么有任何 (objective) 理由更喜欢一个吗?
target/selector 设计是早期 Objective-C API 封锁前几天遗留下来的包袱。
如果 Apple 今天重做所有这些 API,整个 target/selector 设计将会消失,并全部替换为 blocks/closures。更新的 Apple API 支持这个想法。示例 - 旧的 UIAlertView
使用委托。较新的 UIAlertController
仅使用 closures/blocks 进行警报操作。
使用闭包 (Swift) 或块 (Objective-C) 比使用 target/selector 方法更可取。
以下是使用 target/selector 的问题:
- 可怕的 "unrecognized selector" 错误。
- 需要为选择器创建一个额外的顶级方法。
- 在选择器方法上指定错误参数和数据类型的可能性。
- 在设置需要 target/selector 的对象时丢失所有当前上下文。
与所有这些相反的是使用 closure/block 表格的好处。
随着时间的推移,许多委托版本的 API 可能会被弃用并替换为 closure/block 版本。如果你有选择,我建议现在使用 closure/block 形式,以避免以后需要更新,更不用说它只是更简单的解决方案。
具体来说,当一项任务可以使用或不使用选择器进行补充时,是否有任何 (objective) 理由选择一种方式而不是另一种方式?
例如,NSTimer 可以通过两种方式 运行 间隔上的方法:
A) 使用选择器:
let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction()), userInfo: nil, repeats: true)
dynamic func timerAction() {
print("foo")
}
B) 没有选择器:
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
self.timerAction()
}
func timerAction() {
print("foo")
}
两个版本都完全可用,那么有任何 (objective) 理由更喜欢一个吗?
target/selector 设计是早期 Objective-C API 封锁前几天遗留下来的包袱。
如果 Apple 今天重做所有这些 API,整个 target/selector 设计将会消失,并全部替换为 blocks/closures。更新的 Apple API 支持这个想法。示例 - 旧的 UIAlertView
使用委托。较新的 UIAlertController
仅使用 closures/blocks 进行警报操作。
使用闭包 (Swift) 或块 (Objective-C) 比使用 target/selector 方法更可取。
以下是使用 target/selector 的问题:
- 可怕的 "unrecognized selector" 错误。
- 需要为选择器创建一个额外的顶级方法。
- 在选择器方法上指定错误参数和数据类型的可能性。
- 在设置需要 target/selector 的对象时丢失所有当前上下文。
与所有这些相反的是使用 closure/block 表格的好处。
随着时间的推移,许多委托版本的 API 可能会被弃用并替换为 closure/block 版本。如果你有选择,我建议现在使用 closure/block 形式,以避免以后需要更新,更不用说它只是更简单的解决方案。