Swift3 执行关闭时的EXC\u错误访问
我想在延迟时间后执行关闭,但发生了运行时错误。我知道GCD可以做得更容易,但我想知道为什么 谢谢 这是我的密码: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)
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闭包作为对象。这是类型不匹配。这是一个准确的答案。谢谢。这是一个准确的答案。谢谢。