pass parameter create swift

parameter - swift create selector



El objeto X de la clase Y no implementa methodSignatureForSelector en Swift (3)

Desde XCode6 beta 6, puede usar func ''dinámico''

dynamic func timerTick() { .... }

Tengo una persona de clase que se instancia varias veces. Cada persona obtiene su propio temporizador. En mi init para Person , llamo startTimer() .

class Person { var timer = NSTimer() func startTimer() { timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("timerTick"), userInfo: nil, repeats: true) } func timerTick() { angerLevel++ println("Angry! /(angerLevel)") } ... ... }

Entonces puedo tener 3 instancias de Persona en una matriz de Person[] . Me aparece un error:

2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class ''_TtC11ThisProgram6Person'' does not implement methodSignatureForSelector: -- trouble ahead

Leí en otra parte que debería heredar de NSObject pero esto está en Swift no en Obj-C. La función está dentro de la clase, así que no estoy seguro de qué hacer.


No piense en NSObject como una clase Objective-C, piense en ella como una clase Cocoa / Foundation. Aunque está utilizando Swift en lugar de Objective-C, todavía está utilizando todos los mismos marcos.

Dos opciones: (1) agregue el atributo dynamic a la función a la que desea hacer referencia como selector:

dynamic func timerTick() { self.angerLevel++ print("Angry! /(self.angerLevel)") }

O (2) declare a Person como una subclase de NSObject , luego simplemente llame a super.init() al comienzo de su inicializador:

class Person: NSObject { var timer = NSTimer() var angerLevel = 0 func startTimer() { print("starting timer") timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timerTick", userInfo: nil, repeats: true) } func timerTick() { self.angerLevel++ print("Angry! /(self.angerLevel)") } override init() { super.init() self.startTimer() } }


Tuve un error similar al intentar usar let encodedArchive = NSKeyedArchiver.archivedDataWithRootObject(archive) as NSData donde archive era una matriz de una clase personalizada. Encontré eso declarando que la clase personalizada como una subclase de NSObject y NSCoding hizo el truco. Se requerirán unas pocas líneas más para cumplir con el protocolo de NSCoding, así que se verá algo así para empezar:

class Person: NSObject, NSCoding { init() { super.init() } func encodeWithCoder(_aCoder: NSCoder) { } }