Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Object X of class Y does not implement methodSignatureForSelector in Swift

Tags:

swift

I have a class Person which is instantiated multiple times.Each person get's their own timer. Upon in my init for Person I call 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)")  } ... ... } 

So I may have 3 instances of Person in an array of Person[]. I am getting an error:

2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implement methodSignatureForSelector: -- trouble ahead 

I read elsewhere that I should inherit from NSObject but this is in Swift not Obj-C. The function is within the class so I am not sure what to do.

like image 523
Johnston Avatar asked Jun 25 '14 18:06

Johnston


2 Answers

Don't think of NSObject as an Objective-C class, think of it as a Cocoa/Foundation class. Even though you're using Swift instead of Objective-C, you're still using all the same frameworks.

Two options: (1) add the dynamic attribute to the function you want to reference as a selector:

    dynamic func timerTick() {         self.angerLevel++         print("Angry! \(self.angerLevel)")     } 

Or (2) declare Person as a subclass of NSObject, then just call super.init() at the beginning of your initializer:

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()     } } 
like image 69
Nate Cook Avatar answered Sep 28 '22 06:09

Nate Cook


Since XCode6 beta 6, you can use 'dynamic' func

dynamic func timerTick() { .... } 
like image 38
Kritsana U. Avatar answered Sep 28 '22 06:09

Kritsana U.