Swift中的NSMethodSignature

时间:2014-06-11 09:08:09

标签: objective-c swift

在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)

3 个答案:

答案 0 :(得分:5)

Swift中没有调用。但也许你从来不需要在这里进行调用:

NSMethodSignature *ms = 
    [[object.target class] instanceMethodSignatureForSelector:object.selector];

因此,您有时会形成或有权使用objecttarget访问对象(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

NSInvocation not available

重新思考你的方法。

答案 2 :(得分:1)

添加到 @matt 的答案......

如果您有多个具有相同名称和不同参数的函数,则应确保函数引用指向预期的函数。

let funcref: () -> () = object.funcName

如果你不这样做,就会发生意想不到的事情(如果你不只是出错)。我们来看看吧!


场景1:

func doStuff (withThis: Any) {}

func doStuff (withThis: Any, andThis: Any, alsoThis: Any) {}

let funcref = doStuff

在这种情况下,没有错误funcref等于最多参数的函数。

仅在以下情况下发生:

•一个功能需要正好1个参数

•另一个功能采用多于1个参数


场景2:

func doStuff (withThis: Any) {}

func doStuff () {}

let funcref = doStuff

在这种情况下,没有错误funcref等于无参数的功能。

仅在以下情况下发生:

•一个功能需要无参数

•另一个功能采用正好1个参数


场景3:

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个或更多参数并具有相同的名称


场景4:

func doStuff () {}

func doStuff (withThis: Any, andThis: Any) {}

let funcref = doStuff

在这种情况下,funcref的行会出错:

Ambiguous use of 'doStuff'

仅在以下情况下发生:

•以上所有情况都不相关