여러 번 인스턴스화되는 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에 있습니다. 함수가 클래스 내에 있으므로 무엇을해야할지 모르겠습니다.
답변
NSObject
Objective-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) { }
}