Ios 如何为Swift 3中带有可选参数的函数创建选择器?

Ios 如何为Swift 3中带有可选参数的函数创建选择器?,ios,swift,swift3,Ios,Swift,Swift3,我需要创建一个计时器,如下所示: timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(dismissNotification(completion:)), userInfo: nil, repeats: false) func dismissNotification(completion: (() -> ())? = nil) { ... } 但它在没有显示任何原因的情况下崩溃了

我需要创建一个计时器,如下所示:

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

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

但它在没有显示任何原因的情况下崩溃了。为什么会这样?如何解决这个问题?

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

您可以做的一件事是:

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) { ... }

此外,您还可以使用
timer.userInfo
属性将附加数据传递给
dismissNotification(timer:timer)
函数。

由于计时器将自身传递给选择器方法,因此函数崩溃。选择器方法需要一个匿名函数

您可以做的一件事是:

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) { ... }
此外,您还可以使用
timer.userInfo
属性将附加数据传递给
dismissNotification(timer:timer)
函数。

(NS)timer
仅允许两种类型的操作:

没有参数

  • func timerFireMethod()
通过单个参数传递受影响的
(NS)计时器
实例

  • func timerFireMethod(\utimer:timer)
但是,在iOS 10/macOS 10.12中,您可以使用带有闭包的新API

class func scheduledTimer(withTimeInterval interval: TimeInterval, 
                                            repeats: Bool, 
                                              block: @escaping (Timer) -> Void) -> Timer
(NS)计时器
只允许两种类型的操作:

没有参数

  • func timerFireMethod()
通过单个参数传递受影响的
(NS)计时器
实例

  • func timerFireMethod(\utimer:timer)
但是,在iOS 10/macOS 10.12中,您可以使用带有闭包的新API

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

完成处理程序需要有签名

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

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

// It's necessary to keep a reference to timer
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: DispatchTime.now(), interval: DispatchTime.seconds(2))
timer.setEventHandler() { ... } 
timer.resume()

完成处理程序需要有签名

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

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

// It's necessary to keep a reference to timer
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: DispatchTime.now(), interval: DispatchTime.seconds(2))
timer.setEventHandler() { ... } 
timer.resume()

你是对的,我试图避免为同样的目的创建另一个函数,但我必须:(你是对的,我试图避免为同样的目的创建另一个函数,但我必须:(