このコード行はSwift 2で動作していましたが、Swift 3では正しくありません。
if gestureRecognizer.isMember(of: UITapGestureRecognizer) { }
このエラーが発生します:型名の後にメンバー名またはコンストラクター呼び出しが必要です。
isMember(of:)
を使用する正しい方法は何ですか?
ほとんどの場合、タイプをチェックするだけでなく、そのタイプにキャストすることもできます。この場合、次を使用します。
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
を返しますisKind(of:)
と同等のSwifttype(of:)
の使用is
演算子とは異なり、サブクラスを考慮することなく、これを使用して正確な型を確認できます。type(of: instance) == DesiredType.self
isMember(of:)
と同等のSwiftこれらはすべて NSObjectProtocol
のメソッドです。 Swiftコードで使用できますが、NSObjectProtocol
から派生したクラス(NSObject
のサブクラスなど)でのみ作業を適用します。これらの使用はお勧めしませんが、完全を期すためにここで言及します
isKind(of:)
is
演算子を使用してください。isMember(of:)
NSObjectProtocol
のメソッドであるため、NSObjectProtocol
から派生したクラス(NSObject
のサブクラスなど)でのみ機能します。type(of: instance) == DesiredType.self
を使用してください。conforms(to:)
NSObjectProtocol
のメソッドであるため、NSObjectProtocol
から派生したクラス(NSObject
のサブクラスなど)でのみ機能します。is
演算子を使用してください。オブジェクトのクラスを確認するには、いくつかの方法があります。ほとんどの場合、次のような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")
}
クラスタイプを参照するには、.selfを使用する必要があります。
let a = UITapGestureRecognizer()
print (a.isMember(of: UIGestureRecognizer.self))
もあります:
print (a is UITapGestureRecognizer)
スウィフト3:
if gestureRecognizer is UITapGestureRecognizer {
//It's a tap
}