gpt4 book ai didi

swift - 在 Swift 中使用选择器有什么理由吗?

转载 作者:搜寻专家 更新时间:2023-10-31 22:19:17 25 4
gpt4 key购买 nike

具体来说,当一项任务可以使用或不使用选择器进行补充时,是否有任何(客观)理由偏爱一种方式而不是另一种方式?

例如,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-C 遗留下来的包袱,API 的预阻塞时代。

如果 Apple 今天重做所有这些 API,整个目标/选择器设计将消失,并全部被 block /闭包取代。更新的 Apple API 支持这个想法。示例 - 旧的 UIAlertView 使用委托(delegate)。较新的 UIAlertController 仅使用闭包/ block 来进行警报操作。

使用闭包 (Swift) 或 block (Objective-C) 比使用目标/选择器方法更可取。

以下是使用目标/选择器的问题:

  1. 可怕的“无法识别的选择器”错误。
  2. 需要专门为选择器创建一个额外的顶级方法。
  3. 在选择器方法上指定错误参数和数据类型的可能性。
  4. 在设置需要目标/选择器的对象时失去所有当前上下文。

与所有这些相反的是使用闭包/ block 形式的好处。

随着时间的推移,许多委托(delegate)版本的 API 可能会被弃用并替换为闭包/ block 版本。如果您有选择,我建议现在使用闭包/ block 形式以避免以后需要更新,更不用说它只是更简单的解决方案。

关于swift - 在 Swift 中使用选择器有什么理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com