Swift3 执行关闭时的EXC\u错误访问

Swift3 执行关闭时的EXC\u错误访问,swift3,Swift3,我想在延迟时间后执行关闭,但发生了运行时错误。我知道GCD可以做得更容易,但我想知道为什么 谢谢 这是我的密码: func perform(_ aClosure:@escaping ()->Void, afterDelay delay: TimeInterval) { self.perform(#selector(fire(closure:)), with: aClosure, afterDelay: delay) } func fire(closure:()->Void)

我想在延迟时间后执行关闭,但发生了运行时错误。我知道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)
就像每个人(包括你;>)说的那样,使用GCD。如果出于任何原因,您坚持使用
perform(:with:afterDelay:)
,请尝试将
closure
参数的类型更改为
Any

func fire(closure: Any)
{
    (closure as! ()->Void)()
}
有关更多信息,请参阅。此外,在“将Swift与Cocoa和Objective-C(Swift 3.0.1)结合使用”中:

Objective-C id类型由Swift作为任何类型导入。在 编译时和运行时,编译器引入了通用桥接 将Swift值或对象传递到 Objective-C作为id参数。将id值导入Swift时 与任何情况一样,运行时都会自动处理桥接回 类引用或Swift值类型

NSObject
执行​与:​之后​延迟:​)

a​选择器
标识要调用的方法的选择器。方法 不应具有显著的返回值,且应采用单个 id类型的参数,或没有参数

就像每个人(包括您;>)说的那样,使用GCD。如果出于任何原因,您坚持使用
perform(:with:afterDelay:)
,请尝试将
closure
参数的类型更改为
Any

func fire(closure: Any)
{
    (closure as! ()->Void)()
}
有关更多信息,请参见“将Swift与Cocoa和Objective-C(Swift 3.0.1)一起使用”中的:

Objective-C id类型由Swift作为任何类型导入。在 编译时和运行时,编译器引入了通用桥接 将Swift值或对象传递到 目标-C作为id参数。将id值导入Swift时 与任何情况一样,运行时都会自动处理桥接回 类引用或Swift值类型

NSObject
执行​与:​之后​延迟:​)

a​选择器
标识要调用的方法的选择器。方法 不应具有显著的返回值,且应采用单个 id类型的参数,或没有参数


我认为这是因为选择器不希望Swift闭包作为对象。这是类型不匹配。我认为这是因为选择器不希望Swift闭包作为对象。这是类型不匹配。这是一个准确的答案。谢谢。这是一个准确的答案。谢谢。