1. ホーム
  2. swift

[解決済み] YクラスのオブジェクトXはSwiftでmethodSignatureForSelectorを実装していない

2023-03-27 11:50:54

質問

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)")
 }
...
...
}

の配列に3つのPersonのインスタンスがあることになります。 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 を継承する必要があると他のところで読みましたが、これはObj-CではなくSwiftでの話です。関数はクラス内にあるので、私は何をすべきかわかりません。

どのように解決するのですか?

を考えてはいけません。 NSObject をObjective-Cのクラスとして考えるのではなく、Cocoa/Foundationのクラスとして考えてください。Objective-Cの代わりにSwiftを使用しているとしても、あなたはまだすべての同じフレームワークを使用しているのです。

2つのオプションがあります。(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()
    }
}