@selector () dans Swift?


660

J'essaie de créer un NSTimerin Swiftmais j'ai des problèmes.

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

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


Je reçois une erreur dans l'éditeur:

Impossible de trouver une surcharge pour 'init' qui accepte les arguments fournis

Lorsque je passe selector: test()à selector: nill'erreur, disparaît.

J'ai essayé:

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

Mais rien ne fonctionne et je ne trouve pas de solution dans les références.


11
selector: test()appeler testet passer sa valeur de retour à l' selectorargument.
Michael Dorst

Réponses:


930

Swift lui - même n'utilise pas de sélecteurs - plusieurs modèles de conception qui dans Objective-C utilisent des sélecteurs fonctionnent différemment dans Swift. (Par exemple, utilisez le chaînage facultatif sur les types de protocole ou is/ astests au lieu de respondsToSelector:, et utilisez des fermetures partout où vous le pouvez performSelector:pour une meilleure sécurité de type / mémoire.)

Mais il existe encore un certain nombre d'API importantes basées sur ObjC qui utilisent des sélecteurs, y compris des minuteries et le modèle cible / action. Swift fournit le Selectortype pour travailler avec ces derniers. (Swift l'utilise automatiquement à la place du SELtype d'ObjC .)

Dans Swift 2.2 (Xcode 7.3) et versions ultérieures (y compris Swift 3 / Xcode 8 et Swift 4 / Xcode 9):

Vous pouvez construire un à Selectorpartir d'un type de fonction Swift à l'aide de l' #selectorexpression.

let timer = Timer(timeInterval: 1, target: object,
                  selector: #selector(MyClass.test),
                  userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
                 for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
             with: button, with: otherButton)

La grande chose à propos de cette approche? Une référence de fonction est vérifiée par le compilateur Swift, vous pouvez donc utiliser l' #selectorexpression uniquement avec des paires classe / méthode qui existent réellement et peuvent être utilisées comme sélecteurs (voir «Disponibilité du sélecteur» ci-dessous). Vous êtes également libre de faire votre référence de fonction uniquement aussi spécifique que vous le souhaitez, conformément aux règles Swift 2.2+ pour la dénomination de type de fonction .

(Il s'agit en fait d'une amélioration par rapport à la @selector()directive ObjC , car la -Wundeclared-selectorvérification du compilateur vérifie uniquement que le sélecteur nommé existe. La référence à la fonction Swift que vous passez pour #selectorvérifier l'existence, l'appartenance à une classe et la signature de type.)

Il y a quelques mises en garde supplémentaires pour les références de fonction que vous passez à l' #selectorexpression:

  • Plusieurs fonctions avec le même nom de base peuvent être différenciées par leurs étiquettes de paramètres en utilisant la syntaxe susmentionnée pour les références de fonction (par exemple insertSubview(_:at:)vs insertSubview(_:aboveSubview:)). Mais si une fonction n'a pas de paramètres, la seule façon de lever l'ambiguïté est d'utiliser un astranstypage avec la signature de type de la fonction (par exemple foo as () -> ()vs foo(_:)).
  • Il existe une syntaxe spéciale pour les paires getter / setter de propriété dans Swift 3.0+. Par exemple, étant donné un var foo: Int, vous pouvez utiliser #selector(getter: MyClass.foo)ou #selector(setter: MyClass.foo).

Notes générales:

Cas où #selectorcela ne fonctionne pas et dénomination: Parfois, vous n'avez pas de référence de fonction avec laquelle faire un sélecteur (par exemple, avec des méthodes enregistrées dynamiquement dans le runtime ObjC). Dans ce cas, vous pouvez construire un à Selectorpartir d'une chaîne: par exemple Selector("dynamicMethod:")- bien que vous perdiez la vérification de validité du compilateur. Lorsque vous faites cela, vous devez suivre les règles de dénomination ObjC, y compris les deux-points ( :) pour chaque paramètre.

Disponibilité du sélecteur: la méthode référencée par le sélecteur doit être exposée au runtime ObjC. Dans Swift 4, chaque méthode exposée à ObjC doit avoir sa déclaration précédée de l' @objcattribut. (Dans les versions précédentes, vous disposiez de cet attribut gratuitement dans certains cas, mais maintenant vous devez le déclarer explicitement.)

N'oubliez pas que les privatesymboles ne sont pas non plus exposés à l'exécution - votre méthode doit avoir au moins une internalvisibilité.

Chemins d'accès: ceux-ci sont liés mais pas tout à fait identiques aux sélecteurs. Il y a aussi une syntaxe spéciale pour ceux-ci dans Swift 3: par exemple chris.valueForKeyPath(#keyPath(Person.friends.firstName)). Voir SE-0062 pour plus de détails. Et encore plus de KeyPathchoses dans Swift 4 , alors assurez-vous d'utiliser la bonne API basée sur KeyPath au lieu de sélecteurs, le cas échéant.

Vous pouvez en savoir plus sur les sélecteurs sous Interagir avec les API Objective-C dans Utilisation de Swift avec Cocoa et Objective-C .

Remarque: Avant Swift 2.2, Selectorconforme à StringLiteralConvertible, vous pouvez donc trouver de l'ancien code où des chaînes nues sont passées aux API qui acceptent les sélecteurs. Vous aurez envie d'exécuter "Convertir en syntaxe Swift actuelle" dans Xcode pour obtenir ceux qui utilisent #selector.


8
Mettre une chaîne avec le nom de la fonction a fonctionné, NSSelectorFromString () fonctionne également.
Arbitur

7
Je voudrais mentionner que même si "Interagir avec les API Objective-C" est sur le site Web, il n'est PAS dans le livre "The Swift Programming Language".

10
Cela devrait probablement mentionner que le sélecteur a besoin d'un ":" à la fin s'il prend un argument. (Par exemple test () -> "test" & test (this: String) -> "test:")
Daniel Schlaug

2
Il convient également de noter que les frameworks Cocoa attendent un nom de méthode de style Objective-C. Si votre méthode prend un argument, vous aurez besoin d'un ':' si elle prend 2 arguments, size:andShape:si le premier argument est nommé, vous aurez peut-être besoin d'un With, c'est- initWithData:à- dire pourfunc init(Data data: NSData)
JMFR

6
Est-il possible d'ajouter une validation pour passer le "sélecteur" sous forme de chaîne? Le compilateur IE nous avertit lorsque nous orthographions mal, etc.
yo.ian.g

86

Voici un exemple rapide sur la façon d'utiliser la Selectorclasse sur Swift:

override func viewDidLoad() {
    super.viewDidLoad()

    var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))
    self.navigationItem.rightBarButtonItem = rightButton
}

