在Swift 2中,我能够使用dispatch_after来延迟使用中央调度的动作:

var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
    // your function here 
})

但这似乎不再编译自Swift 3。在现代Swift中,首选的写法是什么?


当前回答

DispatchQueue.main打电话。after(when: DispatchTime, execute: () -> Void)

我强烈建议使用Xcode工具转换到Swift 3(编辑>转换>到当前Swift语法)。它帮我抓住了这个

其他回答

在Swift 3发布后,@escaping也必须被添加

func delay(_ delay: Double, closure: @escaping () -> ()) {
  DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
    closure()
  }
}

一个有点不同风格的公认答案。

斯威夫特4

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 + .milliseconds(500) + 
.microseconds(500) + .nanoseconds(1000)) {
                print("Delayed by 0.1 second + 500 milliseconds + 500 microseconds + 
                      1000 nanoseconds)")
 }

Swift 5及以上

DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
   // code to execute                 
})

如果你只是想把延迟函数

Swift 4 & 5

func delay(interval: TimeInterval, closure: @escaping () -> Void) {
     DispatchQueue.main.asyncAfter(deadline: .now() + interval) {
          closure()
     }
}

你可以这样使用它:

delay(interval: 1) { 
    print("Hi!")
}

斯威夫特4:

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
   // Code
}

对于时间。秒(Int), .微秒(Int)和.纳秒(Int)也可以使用。