当Swift中使用外部参数名时,它的方法签名是什么?

3

我在我的Swift代码中使用了一个NSTimer对象,它要求将方法签名传递给其“selector”参数,以便循环执行该方法。当该方法签名没有外部参数名称时,即

func timerMethod(internal: String) { ... }

我可以这样将计时器对象传递给签名:

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
        target: self,
        selector: Selector("timerMethod:"),
        userInfo: userInfo,
        repeats: true)

然而,如果我为该方法提供一个含有外部参数名称的签名,如下所示:
func timerMethod(external internal: String) { ... }

我不知道如何调用这个方法。我尝试使用以下方法进行日志记录:

println("\(__FUNCTION__)")

以下是记录哪些内容的日志:

timerMethod(external:)

但是,无论我尝试什么或者以下任何方法,都会收到“未识别的选择器”异常:
timerMethod:
timerMethod:external
timerMethod:external:
timerMethod:(external)
timerMethod:(external:)
timerMethod(external):

目前还没有头绪。有人遇到类似的情况吗?
3个回答

5

这里有一个方法timerMethodWithExternal:,你可以使用object_getClass(t).instancesRespondToSelector(Selector("timerMethodWithExternal:"))来测试它。

我使用以下代码进行内省:

func with(t: Test, inout count : CUnsignedInt) -> UnsafePointer<Method> {
    var mc : CUnsignedInt = 0
    return class_copyMethodList(object_getClass(t), &count)
}

var i=0
var mc : CUnsignedInt = 0
var t = Test()
var mlist = with(t,&mc)
var n : Int = Int(mc)
for (i=0; i<n;i++) {
    println(sel_getName(method_getName(mlist[i])))
}

绝对太棒了。我真的很惊讶这个能够运行。谢谢 Christian。 - Kyle G

1
尽管您的方法签名看起来不正确,但在Swift中,您只需将selector作为字符串名称传递即可。苹果文档如下所示:
“由于字符串字面量可以自动转换为选择器,因此您可以将字符串字面量传递给接受选择器的任何方法。”
至于NSTimer.scheduledTimerWithTimeInterval的签名,苹果文档说明如下(请参见NSTimer文档,Swift信息):
“选择器应具有以下签名:timerFireMethod:(包括冒号以指示该方法需要一个参数)。计时器将自身作为参数传递,因此该方法将采用以下模式:”
func timerFireMethod(timer: NSTimer) { }

当你定义自己的方法时:
func timerMethod(external internal: String) { ... }

如果您没有满足所需的签名,则无法正常调用。预期的调用为:
someMethod(timer: ...)

但你的调用将是:
someMethod(external: ...)

此外,参数应该是类型为NSTimer而不是String。你第一次尝试可能很幸运地成功了。

抱歉,我在使用String类型的参数时误导了您,我复制了另一个函数的签名。实际上,我正在使用NSTimer作为我所使用的方法的类型。 - Kyle G

0

顺便说一下,我遇到了同样的问题,并且通过检查我的项目派生数据文件夹中的Xcode生成的头文件来确认正确的选择器名称。

只需在〜/Library/Developer/Xcode/DerivedData中搜索您的方法名称,对于原帖的示例,您会发现要使用的选择器是timerMethodWithExternal:(从其Objective-C定义中)。

我相信即使是纯Swift项目也会生成此标头,但我测试的项目中有一些Objective-C。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接