683 votes

@selector() dans Swift ?

Je suis en train de créer un NSTimer en Swift , mais je vais avoir quelques difficultés.

NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)

test() est une fonction dans la même classe.


J'obtiens une erreur dans l'éditeur: Could not find an overload for 'init' that accepts the supplied arguments

Quand je change selector: test() de selector: nil l'erreur disparaît.

J'ai essayé:

  • selector: test()
  • selector: test
  • selector: Selector(test())

Mais rien ne fonctionne et je ne peux pas trouver une solution dans les références.

953voto

rickster Points 19870

Swift lui-même ne doit pas utiliser les sélecteurs - plusieurs ObjC modèles qui rendent l'utilisation de sélecteurs sont remplacés par quelque chose d'autre en Swift. (Utilisation facultative de chaînage au lieu de respondsToSelector: tests, et n'utilisez pas d' performSelector: parce que c'est pas sécurisé.)

Lors de l'interaction avec ObjC basée sur des Api qui prennent des sélecteurs, vous pouvez utiliser une chaîne de caractères pour représenter un; par exemple

myButton.addTarget(self, action: "buttonTapped:", forControlEvents: .TouchUpInside)
let timer = NSTimer(timeInterval: 1, target: self, selector: "test", userInfo: nil, repeats: false)

L' SEL type en ObjC cartes à l' Selector type de Swift. Depuis un Selector peuvent être créés automatiquement à partir d'un littéral de chaîne en cas de besoin, il n'y a pas besoin de passer de l' Selector("string") ou NSSelectorFromString("string").

Parce que les sélecteurs sont un ObjC chose, leurs chaînes de suivre ObjC méthode règles de nommage-pour une méthode qui prend un argument, le sélecteur se termine par un signe deux-points (":"). Par exemple, le sélecteur de chaîne pour une méthode nommée test() est juste "test", mais le sélecteur pour l' test(this:String) est "test:".

Notez également que la méthode référencée par le sélecteur doit être exposé à l'ObjC de l'exécution. C'est déjà le cas si il est dans une classe que (finalement) hérite de l' NSObject, mais si c'est dans une pure Swift classe, vous aurez besoin de préface, que de la méthode de déclaration à l' @objc.

À l'aide des sélecteurs est couvert en vertu de l'Interaction avec Objective-C Api dans l'Utilisation de Swift avec Cocoa et Objective-C.

92voto

Oscar Swanros Points 2853

Voici un petit exemple sur la façon d’utiliser la `` classe sur Swift :

Notez que si la méthode passée sous forme de chaîne ne fonctionne pas, il va échouer au moment de l’exécution, pas moment de la compilation, et crash veillez à votre App.

46voto

user3771857 Points 81

En outre, si votre classe (Swift) ne pas descend d’une classe Objective-C, vous devez avoir deux points à la fin de la chaîne de nom de méthode cible et vous devez utiliser la propriété @objc avec votre méthode cible par exemple

Sinon, vous obtiendrez une erreur « Non comptabilisés Selector » lors de l’exécution.

20voto

Martin Cazares Points 4881

Juste au cas où quelqu'un d'autre a le même problème que j'avais avec NSTimer où aucune des autres réponses résolu le problème, est vraiment important de mentionner que, si vous utilisez une classe qui n'hérite de NSObject soit directement ou de profondeur dans la hiérarchie(par exemple, créé manuellement swift fichiers), aucune des autres réponses fonctionner même quand il est spécifié comme suit:

let timer = NSTimer(timeInterval: 1, target: self, selector: "test", userInfo: nil, repeats: false)

func test(){}

Sans rien changer d'autre que de simplement faire la classe hérite de NSObject j'ai arrêté l'obtention de la non reconnu "sélecteur" Erreur et ai obtenu une logique de travail comme prévu.

Espérons que cela aide!

Ce qui concerne les!

14voto

Scooter Points 184

Si vous voulez passer un paramètre à la fonction de la NSTimer alors voici votre solution :

Inclure le signe deux-points dans le texte de sélecteur (testeur :), et vos paramètres aller à userInfo.

Votre fonction doit prendre NSTimer comme un paramètre. Puis juste extraire userInfo pour obtenir le paramètre passé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X