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) { }
}