2014-07-02 1 views
6

J'essaie de lancer un fil dans swift. J'ai donc cette ligne:Créer des discussions dans swift?

. . .

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

. . .

doQuelquechose est une fonction entrant dans le cadre de la classe.

Cette ligne donne cette erreur: « n'a pas pu trouver une surcharge pour init() qui accepte les arguments fournis »

Qu'est-ce que je manque ici? Ho puis-je créer un nouveau sujet dans swift?

Répondre

12

Au Xcode 7.3 et Swift 2.2, vous pouvez utiliser le formulaire spécial #selector(...) où Objective-C utiliserait @selector(...):

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

Comment feriez-vous si 'doSomething' requis un argument (par exemple de type' NSString')? – Matt

+0

C'est ce à quoi sert l'argument 'object'. –

+0

J'ai essayé cela, mais je continue d'obtenir une 'NSInvalidArgumentException':' [NSThread initWithTarget: selector: object:]: target n'implémente pas le sélecteur'. Il ne reconnaît apparemment pas le nom de ma fonction. (Dois-je l'afficher comme une nouvelle question?) – Matt

4

NSThread prend un sélecteur comme il est second paramètre. Vous pouvez décrire sélecteurs Objective-C comme des chaînes à Swift comme ceci:

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

fonctions Swift ne sont pas équivalentes méthodes c objectif bien. Si vous avez une méthode dans une classe rapide, vous pouvez l'utiliser comme un sélecteur si vous utilisez l'attribut @objc de la classe:

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

var myObj = myClass() 
let thread = NSThread(target: myObj, selector: "myFunc", object: nil) 
0
  1. Lorsque nous appelons un sélecteur sur une cible, nous devrions vérifier si la cible existe et répond au sélecteur. classe seulement de prolonger NSObject ou il est sous-classes peuvent utiliser respondsToSelector:

  2. Vous pouvez utiliser un NSDictionary pour stocker des paramètres si vous avez plus de 2 paramètres.

    Ex:

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

passe alors 'params' au paramètre de sélection: