如何通过performSelector传递块参数



我正在尝试使用performSelector方法来调度函数并将块作为参数传递。

import Foundation
class SomeClass: NSObject {
@objc func foo() {
print("foo...")
let selectorName = "bar:"
let selector = Selector(selectorName)
if self.responds(to: selector) {
let block = { () in
print("block")
}
self.perform(selector, with: block) //this will crash
//            self.bar(block) //this will be ok
}
}

@objc func bar(_ arg1: @escaping ()->()) {
print("bar...")
arg1()
}
}
let someClass = SomeClass()
someClass.foo()

如示例代码所示,当使用self.perform(selector, with: block)时,它将崩溃。我的问题是如何通过performSelector传递块参数

如果您查看perform的文档,它会显示:

此方法与perform(_:(相同,只是可以为Selector提供一个参数。aSelector应标识接受id类型为的单个参数的方法。

id是指向objective-c对象的指针。在Swift中,您将被限制为传递从NSObject继承的对象。闭合不符合这些要求。如果必须的话,你可以这样做:

class Block: NSObject {
let block: () -> Void
init(block: @escaping () -> Void) {
self.block = block
}
}
class SomeClass: NSObject {
@objc func foo() {
print("foo...")
let selectorName = "bar:"
let selector = Selector(selectorName)
if self.responds(to: selector) {
let block = Block {
print("block")
}
self.perform(selector, with: block)
}
}
@objc func bar(_ arg1: Block) {
print("bar...")
arg1.block()
}
}

最新更新