我想在延迟时间后执行闭包,但发生了运行时错误。我知道GCD可以更容易地做到这一点,但我想知道为什么。
感谢。
这是我的代码:
func perform(_ aClosure:@escaping ()->Void, afterDelay delay: TimeInterval) {
self.perform(#selector(fire(closure:)), with: aClosure, afterDelay: delay)
}
func fire(closure:()->Void) {
closure() // error
}
self.perform({
print("closure do something... ...")
}, afterDelay: 2)
答案 0 :(得分:2)
像所有人(包括你;>)所说,使用GCD。如果您出于某种原因坚持使用perform(_:with:afterDelay:)
,请尝试将closure
参数的类型更改为Any
:
func fire(closure: Any)
{
(closure as! ()->Void)()
}
有关详细信息,请参阅this thread。另外,来自“使用Swift with Cocoa和Objective-C(Swift 3.0.1)”中的section "id Compatibility":
Objective-C id类型由Swift导入为Any类型。在 编译时和运行时,编译器引入了通用桥接 传递Swift值或对象时的转换操作 Objective-C作为id参数。将id值导入Swift时 如果是Any,运行时会自动将桥接回复到其中任何一个 类引用或Swift值类型。
NSObject
perform(_:with:afterDelay:)
API Reference:
<强>一个选择强>
一个Selector,用于标识要调用的方法。方法 不应该有一个重要的回报值,应该采取一个单一的 类型为id的参数,或者没有参数。