web-dev-qa-db-ja.com

Swift 3-オブジェクトのクラスタイプを確認する方法

このコード行はSwift 2で動作していましたが、Swift 3では正しくありません。

if gestureRecognizer.isMember(of: UITapGestureRecognizer) { }

このエラーが発生します:型名の後にメンバー名またはコンストラクター呼び出しが必要です。

isMember(of:)を使用する正しい方法は何ですか?

33
Van Du Tran

ほとんどの場合、タイプをチェックするだけでなく、そのタイプにキャストすることもできます。この場合、次を使用します。

if let gestureRecognizer as? UITapGestureRecognizer { }
else { /* not a UITapGestureRecognizer */ }

迅速なキャスティングオペレーター

これらの演算子はSwiftでのみ使用できますが、Objective C型を扱う場合でも機能します。

  • as 演算子

    • as演算子は、アップキャストやブリッジングなど、コンパイル時に常にキャストが成功することがわかっている場合にキャストを実行します。アップキャストでは、中間変数を使用せずに、そのタイプのスーパータイプのインスタンスとして式を使用できます。

    • これは、可能な場合に使用する最も望ましい演算子です。オプションのアンラップやクラッシュのリスクを心配することなく、成功を保証します。
  • as? 演算子

    • as?演算子は、指定された型への式の条件付きキャストを実行します。 as?演算子は、指定されたタイプのオプションを返します。実行時に、キャストが成功した場合、expressionの値はオプションでラップされて返されます。それ以外の場合、返される値はnilです。指定されたtypeへのキャストが失敗するか、成功することが保証されている場合、コンパイル時エラーが発生します。

    • これは、使用するのに2番目に好ましい演算子です。キャスト演算子を実行できない場合を安全に処理するために使用します。

  • as! 演算子

    • as!演算子は、指定された型への式の強制キャストを実行します。 as!演算子は、オプションのタイプではなく、指定されたtypeの値を返します。キャストが失敗すると、ランタイムエラーが発生します。 x as! Tの動作は、(x as? T)!の動作と同じです。

    • これは、使用するのに最も好ましくない演算子です。悪用しないことを強くお勧めします。式を互換性のない型にキャストしようとすると、プログラムがクラッシュします。


迅速な型チェック

式の型を確認するだけで、その型にキャストすることなくしたい場合は、これらのアプローチを使用できます。これらはSwiftでのみ使用できますが、Objective C型を扱う場合でも機能します。

  • is 演算子

    • is演算子は、実行時に式を指定された型にキャストできるかどうかを確認します。式を指定された型にキャストできる場合は、trueを返します。それ以外の場合は、falseを返します
    • Objective C型を含む、Swift型で機能します。
    • isKind(of:) と同等のSwift
  • type(of:) の使用

    • is演算子とは異なり、サブクラスを考慮することなく、これを使用して正確な型を確認できます。
    • 次のように使用できます:type(of: instance) == DesiredType.self
    • isMember(of:) と同等のSwift

型をチェックするためのレガシー(Objective C)メソッド

これらはすべて NSObjectProtocol のメソッドです。 Swiftコードで使用できますが、NSObjectProtocolから派生したクラス(NSObjectのサブクラスなど)でのみ作業を適用します。これらの使用はお勧めしませんが、完全を期すためにここで言及します

  • isKind(of:)

    • 受信者が特定のクラスのインスタンスか、そのクラスを継承するクラスのインスタンスかを示すブール値を返します。
    • Swiftではこれを避け、代わりにis演算子を使用してください。
  • isMember(of:)

    • 受信者が特定のクラスのインスタンスであるかどうかを示すブール値を返します
    • NSObjectProtocol のメソッドであるため、NSObjectProtocolから派生したクラス(NSObjectのサブクラスなど)でのみ機能します。
    • Swiftではこれを避け、代わりにtype(of: instance) == DesiredType.selfを使用してください。
  • conforms(to:)

    • 受信者が特定のプロトコルに準拠しているかどうかを示すブール値を返します。
    • NSObjectProtocol のメソッドであるため、NSObjectProtocolから派生したクラス(NSObjectのサブクラスなど)でのみ機能します。
    • Swiftではこれを避け、代わりにis演算子を使用してください。
117
Alexander

オブジェクトのクラスを確認するには、いくつかの方法があります。ほとんどの場合、次のようなis演算子またはas?演算子のいずれかを使用します。

let gestureRecognizer: UIGestureRecognizer = UITapGestureRecognizer()

// Using the is operator
if gestureRecognizer is UITapGestureRecognizer {
    // You know that the object is an instance of UITapGestureRecognizer,
    // but the compiler will not let you use UITapGestureRecognizer specific
    // methods or properties on gestureRecognizer because the type of the
    // variable is still UIGestureRecognizer
    print("Here")
}

// Using the as? operator and optional binding
if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer {
    // tapGestureRecognizer is the same object as gestureRecognizer and is
    // of type UITapGestureRecognizer, you can use UITapGestureRecognizer
    // specific methods or properties.
    print("Here")
}

// Using the type(of:) global function
if type(of: gestureRecognizer) == UITapGestureRecognizer.self {
    // gestureRecognizer is an instance of UITapGestureRecognizer, but not any
    // of its subclasses (if gestureRecognizer was an instance of a subclass of
    // UITapGestureRecognizer, the body of this if would not execute).
    // This kind of check is rarely usefull, be sure this is really what you
    // want to do before you use it.
    print("Here")
}

// Using the isKind(of:) method
if gestureRecognizer.isKind(of: UITapGestureRecognizer.self) {
    // Like for the is operator, you know that the object is an instance of
    // UITapGestureRecognizer (or any subclass of UITapGestureRecognizer).
    // This is the Objective-C version of the is operator and will only work
    // on classes that inherit from NSObject, don't use it in Swift.
    print("Here")
}

// Using the isMember(of:) method
if gestureRecognizer.isMember(of: UITapGestureRecognizer.self) {
    // gestureRecognizer is an instance of UITapGestureRecognizer, but not
    // any of its subclasses.
    // This is the Objective-C version of type(of:) and will only work on
    // classes that inherit from NSObject, don't use it in Swift.
    print("Here")
}
20
deadbeef

クラスタイプを参照するには、.selfを使用する必要があります。

let a = UITapGestureRecognizer()
print (a.isMember(of: UIGestureRecognizer.self))

もあります:

print (a is UITapGestureRecognizer)
5
Josh Homann

スウィフト3:

if gestureRecognizer is UITapGestureRecognizer {
            //It's a tap
}
3
Zigglzworth