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