Wenn Sie vor iOS 10 zielen, können Sie keine Funktion an NSTimer
übergeben, da zu diesem Zeitpunkt keine API zur Unterstützung von Abschlussrückrufen eingeführt wurde.
iOS 10 und später Ansatz
// swift 2.x users should still use NSTimer instead
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { timer in
// ...
}
generalistischen Ansatz
Sie diese Klasse hinzufügen können, und es jederzeit wieder verwenden:
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)
}
}
Mit dieser Klasse können Sie tu das jetzt einfach:
let invocation = TimerInvocation {
/* invocation code here */
}
NSTimer.scheduledTimerWithTimeInterval(1, target: invocation, selector:#selector(TimerInvocation.invoke), userInfo: nil, repeats: false)
Sie nicht über die Beibehaltung der invocation
Variable kümmern müssen, da sie durch NSTimer
Sie können dies nicht tun, myFunc2 als eine Klassenmethode –
@DanielKrom, meinst du _instance Methode auf der obersten Ebene in der Klasse_ (oder so ähnlich), vielleicht? – holex
@holex Ja, vergessen, dass Klassenmethode bedeutet hier statische –