2017-01-08 8 views
2

私はタイプがAnyであると言いますが、これは配列かどうかを知りたいと思います。ここでは何をしたいですか:スウィフトを使用してジェネリックタイプのタイプをチェックする

、私はちょうどこれが配列であるかない天気を知りたい

if myVariable is Array<Int> { } 

しかし、私はジェネリック型をチェックする必要はありません:

if myVariable is Array { /* Do what I want */ } 

しかし、スウィフトは、アレイなどのジェネリック型を与えることが必要です、私は試しました:

if myVariable is Array<Any> { } 

すべての型の配列に一致することを期待していますが、どちらも機能しません。(すべての型の配列と一致しません。したがって、変数がInt配列の場合、このコードは取得できません。

どうすればよいですか?

ありがとうございます。動作していないようなアプローチのソリューションの例と

編集:

struct Foo<T> {} 

struct Bar { 
    var property = Foo<String>() 
} 

var test = Bar() 

let mirror = Mirror(reflecting: test) 

// This code is trying to count the number of properties of type Foo 
var inputCount = 0 
for child in mirror.children { 
    print(String(describing: type(of: child))) // Prints "(Optional<String>, Any)" 
    if String(describing: type(of: child)) == "Foo" { 
     inputCount += 1 // Never called 
    } 
} 

print(inputCount) // "0" 
+1

関連:http://stackoverflow.com/questions/39443846/how-to-check-if-an-variable-of-any-type-is-an-array –

+0

@MartinR実際に私が配列について話していたとき、一例にすぎませんが、私の問題は他のすべてのジェネリック型にも当てはまるため、はるかに一般的です。 –

+0

@MartinR実際には、特定のクラス/プロトコルにある特定のジェネリック型のプロパティーがいくつあるかをカウントしたいので、それを行うためにリフレクションを使用していますが、私がチェックしたいタイプは一般的なタイプなのでタイプ... –

答えて

1

ここではあなたのために働くかもしれない2つのことです。

オプション1:childを(あなたの例で"property")プロパティの名前でString?を含むタプル項目である

留意されたいです。だから、child.1を見る必要があります。この場合

、あなたがチェックする必要があります。

if String(describing: type(of: child.1)).hasPrefix("Foo<") 

オプション2:

あなたはFoo<T>によって実装されるプロトコルFooProtocolを作成する場合は、あなたがchild.1 is FooProtocolかどうかを確認できます。

protocol FooProtocol { } 

struct Foo<T>: FooProtocol {} 

struct Bar { 
    var property = Foo<String>() 
} 

var test = Bar() 

let mirror = Mirror(reflecting: test) 

// This code is trying to count the number of properties of type Foo 
var inputCount = 0 
for child in mirror.children { 
    if child.1 is FooProtocol { 
     inputCount += 1 
    } 
} 
+1

ありがとうございました!できます –

関連する問題