For repeated calling of a function, the Timer class is available (used to be called NSTimer). So perhaps you had the following code in your Swift 3 project:
private var timer: Timer?
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.timer = Timer.scheduledTimer( timeInterval: 1.0, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true) }
func timerAction() { // Do something }
When you move your project to Swift 4 (via Xcode 9), then first you get the following warning:
The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "blah" target.
You can fix this warning by updating the project settings and update the code as follows:
@objc func timerAction() { // Do something }
For some reason, I don't like seeing that @objc in my projects. There's an alternative, and that's not to use Timer at all, but instead move to GCD:
private let timer = DispatchSource.makeTimerSource()
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) timer.schedule(deadline: .now(), repeating: 1.0) timer.setEventHandler { DispatchQueue.main.sync { self.timerAction() } } timer.activate() }
Have fun with Swift 4 :)