[swift] 클래스 Y의 개체 X는 Swift에서 methodSignatureForSelector를 구현하지 않습니다.

여러 번 인스턴스화되는 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 인스턴스가 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지만 이것은 Obj-C가 아닌 Swift에 있습니다. 함수가 클래스 내에 있으므로 무엇을해야할지 모르겠습니다.



답변

NSObjectObjective-C 클래스로 생각하지 말고 Cocoa / Foundation 클래스로 생각하십시오. Objective-C 대신 Swift를 사용하더라도 여전히 동일한 프레임 워크를 모두 사용하고 있습니다.

두 가지 옵션 : (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 베타 6부터 ‘동적’기능을 사용할 수 있습니다.

dynamic func timerTick() { .... }


답변

let encodedArchive = NSKeyedArchiver.archivedDataWithRootObject(archive) as NSData아카이브가 사용자 지정 클래스의 배열 인 곳 을 사용하려고하면 비슷한 오류가 발생했습니다
. 나는 그 커스텀 클래스를 NSObject와 NSCoding의 서브 클래스로 선언하는 것이 트릭임을 발견했다. NSCoding 프로토콜을 준수하려면 몇 줄이 더 필요하므로 다음과 같이 시작해야합니다.

class Person: NSObject, NSCoding {
  init() {
    super.init()
  }

  func encodeWithCoder(_aCoder: NSCoder) {   }
}


답변