func method() {
    // Something cool here   
}

Notez que si la méthode passée sous forme de chaîne ne fonctionne pas, elle échouera lors de l'exécution, pas lors de la compilation, et plantera votre application. Faites attention


13
ce qui est horrible ... y a-t-il un type de chose "NSStringFromSelector"?
Lena Bru

11
ne peuvent pas croire qu'ils ont conçu pour des sélecteurs non contrôlés depuis qu'objc avait cela
malhal

4
@malcomhall: @selectorc'est pratique, mais il n'est pas appliqué aussi formellement que vous pourriez le penser. Le "sélecteur non déclaré" n'est qu'un avertissement du compilateur, car de nouveaux sélecteurs peuvent toujours être introduits au moment de l'exécution. Cependant, les références de sélecteurs vérifiables / refactorisables dans Swift seraient une bonne demande de fonctionnalité .
rickster

2
Cette réponse est utile mais la réponse ci-dessous avec @objc est plus appropriée.
cynistersix

Lorsque vous transmettez la chaîne de sélecteur en tant que variable ou paramètre, vous devez indiquer au compilateur qu'il s'agit d'un sélecteur à l'aide de la fonction Selector (). merci
levous

46

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

var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

@objc func method() {
    // Something cool here   
} 

sinon, vous obtiendrez une erreur «Sélecteur non reconnu» lors de l'exécution.


3
1. les sélecteurs avec deux points doivent prendre un argument 2. selon les actions du minuteur Apple docs, prendre l'argument NSTimer 3. le Selectormot clé n'est pas obligatoire. Donc, dans ce cas, la signature doit être@objc func method(timer: NSTimer) {/*code*/}
Yevhen Dubinin

@objctravaillé pour moi. Je n'avais pas besoin d'inclure timer: NSTimerdans ma signature de méthode pour qu'elle soit appelée.
Mike Taverne

32

Mise à jour Swift 2.2+ et Swift 3

Utilisez la nouvelle #selectorexpression, ce qui élimine le besoin d'utiliser des littéraux de chaîne rendant l'utilisation moins sujette aux erreurs. Pour référence:

Selector("keyboardDidHide:")

devient

#selector(keyboardDidHide(_:))

Voir aussi: Proposition Swift Evolution

Remarque (Swift 4.0):

Si #selectorvous utilisez, vous devrez marquer la fonction comme@objc

Exemple:

@objc func something(_ sender: UIButton)


26

Swift 4.0

vous créez le sélecteur comme ci-dessous.

1. ajoutez l'événement à un bouton comme:

