2016-08-24 7 views
4

私はさまざまなタイプのオブジェクトと配列の配列を持っています。オブジェクトごとに、配列の配列を繰り返し処理し、そのオブジェクトがその型かどうかを確認したいと思います。このようなもの:オブジェクトがSwiftのクラスメタタイプのインスタンスであることを確認します。

class Parent {} 
class ChildA: Parent {} 
class ChildB: Parent {} 
class GrandChildA: ChildA {} 

var objects: [Any] = ["foo", ChildA(), ChildA(), ChildB(), GrandChildA()] 
var classes = [Parent, ChildA, ChildB] // This line doesn't compile!! 

for obj in objects { 
    for cls in classes { 
     if obj is cls { 
      NSLog("obj matches type!") 
     } 
    } 
} 

クラスを配列に格納できないため、これは機能しません。私が理解として、あなたストアクラス型などChildA.selfなど:

ChildA().dynamicType == ChildA.self // true 

しかし、これはサブクラスを処理しない:

ChildA() is Parent // true 

ChildA().dynamicType == Parent.self // false 

は明らかisオペレータは、サブクラスのケースを解決します

isを使用する場合は、クラスの型を配列に格納する方法がわかりません。

私は何とかSwiftといくつかのリフレクション・ブードゥーを使って何をしたいのですか?

申し訳ありませんが、タイトルが誤解を招く場合は、適切な質問をするには十分に理解できません。

+1

はhttps://stackoverflow.com/を比較q/44874126/2976878 – Hamish

+0

@ハミッシュ:あなたの答えは素晴らしいです!ここで答えとして提出すれば、私はそれを受け入れてうれしいです。 –

+0

うれしいことがありましたら幸いです! 5月も同様のケースでは二重引用符で終わる – Hamish

答えて

-2

各クラスにタイトルを追加することで、それらをオンにすることができます。また、スーパークラスの代わりにプロトコルを使用することを考えましたか?

たぶん、このような何か:

protocol Parentable { 
    var title : String { get set } 
} 

class ChildA : Parentable{ 
    var title: String 
    init() { 
     self.title = "ChildA" 
    } 
    init(title: String){ 
     self.title = title 
    } 
} 
class ChildB: Parentable { 
    var title: String 
    init(){ 
     self.title = "ChildB" 
    } 
} 
class GrandChildA: ChildA { 
    override init() { 
     super.init(title: "GrandChild") 
    } 
} 

var objects: [Parentable] = [ChildA(), ChildA(), ChildB(), GrandChildA()] 

for obj in objects { 
    switch obj.title { 
    case "ChildA": 
     print("Object is of type \(obj.title)") 
    case "ChildB": 
     print("Object is of type \(obj.title)") 
    case "GrandChild": 
     print("Object is of type \(obj.title)") 
    default : 
     print("Object is of type \(obj.title)") 
    } 
} 

あなたが参照によって渡されたオブジェクトが必要な場合は、このようなスーパークラスでそれをも行うことができます:

class Parent { 
    var title: String 

    init() { 
     self.title = "Parent" 
    } 
    init(title: String) { 
     self.title = title 
    } 
} 
class ChildA: Parent { 
    override init() { 
     super.init(title: "ChildA") 
    } 
    override init(title: String) { 
     super.init(title: title) 
    } 
} 
class ChildB: Parent { 
    override init() { 
     super.init(title: "ChildB") 
    } 
} 
class GrandChildA: ChildA { 
    override init() { 
     super.init(title: "GrandChild") 
    } 
} 

    var objects: [Parent] = [ChildA(), ChildA(), ChildB(), GrandChildA()] 

    for obj in objects { 
     switch obj.title { 
     case "ChildA": 
      print("Object is of type \(obj.title)") 
     case "ChildB": 
      print("Object is of type \(obj.title)") 
     case "GrandChild": 
      print("Object is of type \(obj.title)") 
     default : 
      print("Object is of type \(obj.title)") 
    } 
} 
+1

私は本当に応答を感謝しますが、残念ながらこれは私が欲しいものを達成しません。まず、文字列を使用すると、私が維持するために余分なオーバーヘッドが多くなり、エラーが発生しやすくなります。言語はすでに '' 'dynamicType'''を介してこのすべてを処理しています(上記の私の例を参照)。第二に、あなたの例ではサブ/スーパークラスの大文字小文字は扱えません: '' 'ChildB.title'''は' 'ChildB''' *と' 'Parent''の両方の証拠を私に与えません'。 –

関連する問題