with property parameter objc not method does argument swift

property - swift 4 selector sender



4 preguntas sobre los selectores en Swift (3)

La respuesta de @ ad121 es excelente, solo quiero agregar un poco de contexto al # 1:

El tipo de Selector se ha extendido en Swift para que sea StringLiteralConvertible . Cada vez que se espera una instancia de Selector , puede dar un literal de cadena en su lugar y se creará una instancia de Selector para usted. Esto significa que también puede crear una instancia de Selector partir de un literal de cadena manualmente:

let mySelector: Selector = "methodName:withParameter:"

Tenga en cuenta que esto no significa que una String se pueda usar indistintamente con un Selector solo funciona con literales de cadena. Lo siguiente fallará:

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

En ese caso, deberías llamar al constructor Selector ti mismo:

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

Lo siento por estas preguntas

Tengo 4 preguntas sobre Selector en swift.

Primera pregunta

Me pregunto cuál es la forma correcta de usar el selector en swift

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

VS

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

¿Deberíamos usar Selector ("methodName:") o "methodName:" de inmediato?

Ambas cosas funcionan pero ¿cuál es la correcta?

Segunda pregunta

¿Cómo llamamos a una función con un parámetro en Swift? Digamos que quiero llamar a una función como esta

func methodName(parameterOne : String, parameterTwo: String)

TERCERA pregunta

¿Cómo llamamos a un método de tipo usando Selector en swift? ¿Es incluso posible en absoluto?

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

CUARTA pregunta

¿Cuál es el propósito de esos dos puntos detrás del nombre de la función en Selector?


Pregunta 1: No creo que realmente haya una forma correcta. Personalmente prefiero la segunda forma, pero ambas funcionan, así que no creo que realmente importe.

Pregunta 2: Acabo de releer tu pregunta. Creo que te refieres a cómo llamar a eso en un selector. El selector para eso creo que sería "methodName:parameterTwo:" pero no soy positivo, ya que el selector con dos parámetros probablemente debería tener un nombre de parámetro externo para colocar en el selector donde parámetroTwo está en mi respuesta.

Respuesta de la pregunta 2 anterior (antes de editar): llamaría a esa función como methodName(variable1, parameterTwo: variable2). Si quisiera que dijeran el nombre del parámetro en la llamada, podría hacer que el encabezado methodName(calledVarName parameterOne: String, calledVarName2 parameterTwo: String) . Esto se llamaría como methodName(calledVarName: variable1, calledVarName2: variable2) . También puede definir el encabezado como methodName(#parameterOne: String, #parameterTwo: String) . Esto se llamaría como methodName(parameterOne: variable1, parameterTwo: variable2) . Lea más aquí: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

Pregunta 3: No puedo decirlo con seguridad, pero no creo que haya una manera de hacer un selector para esto. Si hay, supongo que sería "someTypeMethod"

Respuesta de la pregunta 3 anterior (antes de editar): Puede llamar a este método con SomeClass.someTypeMethod() .

Pregunta 4: los dos puntos significan que el encabezado de la función tiene un parámetro. Entonces "function1:" corresponde a func function1(someParameterName: AnyObjectHere) mientras que "function1" corresponde a func function1() .


Respondiendo a tu tercera pregunta: puedes hacerlo totalmente. Solo establece el parámetro de destino al tipo en sí.

Digamos que tienes una clase definida:

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

Ahora tomando su ejemplo, esto llamará al método de instancia:

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

Cambie el destino y la llamada se reenviará al tipo:

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