2016-09-12 5 views
2

任意の配列として迅速なプロトコル配列をキャストしようとしましたが失敗しました。任意の型の変数が配列であるかどうかをチェックする方法

protocol SomeProtocol: class{ 
} 

class SomeClass: NSObject, SomeProtocol{ 
} 

let protocolArray: [SomeProtocol] = [SomeClass()] 
let value: Any? = protocolArray 

if let _ = value as? [SomeProtocol]{ 
    print("type check successed")  //could enter this line 
} 

上記のコードは期待どおりに機能する可能性があります。 しかし、私の問題は、私はたくさんのプロトコルを持っており、それらを一つずつチェックしたくないということです。新しいプロトコルを追加するのは親切ではありません。

上記の「値」が以下のような配列であるかどうかチェックする便利な方法はありますか?

if let _ = value as? [Any]{ 
    print("type check successed") //never enter here 
} 

編集:のRohit Parsanaの答えに触発さ

、コードの下に仕事ができる:

if let arrayType = value?.dynamicType{ 
    let typeStr = "\(arrayType)" 
    if typeStr.contains("Array"){ 
     print(typeStr) 
    } 
} 

しかし、これらのコードは十分に安全ではないようで、たとえば、あなたが名前のクラスを宣言することができます"abcArray"

「typeStr」が「Array < *>」と一致するかどうかを確認するために正規表現を使用することはできますが、あまりにも扱いにくいようです。

もっと良い解決策はありますか?

答えて

1

あなたは、リフレクションを使用することができます:

if value != nil { 
    let mirror = Mirror(reflecting: value!) 
    let isArray = (mirror.displayStyle == .Collection) 
    if isArray { 
     print("type check succeeded") 
    } 
} 
+0

これはすばらしいことです!ありがとう! –

0

あなたは「dynamicType」を使用して値の種類を確認することができ、ここでのサンプルコードはある...

if "__NSCFArray" == "\(page.dynamicType)" || "__NSArrayM" == "\(page.dynamicType)" 
    { 
     print("This is array") 
    } 
    else 
    { 
     print("This is not array") 
    } 
+0

を私はそれが動作しません怖いです。 "__NSCFArray"、 "__NSArrayM"はobjc配列のようですが、ここではswiftを使用しています。動的な型の "value"は実際には "Array "です –

関連する問題