4 Вопросы о селекторах в Swift

Извините за эти вопросы.

У меня есть 4 вопроса о Selector in swift.

ПЕРВЫЙ вопрос

Мне интересно, как правильно использовать селектор в быстрой

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)

ТРЕТИЙ Вопрос

Как мы называем метод типа с помощью Selector в swift? это вообще возможно?

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

ЧЕТВЕРТЫЙ вопрос

Какова цель этого двоеточия за именем функции в Selector?

Ответы

Ответ 1

Вопрос 1: Я не думаю, что есть правильный путь. Я лично предпочитаю второй способ, но оба работают, поэтому я не думаю, что это действительно имеет значение.

Вопрос 2: Я просто перечитываю вопрос. Я думаю, вы имеете в виду, как назвать это в селекторе. Селектор для этого, я считаю, будет "methodName:parameterTwo:", но я не уверен, поскольку селектор с двумя параметрами, вероятно, должен иметь имя внешнего параметра для размещения в селекторе, где параметрTwo в моем ответе.

Старый вопрос 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

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

Ответ 3

Отвечая на ваш третий вопрос: вы можете это сделать полностью. Просто установите целевой параметр самому типу.

Скажем, у вас есть определенный класс:

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

Теперь, беря ваш пример, это вызовет метод экземпляра:

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

Измените цель, и вызов будет перенаправлен на тип:

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