suzuki sport precio boosterjet swift

precio - swift sport



Error del compilador: el método con el selector Objective-C entra en conflicto con la declaración anterior con el mismo selector Objective-C (6)

Estoy empezando a aprender Swift y he seguido las muy buenas conferencias en video de la Universidad de Stanford en YouTube. Aquí hay un enlace si está interesado o ayuda (aunque no es necesario que comprenda mi problema):

Desarrollo de aplicaciones iOS 8 con Swift - 2. Más Xcode y Swift, MVC

Mientras seguía las conferencias llegué a un punto en el que (por lo que podía ver) mi código era idéntico al código en el video, pero en mi sistema recibí un error del compilador. Después de muchas pruebas y errores, he logrado reducir mi código a dos ejemplos, uno de los cuales genera un error, el otro o el que no, pero no tengo idea de qué está causando el error o cómo resolverlo.

El código que crea el error es:

import UIKit class BugViewController: UIViewController { func perform(operation: (Double) -> Double) { } func perform(operation: (Double, Double) -> Double) { } }

Esto crea el siguiente error del compilador:

Método ''perform'' con el selector Objective-C ''perform:'' entra en conflicto con la declaración anterior con el mismo selector Objective-C

Simplemente eliminando la subclasificación de UIViewController, el código compila:

import UIKit class BugViewController { func perform(operation: (Double) -> Double) { } func perform(operation: (Double, Double) -> Double) { } }

Otra información que puede o no ser relevante:

  • Recientemente he actualizado a Yosemite.
  • Cuando instalé Xcode, terminé con una versión Beta (Versión 6.3 (6D543q)) porque (si no recuerdo mal) esta era la versión que necesitaba ejecutar en mi versión de OS X.

Estoy medio esperando que esto sea un error en el compilador porque de lo contrario esto no tiene ningún sentido para mí. Cualquier ayuda muy agradecida recibida!


Como ya se ha respondido, ObjC no admite la sobrecarga de métodos (dos métodos con el mismo nombre) y en Swift 2 bajo Xcode 7 hay dos opciones para resolver este tipo de problemas. Una opción es cambiar el nombre del método utilizando el atributo: @objc(newNameMethod:)

func methodOne(par1, par2) {...} @objc(methodTwo:) func methodOne(par1) {...}

Otra opción para resolver este problema en Xcode 7+ es aplicar el atributo @nonobjc a cualquier método, subíndice o inicializador.

func methodOne() {...} @nonobjc func methodOne() {...}


El problema es que UIViewController es una clase @objc . Al heredar de UIViewController , BugViewController también es una clase @objc .

Esto significa que debe cumplir con las reglas de los selectores Objective-C (el nombre de un método). Los métodos func perform(operation: (Double) -> Double) y func perform(operation: (Double, Double) -> Double) tienen el mismo selector @selector(perform:) . Esto no esta permitido.

Para resolver esto, use diferentes nombres: como func perform1(operation: (Double) -> Double) y func perform2(operation: (Double, Double) -> Double) .

Creo que la mejor manera de manejar esto es darles a sus métodos perform() nombres más descriptivos. ¿Qué hacen estos métodos? ¿Cómo cambian el estado del controlador de vista? Mire los otros métodos de UIViewController para tener una idea del estilo de denominación de métodos, o lea Los nombres de métodos deben ser expresivos y únicos dentro de una clase



Objective-C no admite la sobrecarga de métodos, debe usar un nombre de método diferente. Cuando heredaste UIViewController, heredaste NSObject e hiciste la clase interopable con Obj-C. Swift, por otro lado, admite la sobrecarga, es por eso que funciona cuando elimina la herencia.


Obtuve el mismo error debido a que tengo dos métodos con la misma firma Obj-C:

static func prepareForUpSyncing(obj : NSManagedObject!) -> Bool static func prepareForUpSyncing(objs : [NSManagedObject]!) -> Bool

No quería marcar a uno de ellos como @nonobjc debido a la posibilidad de consecuencias imprevistas en el tiempo de ejecución. (Alguien puede corregirme si no hay posibilidad)

Lo resolvió usando la función de nombre de parámetro externo de Swift (hice el nombre externo igual que el nombre local) al segundo método, que efectivamente cambia la firma del método Obj-c:

static func prepareForUpSyncing(objs objs : [NSManagedObject]!) -> Bool {


Yo también estoy tomando el curso de Standford y me quedé atrapado aquí por mucho tiempo también, pero después de buscar, encontré algo desde aquí: notas de lanzamiento de Xcode y mencionó algo a continuación:

Swift 1.2 es estricto sobre la comprobación de la sobrecarga basada en tipos de los métodos e inicializadores @objc, algo que no es compatible con Objective-C.

// Has the Objective-C selector "performOperation:". func performOperation(op: NSOperation) { /* do something */ } // Also has the selector "performOperation:". func performOperation(fn: () -> Void) { self.performOperation(NSBlockOperation(block: fn)) }

Este código funcionaría cuando se invoca desde Swift, pero podría bloquearse fácilmente si se invoca desde Objective-C. Para resolver este problema, use un tipo que no sea compatible con Objective-C para evitar que el compilador Swift exponga al miembro al tiempo de ejecución de Objective-C:

  • Si tiene sentido, marque el miembro como privado para deshabilitar la inferencia de @objc.
  • De lo contrario, use un parámetro ficticio con un valor predeterminado, por ejemplo: _ nonobjc: () = (). (19826275)

No se infiere que las anulaciones de métodos expuestos a Objective-C en subclases privadas son @objc, lo que hace que el compilador Swift se bloquee. Agregue explícitamente el atributo @objc a cualquiera de estos métodos de anulación. (19935352)

Los símbolos de los SDK no están disponibles cuando se usa Abrir rápidamente en un proyecto o espacio de trabajo que usa Swift. (20349540)

lo que hice fue agregar "privado" frente al método de anulación como este:

private func performOperation(operation: Double -> Double) { if operandStack.count >= 1 { displayValue = operation(operandStack.removeLast()) enter() } }