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

类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

我有一个被多次实例化的类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 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) {   }
}