关于Swift选择器的4个问题

时间:2015-01-28 03:53:54

标签: swift

对不起这些问题

我在swift中有4个关于Selector的问题。

第一个问题

我想知道在swift

中使用selector的正确方法是什么
closeBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Stop, target: self, action: Selector("closeBarButtonItemClicked:"));

VS

closeBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Stop, target: self, action: "closeBarButtonItemClicked:");

我们应该立即使用Selector(“methodName:”)还是“methodName:”?

两种方式都有效但哪一种方法正确?

第二个问题

我们如何使用Swift中的参数调用函数?假设我想调用这样的函数

func methodName(parameterOne : String, parameterTwo: String)

第三个问题

我们如何在swift中使用Selector调用类型方法?它甚至可能吗?

class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
  }
}

第四个问题

Selector中函数名后面冒号的目的是什么?

3 个答案:

答案 0 :(得分:17)

@ ad121的答案很棒 - 只想为#1添加一些上下文:

Selector类型已在Swift中扩展为StringLiteralConvertible。每当需要Selector实例时,您可以改为给出一个字符串文字,并为您创建一个Selector实例。这意味着您还可以手动从字符串文字创建Selector实例:

let mySelector: Selector = "methodName:withParameter:"

请注意,此不会表示String可以与Selector互换使用 - 这仅适用于字符串文字。以下内容将失败:

let methodName = "methodName:withParameter:"
let mySelector: Selector = methodName
// error: 'String' is not convertible to 'Selector'

那个的情况下,您需要自己实际调用Selector构造函数:

let methodName = "methodName:withParameter:"
let mySelector = Selector(methodName)

答案 1 :(得分:14)

问题1: 我认为没有一种正确的方法。我个人更喜欢第二种方式,但两者都有效,所以我认为这不重要。

问题2: 我刚读过你的问题。我认为你的意思是如何在选择器中调用它。我相信的选择器是"methodName:parameterTwo:",但我不是肯定的,因为带有两个参数的选择器可能应该有一个外部参数名称放在选择器中,其中parameterTwo在我的答案中。

旧问题2答案(编辑前): 您可以将该函数称为methodName(variable1, parameterTwo: variable2).如果您想让他们在调用中说出参数名称,您可以设置标题methodName(calledVarName parameterOne: String, calledVarName2 parameterTwo: String)。这将被称为methodName(calledVarName: variable1, calledVarName2: variable2)。您还可以将标头定义为methodName(#parameterOne: String, #parameterTwo: String)。这将被称为methodName(parameterOne: variable1, parameterTwo: variable2)。在此处阅读更多内容:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

问题3: 我无法肯定地说,但我认为没有办法为此制作一个选择器。如果有,我认为它将是" someTypeMethod"

旧问题3答案(编辑前): 您可以通过SomeClass.someTypeMethod()调用此方法。

问题4: 冒号表示函数头有参数。因此"function1:"对应func function1(someParameterName: AnyObjectHere),而"function1"对应func function1()

答案 2 :(得分:4)

回答你的第3个问题:你完全可以做到这一点。只需将目标参数设置为类型本身即可。

假设您定义了一个类:

UdpClient

现在举个例子,这将调用实例方法:

class SomeType {
    class func someMethod() {}
    func someMethod() {}
}

更改目标,呼叫将转发到类型:

let something = SomeType()
let closeBarButtonItem = UIBarButtonItem(barButtonSystemItem:UIBarButtonSystemItem.Stop, target: something, action: "someMethod")