如何在Swift 3中使用可选参数创建函数选择器?

时间:2016-10-12 12:00:14

标签: ios swift swift3

我需要创建一个这样的计时器:

timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(dismissNotification(completion:)), userInfo: nil, repeats: false)

func dismissNotification(completion: (() -> ())? = nil) { ... }

但它没有显示任何原因而崩溃。为什么会这样?以及如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

(NS)Timer只允许两种类型的操作:

没有参数

  • func timerFireMethod()

使用单个参数传递受影响的(NS)Timer实例

  • func timerFireMethod(_ timer : Timer)

但是在iOS 10 / macOS 10.12中,您可以使用带有闭包的新API

class func scheduledTimer(withTimeInterval interval: TimeInterval, 
                                            repeats: Bool, 
                                              block: @escaping (Timer) -> Void) -> Timer

答案 1 :(得分:2)

该函数崩溃,因为计时器将自身传递给选择器方法。并且selector方法需要一个匿名函数。

你可以做的一件事是:

timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(dismissNotification(timer:)), userInfo: nil, repeats: false)

func dismissNotification(timer: Timer) {
    //call dismissNotification(completion) here
}
func dismissNotification(completion: (() -> ())? = nil) { ... }

此外,您可以使用dismissNotification(timer: Timer)属性将其他数据传递到Timer.userInfo函数。

答案 2 :(得分:1)

完成处理程序需要具有签名

public function posts(){
   return $this->hasMany('app\posts','id_user','id');
}

也可以省略 func dismissNotification(completion: Timer) { ... } 参数:

Timer

func dismissNotification() { ... } 还提供类似的功能,允许代码在任意队列上执行:

Dispatch