swift 3 中的 DISPATCH_TIME_NOW 和向后兼容性
Posted
技术标签:
【中文标题】swift 3 中的 DISPATCH_TIME_NOW 和向后兼容性【英文标题】:DISPATCH_TIME_NOW in swift 3 and Backward compatibility 【发布时间】:2016-07-15 04:37:22 【问题描述】:根据@matt 对dispatch_after
用法的this 精彩回答,我在操场上尝试了代码,它工作正常(没有错误)。但是当我尝试向后兼容时,DispatchTime.now()
仅适用于 ios 10
,如下所示:
func delay( _ delay: Double, closure: () -> ())
guard #available(iOS 10, *) else
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
return
let when = DispatchTime.now() + delay
DispatchQueue.main.after(when: when, execute: closure)
编译器提供将DISPATCH_TIME_NOW
修复为Replace "DISPATCH_TIME_NOW" with "dispatch_time_t(DISPATCH_TIME_NOW)"
并抛出错误提示
无法将“Int”类型的值转换为预期的参数类型“dispatch_time_t”(又名“UInt64”)
我尝试按照编译器提供的方式修复它,但最终出现更多错误。我应该如何在这里使用向后兼容性?我做错了什么?帮帮忙,谢谢!
【问题讨论】:
let when = dispatch_time(DISPATCH_TIME_NOW, delay)
如果DispatchTime.now()
在iOS 9 上运行,你试过了吗?一些可用性注释是错误的。
为什么要检查iOS10才能使用swift3语法? swift3 确实支持 iOS 低版本,如 7 8 9。如果你想用 swift3 在新的 Xcode8 中编译,只需编写 swift 3 语法的代码。你需要的所有代码:func delay(_delay:Double,closure:()->())DispatchQueue.main.after(when:DispatchTime.now()+delay,execute:closure)
@MartinR 不,我没有在手机上查看过。我刚刚在操场上尝试过,我得到了这些错误。当我命令单击 'DisptachTime' 和 'now()' 时,它说在 iOS 10 和 macOS 10.12 中可用。所以我想我会尝试 API 可用性,然后出现这些错误。 :(
@Dershowitz123:正如我所说:可用性注释有时是错误的。 Swift 3 代码应该在所有支持 Swift 3 的平台上运行。 – dispatch_after
是 Swift 2,不会在 Swift 3 中编译。
【参考方案1】:
DispatchTime.now()
以及几乎所有DispatchQueue
或DispatchTime
方法都适用于iOS 7、8、9 和10。文档完全不正确。
【讨论】:
以上是关于swift 3 中的 DISPATCH_TIME_NOW 和向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章
iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime
swift 笔记:iOS与JavaScript的交互(三):WKWebView 3. WKUiDelegate - 6 -3重写WKScriptMessageHandler中的用户内容控制器(_: