类Y的对象X未在Swift中实现methodSignatureForSelector
我有一个被多次实例化的类Person,每个人都有自己的计时器。在我的类Y的对象X未在Swift中实现methodSignatureForSelector,swift,Swift,我有一个被多次实例化的类Person,每个人都有自己的计时器。在我的init中为Person调用startTimer() 因此,在Person[]的数组中,我可能有3个Person实例。我得到一个错误: 2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implemen
init
中为Person
调用startTimer()
因此,在Person[]
的数组中,我可能有3个Person实例。我得到一个错误:
2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implement methodSignatureForSelector: -- trouble ahead
我在别处读到,我应该从
NSObject
继承,但这是在Swift中,而不是在Obj-C中。函数在类中,因此我不确定该做什么 不要将NSObject
视为Objective-C类,而应将其视为Cocoa/Foundation类。尽管您使用的是Swift而不是Objective-C,但仍然使用相同的框架
两个选项:(1)将dynamic
属性添加到要作为选择器引用的函数中:
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以来,您可以使用“动态”func
dynamic func timerTick() { .... }
我在尝试使用时也遇到了类似的错误
将encodedArchive=NSKeyedArchiver.archivedDataWithRootObject(archive)设为NSData
,其中archive是自定义类的数组。我发现,将该自定义类声明为NSObject的子类和NSCoding就可以做到这一点。它将需要更多的行来符合NSCoding协议,因此它将从以下内容开始:
class Person: NSObject, NSCoding {
init() {
super.init()
}
func encodeWithCoder(_aCoder: NSCoder) { }
}
您已经计算出该类应该从NSObject:
类Person:NSObject{…}
继承。您正在寻找不同的解决方案吗?您还应该能够像这样装饰函数声明@objc func timerTick()
。NSTimer API似乎非常依赖于Obj-C运行时。很好的调用-添加到应答器感谢这修复了我的问题。但你能解释一下原因吗?它需要什么@objc部分?NSTimer
使用消息转发来调用目标选择器,这是默认情况下Swift类型上不处理的Objective-C功能。当您使用@objc
属性或从Objective-C类继承时,您可以选择多种功能,包括消息转发。这两种解决方案都不再需要了。只需声明选择器函数动态
。它们都很好,而且仍然可以工作,但是在这一个函数上使用dynamic
可能是一种更轻量级的方法。这解决了我尝试使用UILocalizedIndexedCollation.currentCollation()的问题。与使整个类从NSObject继承相比,这是一种更好的方法。
class Person: NSObject, NSCoding {
init() {
super.init()
}
func encodeWithCoder(_aCoder: NSCoder) { }
}