Verwenden von isKindOfClass mit Swift

231

Ich versuche, ein bisschen Swift lang aufzunehmen, und frage mich, wie ich das folgende Objective-C in Swift konvertieren kann:

- (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
    }
}

Insbesondere muss ich wissen, wie man isKindOfClassdie neue Syntax verwendet.

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

    ???

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

    }
}
lkemitchll
quelle

Antworten:

480

Der richtige Swift-Operator ist is:

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

Wenn Sie die Ansicht auch einer neuen Konstante zuweisen müssen, ist die if let ... as? ...Syntax natürlich Ihr Junge, wie Kevin erwähnt hat. Wenn Sie den Wert jedoch nicht benötigen und nur den Typ überprüfen müssen, sollten Sie den isOperator verwenden.

KPM
quelle
2
Funktioniert auch mit Swift 3!
footyapps27
Funktioniert auch mit Swift 4.2!
Ravi
Wie können Sie dies in einer switch-Anweisung tun, um mehrere verschiedene Klassentypen zu überprüfen?
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)
    {

    }
}

Bearbeiten

Wie in der Antwort von @ Kevin ausgeführt , besteht der richtige Weg darin, einen optionalen Typ-Cast-Operator zu verwenden as?. Weitere Informationen finden Sie im Abschnitt Optional ChainingUnterabschnittDowncasting .

Bearbeiten 2

Wie in der anderen Antwort des Benutzers @KPM erwähnt , ist die Verwendung des isOperators der richtige Weg, dies zu tun.

Rui Peres
quelle
Super in meinem vergessen. Sie können auch das : UITouchin diesem herausnehmen, da Typinferenz weiß, was es von der as UITouchBesetzung ist
Malcolm Jarvis
@ MalcolmJarvis es tut nicht weh, es zu haben.
Rui Peres
4
Es ist geschmacklos, den Repräsentanten anderer Benutzer zu stehlen, indem Sie ihre Antwort in Ihre eingeben.
Devios1
funktioniert nicht Schlägt vor UIPickerView.self. Ist es richtig?
Vyachaslav Gerchicov
49

Sie können den Scheck kombinieren und in eine Anweisung umwandeln:

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

Dann können Sie pickerinnerhalb des ifBlocks verwenden.

Kevin
quelle
3
Dies ist die "korrektere" Antwort, da der Swift "als?" Operator. In der Dokumentation heißt es: "In Objective-C verwenden Sie die isKindOfClass: -Methode, um zu überprüfen, ob ein Objekt einem bestimmten Klassentyp entspricht, und die ConformsToProtocol: -Methode, um zu überprüfen, ob ein Objekt einem angegebenen Protokoll entspricht. In Swift führen Sie dies aus Aufgabe, indem Sie den Operator is verwenden, um nach einem Typ zu suchen, oder den Operator as?, um auf diesen Typ herunterzuspielen. " Apple-Dokumentation
Adam Fox
Dies ist die richtige Methode, um isKingOfClass schnell auszuführen. Sie geben den if-Block nur ein, wenn das Objekt der Klasse UIPickerView entspricht! Gute Antwort!
Florian Burel
Ich wollte nur darauf hinweisen, dass Sie, wenn Sie nur die Prüfung durchführen und im nachfolgenden 'if'-Block nicht' picker 'verwenden müssen, Folgendes verwenden möchten: if _ = touch.view as? UIPickerView {...}
Adam Freeman
@ AdamFreeman in diesem Fall wäre es besser, wenn Sieif touch.view is UIPickerView {...}
Kevin
Und ich bin mir auch nicht sicher isoder _existierte zu dem Zeitpunkt, als diese Frage gestellt wurde, einige Tage nachdem die Sprache zum ersten Mal angekündigt wurde.
Kevin
1

Ich würde ... benutzen:

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
    {

    }
}
verrückter Name
quelle
-3

Ein anderer Ansatz, der die neue Swift 2-Syntax verwendet, besteht darin, Guard zu verwenden und alles in einer Bedingung zu verschachteln.

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
Sam Corder
quelle