Tenho uma classe Person que é instanciada várias vezes. Cada pessoa tem seu próprio cronômetro. Em cima do meu init
para Person
eu chamo 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)")
}
...
...
}
Portanto, posso ter 3 instâncias de Person em uma matriz de Person[]
. Estou recebendo um erro:
2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implement methodSignatureForSelector: -- trouble ahead
Li em outro lugar que deveria herdar, NSObject
mas isso está em Swift, não em Obj-C. A função é dentro da classe, então não tenho certeza do que fazer.
class Person : NSObject { ... }
. Você está procurando uma solução diferente?Respostas:
Não pense
NSObject
em uma classe Objective-C, pense nela como uma classe Cocoa / Foundation. Mesmo que você esteja usando Swift em vez de Objective-C, você ainda está usando as mesmas estruturas.Duas opções: (1) adicionar o
dynamic
atributo à função que você deseja referenciar como um seletor:Ou (2) declare
Person
como uma subclasse de eNSObject
, em seguida, chamesuper.init()
no início do seu inicializador:fonte
@objc func timerTick()
. A API NSTimer parece ser bastante dependente do Obj-C Runtime.NSTimer
usa o encaminhamento de mensagens para chamar o seletor de destino, que é um recurso Objective-C não tratado em tipos Swift por padrão. Quando você usa o@objc
atributo ou herda de uma classe Objective-C, está optando por vários recursos, incluindo o encaminhamento de mensagens.dynamic
. Ambos são bons e ainda funcionam, mas o usodynamic
desta função pode ser visto como uma abordagem mais leve.Desde XCode6 beta 6, você pode usar funções 'dinâmicas'
fonte
Eu tive um erro semelhante ao tentar usar
let encodedArchive = NSKeyedArchiver.archivedDataWithRootObject(archive) as NSData
onde archive era uma matriz de uma classe personalizada. Descobri que declarar essa classe personalizada como uma subclasse de NSObject e NSCoding resolveu o problema. Isso exigirá mais algumas linhas para estar em conformidade com o protocolo de NSCoding, então, para começar, terá a seguinte aparência:fonte