2014-07-02 9 views
6

Ich versuche, einen Thread in swift zu spawnen. So habe ich diese Zeile:Erstellen von Threads in swift?

. . .

let thread = NSThread(target: self, selector: doSomething(), object: nil) 

. . .

doSomething ist eine Funktion im Rahmen der Klasse.

Diese Linie gibt diesen Fehler: „konnte nicht eine Überlastung für init finden(), die die angegebenen Argumente akzeptiert“

Was soll ich hier fehlt? Kann ich schnell einen neuen Thread erstellen?

Antwort

12

Ab Xcode 7.3 und Swift 2.2 können Sie die besondere Form #selector(...) verwenden, wo Objective-C @selector(...) verwenden würde:

let thread = NSThread(target:self, selector:#selector(doSomething), object:nil) 
+0

Wie würden Sie es tun, wenn 'doSomething' ein Argument erforderlich (zB vom Typ' NSString')? – Matt

+0

Das ist das Argument "object". –

+0

Ich habe das versucht, aber ich bekomme immer eine 'NSInvalidArgumentException':' [NSThread initWithTarget: selector: object:]: Ziel implementiert Selektor nicht. Es erkennt anscheinend meinen Funktionsnamen nicht. (Sollte ich dies als eine neue Frage veröffentlichen?) – Matt

4

NSThread nimmt einen Selektor als es zweite Parameter ist. Sie können Objective-C-Selektoren als Strings in Swift wie folgt beschreiben:

let thread = NSThread(target: myObj, selector: "mySelector", object: nil) 

Swift-Funktionen sind nicht gleichwertig Objective-c Methoden though. Wenn Sie eine Methode in einem schnellen Klasse haben, können Sie es als Selektor verwenden, wenn Sie das @objc Attribut auf die Klasse verwenden:

@objc class myClass{ 
    func myFunc(){ 
    } 
} 

var myObj = myClass() 
let thread = NSThread(target: myObj, selector: "myFunc", object: nil) 
0
  1. Wenn wir einen Selektor auf ein Ziel nennen, sollten wir prüfen wenn das Ziel existiert und es auf den Selektor reagiert. Nur Klasse, die sie von NSObject oder deren Unterklassen respondsToSelector:

  2. Sie können ein NSDictionary verwenden Parameter speichern können, wenn Sie mehr als 2 Parameter.

    Ex:

    //this code is in Objective-C but the same code should exist in Swift 
    
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:object1, @"key1", object2, @"key2",nil]; 
    

dann passieren 'params' auf Parameter des Wählers: