SwiftでのisKindOfClassの使用


231

私はSwiftのlangを少し拾おうとしていますが、次のObjective-Cを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
    }
}

より具体的にisKindOfClassは、新しい構文での使用方法を知る必要があります。

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

    ???

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

    }
}

回答:


480

適切なSwift演算子はis次のとおりです。

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

もちろん、ビューを新しい定数に割り当てる必要がある場合は、 if let ... as? ...、Kevinが述べたように、構文はあなたの男の子です。ただし、値を必要とせず、タイプを確認するだけでよい場合は、is演算子を使用する必要があります。


2
Swift 3でも動作します!
footyapps27 2016年

Swift 4.2でも動作します!
ラビ

いくつかの異なるクラスタイプをチェックするために、switchステートメントでこれをどのように実行できますか?
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)
    {

    }
}

編集する

@Kevinの回答で指摘されているように、正しい方法はオプションの型キャスト演算子を使用することですas?。あなたはセクションOptional Chainingサブセクションでそれについてもっと読むことができますDowncasting

編集2

ユーザー@KPMによる他の回答で指摘されているisように、演算子を使用するのが正しい方法です。


私のスーパーを忘れました。: UITouch型推論はas UITouchキャストによってそれが何であるかを知っているので、これを取り出すこともできます
Malcolm Jarvis

@MalcolmJarvisそれはそれを持っていることに害はありません。
Rui Peres 2014年

4
他のユーザーの回答を自分の回答に入れて盗むことは、味が悪い。
devios1

動作しません。提案しUIPickerView.selfます。それが正しいか?
Vyachaslav Gerchicov

49

チェックとキャストを1つのステートメントに組み合わせることができます。

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

その後pickerifブロック内で使用できます。


3
これは「より正しい」答えです。Swiftを「として」使用しているためです。オペレーター。ドキュメントには、「Objective-Cでは、isKindOfClass:メソッドを使用してオブジェクトが特定のクラス型かどうかを確認し、conformsToProtocol:メソッドを使用してオブジェクトが指定されたプロトコルに準拠しているかどうかを確認します。Swiftでは、 is演算子を使用してタイプをチェックするタスク、またはas?演算子を使用してそのタイプにダウンキャストするタスク。」アップルのドキュメント
アダムフォックス

これは、isKingOfClassを迅速に実行する正しい方法です。オブジェクトがUIPickerViewクラスである場合にのみ、ifブロックに入ります。正解です。
Florian Burel 14年

チェックを実行するだけで、後続の「if」ブロックで「picker」を使用しない場合は、次のように使用することを指摘したいと思います。UIPickerView {...}
Adam Freeman

その場合は@AdamFreemanを使用したほうがよいでしょうif touch.view is UIPickerView {...}
Kevin

そして、私はわからないかよis_の時点で存在していたこの質問は、言語が最初に発表された数日後に、頼まれました。
ケビン

1

私は使うだろう:

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

新しいSwift 2構文を使用する別のアプローチは、ガードを使用して、すべてを1つの条件にネストすることです。

guard let touch = object.AnyObject() as? UITouch, let picker = touch.view as? UIPickerView else {
    return //Do Nothing
}
//Do something with picker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.