button.addTarget(self, action: #selector(clickedButton(sender:)), for: UIControlEvents.touchUpInside)

et la fonction sera comme ci-dessous:

@objc func clickedButton(sender: AnyObject) {

}

4
Vous avez oublié de mettre @objcavant funcce qui est requis dans Swift 4.
Vahid Amiri

24

Pour les futurs lecteurs, j'ai constaté que j'avais rencontré un problème et que j'obtenais une unrecognised selector sent to instanceerreur causée par le marquage de la cible funccomme privée.

Le func DOIT être publiquement visible pour être appelé par un objet avec une référence à un sélecteur.


13
il n'a pas a être public , vous pouvez toujours garder privée , mais ajouter la méthode objcavant la déclaration de lui. Ex: @objc private func foo() { ...alors vous pouvez utiliser "foo"autant de sélecteurs que vous le souhaitez
apouche

Il peut également l'être internal, ne spécifiant ainsi aucun modificateur d'accès. J'utilise souvent ce modèle://MARK: - Selector Methods\n extension MyController {\n func buttonPressed(_ button: UIButton) {
Sajjon

19

Juste au cas où quelqu'un d'autre aurait le même problème que j'ai eu avec NSTimer où aucune des autres réponses n'a résolu le problème, il est vraiment important de mentionner que, si vous utilisez une classe qui n'hérite pas de NSObject directement ou profondément dans la hiérarchie ( par exemple des fichiers swift créés manuellement), aucune des autres réponses ne fonctionnera même si 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 hériter la classe de NSObject, j'ai cessé d'obtenir l'erreur "sélecteur non reconnu" et j'ai fait fonctionner ma logique comme prévu.


Le problème avec cette alternative est que vous ne pouvez pas changer une classe (disons ViewController) pour hériter de NSObject, étant donné que vous avez besoin de la classe implémentée de la classe ViewController (par exemple viewDidLoad ()). Une idée comment appeler une fonction Swift dans un ViewController en utilisant NSTimer? ... e
eharo2

1
UIViewController hérite déjà de NSObject, la plupart des classes exposées par le SDK le font, cet exemple est pour vos propres classes créées qui nécessitent la fonctionnalité NSTimer ...
Martin Cazares

14

Si vous souhaitez passer un paramètre à la fonction à partir du NSTimer, voici votre solution:

var somethingToPass = "It worked"

let timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "tester:", userInfo: somethingToPass, repeats: false)

func tester(timer: NSTimer)
{
    let theStringToPrint = timer.userInfo as String
    println(theStringToPrint)
}

Incluez les deux-points dans le texte du sélecteur (testeur :) et vos paramètres vont dans userInfo.

Votre fonction doit prendre NSTimer comme paramètre. Il suffit ensuite d'extraire userInfo pour obtenir le paramètre transmis.


3
J'utilisais NSTimer (0.01, target: self, ...) qui ne fonctionnait PAS, alors que j'utilisais NSTimer.scheduledTimerWithTimeInterval (0.01, ..) DID work !? Étrange mais merci @Scooter pour votre réponse!
iOS-Coder

1
@ iOS-Coder juste créer un temporisateur avec l'initialiseur ne l'ajoute pas à une boucle d'exécution, alors qu'il scheduledTimerWith...l'ajoute automatiquement à la boucle d'exécution actuelle - donc il n'y a aucun comportement étrange ici du tout;)
David Ganster

1
@ David merci pour votre suggestion. Je suppose que mon malentendu devrait appartenir à la catégorie STFW ou RTFA (Read The F ... ing)?
iOS-Coder

1
Ne vous inquiétez pas, personne ne peut s'attendre à lire la documentation sur chaque méthode dans chaque API;)
David Ganster

10

Les sélecteurs sont une représentation interne d'un nom de méthode dans Objective-C. Dans Objective-C, "@selector (methodName)" convertirait une méthode de code source en un type de données SEL. Étant donné que vous ne pouvez pas utiliser la syntaxe @selector dans Swift (rickster est là), vous devez spécifier manuellement le nom de la méthode en tant qu'objet String directement, ou en passant un objet String au type Selector. Voici un exemple:

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:"logout"
)

ou

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:Selector("logout")
)

8

Swift 4.1
Avec un échantillon du geste du robinet

