Если вы настроили таргетинг на pre-iOS 10, вы не можете передать функцию NSTimer
, потому что тогда API не был введен для поддержки обратных вызовов замыкания.
IOS 10, а затем подход
// swift 2.x users should still use NSTimer instead
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { timer in
// ...
}
Общий подход
Вы можете добавить этот класс, и использовать его в любое время:
final class TimerInvocation: NSObject {
var callback:() ->()
init(callback: @escaping() ->()) {
self.callback = callback
}
func invoke() {
callback()
}
}
extension Timer {
static func scheduleTimer(timeInterval: TimeInterval, repeats: Bool, invocation: TimerInvocation) {
Timer.scheduledTimer(
timeInterval: timeInterval,
target: invocation,
selector: #selector(TimerInvocation.invoke(timer:)),
userInfo: nil,
repeats: repeats)
}
}
С помощью этого класса, вы можете просто сделайте это сейчас:
let invocation = TimerInvocation {
/* invocation code here */
}
NSTimer.scheduledTimerWithTimeInterval(1, target: invocation, selector:#selector(TimerInvocation.invoke), userInfo: nil, repeats: false)
Вам не придется беспокоиться о сохранении переменной invocation
, поскольку она удерживается NSTimer
Вы не можете сделать это, объявите myFunc2 как метод класса –
@ DanielKrom, вы имеете в виду метод _instance на верхнем уровне класса_ (или что-то в этом роде), может быть? – holex
@holex Да, забыл, что метод класса означает статичный здесь –