2015-03-27 24 views
6

È consentito chiamare un metodo statico da un NSTimer? Il compilatore non permetterà questo, lamentandosi con il criptico " 'selector' argomento extra in chiamata.Chiamare un metodo statico da NSTimer. È possibile?

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() 

Ma, naturalmente, questo funziona bene ...

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() 

Do devo solo la sintassi sbagliato, o non è permesso?

risposta

3

NSTimer utilizza il runtime di Objective-C, per invocare dinamicamente metodi. Quando dichiarare una struct, si utilizza il runtime Swift, quindi non è possibile per NSTimer a cooperare. le strutture differiscono fr om classi, e si può leggere di più su di loro here.

Inoltre, una funzione static è l'equivalente di un metodo di classe in Objective-C, quindi se questo è stato il tuo obiettivo originario allora la seguente dovrebbe essere sufficiente:

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() 
+1

ho quasi il codice identico, e lo fa non funziona. In effetti, se incollo questo codice esatto, non funziona. 'Selettore non riconosciuto' ... Ha usato' class' per tutti? – SimplGy

+0

@SimplGy: prova a precedere la tua funzione con l'attributo '@ objc'. –

+2

Nota: è necessario ereditare da 'NSObject' affinché sia ​​in grado di trovare il selettore di funzioni della classe. In caso contrario, si verificherà un arresto anomalo del runtime "Selettore non riconosciuto". – SimplGy