web-dev-qa-db-fra.com

Utilisation de isKindOfClass avec Swift

J'essaie de récupérer un peu de Swift lang et je me demande comment convertir l'objet Objective-C suivant en Swift:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];

    if ([touch.view isKindOfClass: UIPickerView.class]) {
      //your touch was in a uipickerview ... do whatever you have to do
    }
}

Plus précisément, j'ai besoin de savoir comment utiliser isKindOfClass dans la nouvelle syntaxe.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    ???

    if ??? {
        // your touch was in a uipickerview ...

    }
}
222
lkemitchll

Le bon opérateur Swift est is:

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

Bien sûr, si vous devez également affecter la vue à une nouvelle constante, la syntaxe if let ... as? ... est votre garçon, comme l'a mentionné Kevin. Mais si vous n'avez pas besoin de la valeur et que vous n'avez besoin que de vérifier le type, vous devez alors utiliser l'opérateur is.

454
KPM
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    super.touchesBegan(touches, withEvent: event)
    let touch : UITouch = touches.anyObject() as UITouch

    if touch.view.isKindOfClass(UIPickerView)
    {

    }
}

Modifier

Comme indiqué dans @ Kevin répond , la méthode correcte consiste à utiliser l'opérateur de transtypage de type facultatif as?. Vous pouvez en savoir plus à ce sujet dans la section Optional Chaining sous-section Downcasting.

Éditer 2

Comme indiqué sur le autre réponse de l'utilisateur @KPM , utiliser l'opérateur is est la bonne façon de procéder.

131
Rui Peres

Vous pouvez combiner le chèque et le transformer en une seule déclaration:

let touch = object.anyObject() as UITouch
if let picker = touch.view as? UIPickerView {
    ...
}

Ensuite, vous pouvez utiliser picker dans le bloc if.

48
Kevin

J'utiliserais:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    super.touchesBegan(touches, withEvent: event)
    let touch : UITouch = touches.anyObject() as UITouch

    if let touchView = touch.view as? UIPickerView
    {

    }
}
1
crazyname