Y类的对象X在Swift中没有实现methodSignatureForSelector

我有一个多次实例化的类Person。每个人都有自己的计时器。 在我的Person init我调用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)") } ... ... } 

所以我可能在Person[]的数组中有Person[] 3个实例。 我收到一个错误:

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

我读其他地方,我应该从NSObjectinheritance,但这是在Swift不是Obj-C。 该function是在课堂上,所以我不知道该怎么做。

不要把NSObject看作一个Objective-C类,把它看作是一个Cocoa / Foundation类。 即使你使用的是Swift而不是Objective-C,你仍然在使用所有相同的框架。

有两个选项:(1)将dynamic属性添加到要作为select器引用的函数中:

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

或者(2)将Person声明为NSObject的子类,然后在初始化程序的开头调用super.init()

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

由于XCode6 beta 6,你可以使用'dynamic'function

 dynamic func timerTick() { .... } 

我有一个类似的错误尝试使用let encodedArchive = NSKeyedArchiver.archivedDataWithRootObject(archive) as NSData其中档案是一个自定义类的数组。 我发现将自定义类声明为NSObject和NSCoding的子类是有用的。 这将需要更多的线来符合NSCoding的协议,所以它看起来像这样开始:

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