我正在尝试使用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()
}
}