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
我读其他地方,我应该从NSObject
inheritance,但这是在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) { } }