有没有理由在Swift中使用选择器?

时间:2017-05-26 22:51:58

标签: swift selector

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

例如,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")
}

两个版本都是完全正常的,所以有任何(客观)理由更喜欢一个版本吗?

1 个答案:

答案 0 :(得分:4)

目标/选择器设计是API早期Objective-C遗留下来的行李。

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

使用闭包(Swift)或块(Objective-C)比使用目标/选择器方法更受欢迎。

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

  1. 可怕的"无法识别的选择器"错误。
  2. 需要为选择器创建额外的顶级方法。
  3. 在选择器方法上指定错误参数和数据类型的可能性。
  4. 在您设置需要目标/选择器的对象时,丢失所有当前上下文。
  5. 与所有这些相反的是使用闭包/阻止形式的好处。

    随着时间的推移,许多API的委托版本将被弃用并替换为闭包/块版本。如果您有选择,我建议现在使用封闭/阻止表单以避免以后需要更新,更不用说它只是更简单的解决方案。