La compréhension Swift 2.2 Sélecteur de la Syntaxe #sélecteur()
Je suis de commutation sur la syntaxe de mon projet vers Swift 2.2 (qui xCode me permet de le faire automatiquement); cependant, je ne comprends pas la nouvelle #selector()
syntaxe.
Comme un exemple:
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self,
selector: #selector(MyVC.timerCalled(_:)), //new selector syntax!
userInfo: nil, repeats: true)
Cela a le sélecteur de #selector(MyVC.timerCalled(_:))
Ce qui ne l' _:
signifie? Pouvez-vous ajouter d'autres variables dans ce sélecteur? Dire, #MyVC.timerCalled(_:whateverVar)
.
Des informations générales sur ce qui est différent dans cette syntaxe, par opposition à la chaîne en fonction de la mise en œuvre à partir de versions antérieures de Swift sont grandement appréciés.
- Je pense que je l'explique très bien ici: stackoverflow.com/questions/35658334/...
- Réponse traite de la syntaxe de manière plus approfondie, y compris une discussion utile de traiter avec des méthodes surchargées.
Vous devez vous connecter pour publier un commentaire.
Le bit dans la parenthèse est un mécanisme pour identifier la liste d'arguments pour le sélecteur de ce que vous voulez.
Je vous recommande de regarder le Généralisée De Nommage proposition de Swift Évolution. Il couvre les cas où vous avez un certain nombre de fonctions qui ne diffèrent que par leurs étiquettes de paramètres et de la nécessité de se référer à eux. L'exemple de ce document est:
Si vous vouliez obtenir une valeur de la fonction pour l'un de ces le résultat est ambigu:
La solution mise en place est d'ajouter l'argument des étiquettes, sans aucun type d'information pour le code qui génère la valeur de la fonction pour lever l'ambiguïté qui vous voulez:
Voir la façon dont les étiquettes sont ajoutées dans les parens?
Cette proposition a joué un rôle dans celle qui s'applique directement à votre question:
Référencement de l'Objective-C sélecteur d'une méthode
Dans ce cas particulier, le sélecteur vous souhaitez consulter est
timerCalled:
qui est une fonction d'un paramètre qui n'a pas d'étiquette. Donc (_:). Le trait de soulignement signifie que le label n'est pas spécifié et le côlon.Swift 2.2 a déconseillé Stringified sélecteurs: Dans swift 2.0, que nous utilisons pour écrire le sélecteur en tant que Chaîne de je.e
"buttonClicked"
. L'inconvénient de cette approche est que le compilateur ne peut pas vérifier si la méthode existe vraiment ou pas au moment de la compilation(Même si vous avez mal orthographié c').EX:1
Si la méthode ci-dessus dans la nouvelle approche peut être appelé comme
#selector(buttonClicked)
EX:2
Si la méthode ci-dessus dans la nouvelle approche peut être appelé comme
#selector(buttonClicked(_:))
EX:3
Si la méthode ci-dessus avec des paramètres dans la nouvelle approche peut être appelé comme
#selector(buttonClicked(_:indexValue:))
Envisager de code ci-dessous pour ajouter de la cible à bouton swift 3 à l'aide de #sélecteur de
Cette syntaxe a fonctionné pour moi lors de la migration vers swift 3
C'est la façon de Swift signatures de méthode sont représentés dans la documentation, et il commence maintenant à être utilisé dans les nouvelles fonctionnalités de langage telles que la
#selector()
syntaxe pour exprimer les méthodes par leurs listes d'arguments.Chaque colon (
:
) représente un paramètre d'une méthode. Pour les paramètres nommés, le côlon est précédé par le nom du paramètre; pour les paramètres sans nom, un trait de soulignement (_
) est utilisé.Ainsi, par exemple,
MyVC.timerCalled(_:))
indique une méthode sur laMyVC
type avec un paramètre non, qui pourrait être déclaré comme ceci:(Notez que
timer
est le interne nom du paramètre, puisque par défaut le premier paramètre d'une méthode est sans nom)Le type (
MyVC
dans votre exemple) peut également être omise si elle est dans le même champ d'application de la#selector()
déclaration.Un exemple plus complexe pourrait ressembler à ceci: