Вызов статического метода из NSTimer. Возможно ли это?


Можно ли вызывать статический метод из NSTimer? Компилятор этого не допустит, жалуясь на загадочный " дополнительный аргумент 'selector' в вызове.

   struct MyStruct {
        static func startTimer() {
            NSTimer.scheduledTimerWithTimeInterval(1.0, target: MyStruct.self, selector: "doStuff", userInfo: nil, repeats: true)
        }

        static func doStuff() {
            println("Doin' it.")
        }
    }

   MyStruct.startTimer()
Но, конечно, это прекрасно работает...
class MyClass {
    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "doStuff", userInfo: nil, repeats: true)
    }

    func doStuff() {
        println("Doin' it.")
    }
}

var instanceOfClass = MyClass()
instanceOfClass.startTimer()

У меня просто неправильный синтаксис, или это не разрешено?

1 6

1 ответ:

NSTimer использует среду выполнения Objective-C для динамического вызова методов. При объявлении struct используется среда выполнения Swift, поэтому взаимодействие с NSTimer невозможно. Структуры отличаются от классов, и вы можете прочитать больше о них здесь.

Кроме того, функция static эквивалентна методу класса в Objective-C, поэтому, если это была ваша первоначальная цель, то достаточно следующего:

class MyClass: NSObject {
    class func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "doStuff", userInfo: nil, repeats: true)
    }

    class func doStuff() {
        println("Doin' it.")
    }
}

MyClass.startTimer()