let gestureRecognizer = UITapGestureRecognizer()
self.view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.addTarget(self, action: #selector(self.dismiss(completion:)))

// Use destination 'Class Name' directly, if you selector (function) is not in same class.
//gestureRecognizer.addTarget(self, action: #selector(DestinationClass.dismiss(completion:)))


@objc func dismiss(completion: (() -> Void)?) {
      self.dismiss(animated: true, completion: completion)
}

Voir le document d'Apple pour plus de détails sur: Expression du sélecteur


Veuillez arrêter de faire cela. Cela n'aide personne. En quoi est-ce différent de Swift 3.1? Et pourquoi avez-vous pensé qu'il était nécessaire d'ajouter une autre réponse à cela alors qu'il a déjà environ 20 réponses?
Fogmeister

sélecteur d'appel est différent dans swift 4. Essayez ces réponses dans swift 4 et voyez. Aucun ne fonctionnera sans modification. Veuillez ne marquer aucune déclaration comme spam sans garantir son impuissance
Krunal

Y a-t-il une raison pour laquelle vous n'avez pas pu modifier la réponse existante et acceptée? Cela le rendrait réellement utile plutôt que d'ajouter à la fin d'une longue liste de réponses. Le bouton "Modifier" est là pour une raison.
Fogmeister

De plus, quelle partie de cela est différente de Swift 3?
Fogmeister

2
Vous devez ajouter la balise objc à tous les sélecteurs pour Swift 4. C'est la bonne réponse. Et vous n'êtes pas censé modifier les réponses des autres pour changer leur signification. @ Krunal a tout à fait raison.
Unome

6
// for swift 2.2
// version 1
buttton.addTarget(self, action: #selector(ViewController.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(ViewController.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 2
buttton.addTarget(self, action: #selector(self.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(self.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 3
buttton.addTarget(self, action: #selector(tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(tappedButton2(_:)), forControlEvents: .TouchUpInside)

func tappedButton() {
  print("tapped")
}

func tappedButton2(sender: UIButton) {
  print("tapped 2")
}

// swift 3.x
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton) {
  // tapped
}

button.addTarget(self, action: #selector(tappedButton(_:_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton, _ event: UIEvent) {
  // tapped
}

cela aurait été plus agréable et plus éducatif si vous aviez eu un exemple en prenant deux ou trois arguments pour Swift3 ou Swift4 aussi. Merci.
nyxee

5
Create Refresh control using Selector method.   
    var refreshCntrl : UIRefreshControl!
    refreshCntrl = UIRefreshControl()
    refreshCntrl.tintColor = UIColor.whiteColor()
    refreshCntrl.attributedTitle = NSAttributedString(string: "Please Wait...")
    refreshCntrl.addTarget(self, action:"refreshControlValueChanged", forControlEvents: UIControlEvents.ValueChanged)
    atableView.addSubview(refreshCntrl)

// Actualiser la méthode de contrôle

func refreshControlValueChanged(){
    atableView.reloadData()
    refreshCntrl.endRefreshing()

}

5

Depuis la publication de Swift 3.0, il est même un peu plus subtil de déclarer une action cible appropriée

class MyCustomView : UIView {

    func addTapGestureRecognizer() {

        // the "_" is important
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyCustomView.handleTapGesture(_:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        addGestureRecognizer(tapGestureRecognizer)
    }

    // since Swift 3.0 this "_" in the method implementation is very important to 
    // let the selector understand the targetAction
    func handleTapGesture(_ tapGesture : UITapGestureRecognizer) {

        if tapGesture.state == .ended {
            print("TapGesture detected")
        }
    }
}

4

Lors de l'utilisation performSelector()

/addtarget()/NStimer.scheduledTimerWithInterval() méthodes votre méthode (correspondant au sélecteur) doit être marquée comme

@objc
For Swift 2.0:
    {  
        //...
        self.performSelector(“performMethod”, withObject: nil , afterDelay: 0.5)
        //...


    //...
    btnHome.addTarget(self, action: “buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    //...

    //...
     NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector : “timerMethod”, userInfo: nil, repeats: false)
    //...

}

@objc private func performMethod() {}
@objc private func buttonPressed(sender:UIButton){.
}
@objc private func timerMethod () {.
}

Pour Swift 2.2, vous devez écrire '#selector ()' au lieu de la chaîne et du nom du sélecteur afin que les possibilités d'erreur d'orthographe et de plantage à cause de cela ne soient plus là. Voici un exemple

self.performSelector(#selector(MyClass.performMethod), withObject: nil , afterDelay: 0.5)

3

vous créez le sélecteur comme ci-dessous.
1.

UIBarButtonItem(
    title: "Some Title",
    style: UIBarButtonItemStyle.Done,
    target: self,
    action: "flatButtonPressed"
)

2.

flatButton.addTarget(self, action: "flatButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)

Notez que la syntaxe @selector a disparu et a été remplacée par une simple chaîne nommant la méthode à appeler. Il y a un domaine où nous pouvons tous convenir que la verbosité s'est mise en travers. Bien sûr, si nous déclarons qu'il existe une méthode cible appelée flatButtonPressed: il vaut mieux en écrire une:

func flatButtonPressed(sender: AnyObject) {
  NSLog("flatButtonPressed")
}

régler la minuterie:

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
                    target: self, 
                    selector: Selector("flatButtonPressed"), 
                    userInfo: userInfo, 
                    repeats: true)
    let mainLoop = NSRunLoop.mainRunLoop()  //1
    mainLoop.addTimer(timer, forMode: NSDefaultRunLoopMode) //2 this two line is optinal

Pour être complet, voici le flatButtonPressed

func flatButtonPressed(timer: NSTimer) {
}

Avez-vous une source pour " Prenez note que la syntaxe @selector a disparu "?
winklerrr

3

J'ai trouvé bon nombre de ces réponses utiles, mais il n'était pas clair comment procéder avec quelque chose qui n'était pas un bouton. J'étais en train d'ajouter un reconnaisseur de gestes à un UILabel rapidement et j'ai eu du mal alors voici ce que j'ai trouvé qui fonctionnait pour moi après avoir lu tout ce qui précède:

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: "labelTapped:")

Où le "sélecteur" a été déclaré:

func labelTapped(sender: UILabel) { }

Notez qu'il est public et que je n'utilise pas la syntaxe Selector () mais il est également possible de le faire.

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: Selector("labelTapped:"))

3

L'utilisation de #selector vérifiera votre code au moment de la compilation pour vous assurer que la méthode que vous souhaitez appeler existe réellement. Encore mieux, si la méthode n'existe pas, vous obtiendrez une erreur de compilation: Xcode refusera de construire votre application, bannissant ainsi de l'oubli une autre source possible de bugs.

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem =
            UIBarButtonItem(barButtonSystemItem: .Add, target: self,
                            action: #selector(addNewFireflyRefernce))
    }

    func addNewFireflyReference() {
        gratuitousReferences.append("Curse your sudden but inevitable betrayal!")
    }

2

Il peut être utile de noter où vous configurez le contrôle qui déclenche l'action.

Par exemple, j'ai constaté que lors de la configuration d'un UIBarButtonItem, je devais créer le bouton dans viewDidLoad, sinon j'obtiendrais une exception de sélecteur non reconnue.

override func viewDidLoad() {
    super.viewDidLoad() 

    // add button
    let addButton = UIBarButtonItem(image: UIImage(named: "746-plus-circle.png"), style: UIBarButtonItemStyle.Plain, target: self, action: Selector("addAction:"))
    self.navigationItem.rightBarButtonItem = addButton
}

func addAction(send: AnyObject?) {     
    NSLog("addAction")
}

2

selectorest un mot du Objective-Cmonde et vous pouvez l'utiliser Swiftpour avoir la possibilité d'appeler Objective-Cdepuis Swift Il vous permet d'exécuter du code à l'exécution

Avant Swift 2.2la syntaxe est:

Selector("foo:")

Étant donné que le nom de la fonction est passée en Selectortant que Stringparamètre ( « foo ») , il est impossible de vérifier un nom dans la compilation . En conséquence, vous pouvez obtenir une erreur d'exécution:

unrecognized selector sent to instance

Après Swift 2.2+la syntaxe:

#selector(foo(_:))

La saisie semi-automatique de Xcode vous aide à appeler une bonne méthode


1

Modifier comme une simple dénomination de chaîne dans la méthode appelant la syntaxe du sélecteur

var timer1 : NSTimer? = nil
timer1= NSTimer(timeInterval: 0.1, target: self, selector: Selector("test"), userInfo: nil, repeats: true)

Après cela, tapez func test ().


0

Pour Swift 3

// Exemple de code pour créer une minuterie

Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)

WHERE
timeInterval:- Interval in which timer should fire like 1s, 10s, 100s etc. [Its value is in secs]
target:- function which pointed to class. So here I am pointing to current class.
selector:- function that will execute when timer fires.

func updateTimer(){
    //Implemetation 
} 

repeats:- true/false specifies that timer should call again n again.

0

Sélecteur dans Swift 4:

button.addTarget(self, action: #selector(buttonTapped(sender:)), for: UIControlEvents.touchUpInside)

-1

Pour swift 3

let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.test), userInfo: nil, repeats: true)

Déclaration de fonction Dans la même classe:

@objc func test()
{
    // my function
} 

Si la cible est autonome, il n'est pas nécessaire d'avoir un selfsélecteur. Cela devrait suffire:let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(test), userInfo: nil, repeats: true)
Mithra Singam
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.