在ObjC中我有:
NSMethodSignature *ms = [[object.target class] instanceMethodSignatureForSelector:object.selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:ms];
在Swift中我收到错误:
'NSObject' does not have a member named 'instanceMethodSignatureForSelector'
当我尝试这个时:
var ms:NSMethodSignature? = (object.target.dynamicType as NSObject).instanceMethodSignatureForSelector(object.success)
答案 0 :(得分:5)
Swift中没有调用。但也许你从来不需要在这里进行调用:
NSMethodSignature *ms =
[[object.target class] instanceMethodSignatureForSelector:object.selector];
因此,您有时会形成或有权使用object
和target
访问对象(selector
)。这表明当时你可能已经形成了一个闭包,你可以在该闭包上调用该方法。例如:
let clos = {() -> () in object.someMethod(); return; }
现在,您拥有clos
类型的值() -> ()
,您可以存储,传递等等。到时候,你只需要打电话:
clos()
或者,根据具体情况,您可以直接存储对该方法的引用:
let funcref = object.someMethod
再次,你可以稍后再说:
funcref()
现在我们已经拥有了作为一流语言公民的封闭和功能,在许多情况下,Objective-C的活力将变成一个不再需要的拐杖。
如果您发现自己确实需要它,那么Objective-C并没有消失,您可以将它混合到您的项目中。
答案 1 :(得分:3)
获取方法签名非常简单:
var target = NSObject()
var selector = Selector("success")
var signature: NSMethodSignature? = target.methodSignatureForSelector(selector)
但是,禁止使用NSInvocation
:
重新思考你的方法。
答案 2 :(得分:1)
添加到 @matt 的答案......
如果您有多个具有相同名称和不同参数的函数,则应确保函数引用指向预期的函数。
let funcref: () -> () = object.funcName
如果你不这样做,就会发生意想不到的事情(如果你不只是出错)。我们来看看吧!
func doStuff (withThis: Any) {}
func doStuff (withThis: Any, andThis: Any, alsoThis: Any) {}
let funcref = doStuff
在这种情况下,没有错误,funcref
等于最多参数的函数。
仅在以下情况下发生:
•一个功能需要正好1个参数
•另一个功能采用多于1个参数
func doStuff (withThis: Any) {}
func doStuff () {}
let funcref = doStuff
在这种情况下,没有错误,funcref
等于无参数的功能。
仅在以下情况下发生:
•一个功能需要无参数
•另一个功能采用正好1个参数
func doStuff () {}
func doStuff (withThis: Any) {}
func doStuff (withThis: Any, andThis: Any) {}
func doStuff (withThis: Any, andThis: Any, alsoThis: Any) {}
let funcref = doStuff
在这种情况下,funcref
的行会出错:
Could not find an overload for 'doStuff' that accepts the supplied arguments
仅在以下情况下发生:
•超过3个功能需要1个或更多参数并具有相同的名称
func doStuff () {}
func doStuff (withThis: Any, andThis: Any) {}
let funcref = doStuff
在这种情况下,funcref
的行会出错:
Ambiguous use of 'doStuff'
。
仅在以下情况下发生:
•以上所有情况都不相关