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

时间:2014-06-25 18:11:27

标签: swift

我有一个类Person,它被多次实例化。每个人都有自己的计时器。在init Person 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[]

所以我可能在2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implement methodSignatureForSelector: -- trouble ahead 数组中有3个Person实例。我收到一个错误:

NSObject

我在别处读到我应该从{{1}}继承,但这是在Swift而不是Obj-C。该功能在课堂内,所以我不知道该怎么做。

2 个答案:

答案 0 :(得分:159)

不要将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()
    }
}

答案 1 :(得分:32)

自XCode6 beta 6以来,您可以使用' dynamic' FUNC

dynamic func timerTick() { .... }