Utilizzo di isKindOfClass con Swift


231

Sto cercando di raccogliere un po 'di Swift e mi chiedo come convertire il seguente Objective-C in 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
    }
}

Più specificamente, devo sapere come utilizzare isKindOfClassnella nuova sintassi.

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

    ???

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

    }
}

Risposte:


480

L'operatore Swift corretto è is:

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

Naturalmente, se devi anche assegnare la vista a una nuova costante, allora la if let ... as? ...sintassi è il tuo ragazzo, come ha detto Kevin. Ma se non hai bisogno del valore e devi solo controllare il tipo, allora dovresti usare l' isoperatore.


2
Funziona anche con Swift 3!
footyapps27

Funziona anche con Swift 4.2!
Ravi,

come puoi farlo in un'istruzione switch per controllare diversi tipi di classe?
BigBoy1337

132
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)
    {

    }
}

modificare

Come sottolineato nella risposta di @ Kevin , il modo corretto sarebbe quello di utilizzare l'operatore di cast di tipo opzionale as?. Puoi leggere di più al riguardo nella Optional Chainingsottosezione della sezione Downcasting.

Modifica 2

Come indicato sull'altra risposta dell'utente @KPM , l'utilizzo isdell'operatore è il modo giusto per farlo.


Dimenticato super nel mio. Puoi anche eliminarlo : UITouchin questo, poiché l'inferenza del tipo saprà di cosa si tratta dal as UITouchcast
Malcolm Jarvis,

@MalcolmJarvis non fa male averlo.
Rui Peres,

4
Rubare il rappresentante di altri utenti inserendo la risposta nella tua è di cattivo gusto.
devios1

non funziona Suggerisce UIPickerView.self. È corretto?
Vyachaslav Gerchicov

49

È possibile combinare il segno di spunta e il cast in un'unica istruzione:

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

Quindi è possibile utilizzare pickerall'interno del ifblocco.


3
Questa è la risposta "più corretta" perché utilizza Swift 'as?' operatore. La documentazione afferma che "In Objective-C, si utilizza il metodo isKindOfClass: per verificare se un oggetto è di un determinato tipo di classe e il metodo conformsToProtocol: per verificare se un oggetto è conforme a un protocollo specificato. In Swift, si ottiene questo utilizzando l'operatore is per verificare un tipo o l'operatore as per eseguire il downcast a quel tipo. " Documentazione Apple
Adam Fox,

Questo è il modo giusto di eseguire isKingOfClass in breve tempo. Inserirai il blocco if solo se l'oggetto è della classe UIPickerView! Bella risposta!
Florian Burel,

Volevo solo sottolineare che se hai solo bisogno di fare il controllo e non usare 'picker' nel successivo blocco 'if', allora dovresti usare: if let _ = touch.view as? UIPickerView {...}
Adam Freeman il

@AdamFreeman in quel caso ti conviene usareif touch.view is UIPickerView {...}
Kevin,

E non sono nemmeno sicuro iso _esistito nel momento in cui questa domanda è stata posta, pochi giorni dopo che la lingua è stata annunciata per la prima volta.
Kevin,

1

Io userei:

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
    {

    }
}

-3

Un altro approccio che utilizza la nuova sintassi di Swift 2 consiste nell'utilizzare la protezione e annidare il tutto in un unico condizionale.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.