2016-03-28 15 views
0

私はNSObjectのサブクラスではないクラスと、そのクラスのインスタンスの配列を持っていました。カスタムオブジェクトの配列のフィルタリング

enum ObjectType{ 
    case type1 
    case type2 
    case type3 
} 

class MyObject { 
    var type = ObjectType! 
    //some other properties... 
} 

let array = [obj1(type:type1), 
      obj2(type:type2), 
      obj3(type:type3), 
      obj4(type:type2), 
      obj5(type:type3)] 

let type2Array = array.filter(){ $0.type == .type2} 
// type2Array is supposed to be [obj2, obj4] 

これはどのように適切に配列をフィルタリングすることができfatal error: array cannot be bridged from Objective-C

を引き起こしていますか?

NSObjectからサブクラス化するか、自分のクラスをどのプロトコルにも準拠させる必要がありますか?

+0

Xcode 7.3を使用していますか? –

答えて

3

あなたの質問からわかるように、上記のどれも実際にObjective-Cへの接続はありません。あなたの例にはいくつかの問題がありますが、意図したとおりに動作しないようにしています。

  • MyObjectには初期化子がありません(Swift 2.2以降、少なくとも1つの初期化子を含める必要があります)。
  • obj1,obj2 ...とは何ですか?これらのメソッドをクラス/構造体型と扱います。の型がMyObjectであるとします。

上記を固定した場合意図したとおりに、あなたのコードの実際のフィルタリングの一部が動作しますが(あなたがfilter() {... }から()を省略することができることに注意してください)、例えば:フィルタリングの代替案として

enum ObjectType{ 
    case type1 
    case type2 
    case type3 
} 

class MyObject { 
    var type : ObjectType 
    let id: Int 
    init(type: ObjectType, id: Int) { 
     self.type = type 
     self.id = id 
    } 
} 

let array = [MyObject(type: .type1, id: 1), 
      MyObject(type: .type2, id: 2), 
      MyObject(type: .type3, id: 3), 
      MyObject(type: .type2, id: 4), 
      MyObject(type: .type3, id: 5)] 

let type2Array = array.filter { $0.type == .type2} 
type2Array.forEach { print($0.id) } // 2, 4 

列挙ケースに直接入力すると、rawValueタイプの列挙を指定し、代わりにこれに一致させることができます。例えば。 IntrawValueを使用すると、(w.r.t. rawValueのフィルタリングに加えて)あなたの列挙の場合の範囲のパターンマッチングを実行できます。

enum ObjectType : Int { 
    case type1 = 1 // rawValue = 1 
    case type2  // rawValue = 2, implicitly 
    case type3  // ... 
} 

class MyObject { 
    var type : ObjectType 
    let id: Int 
    init(type: ObjectType, id: Int) { 
     self.type = type 
     self.id = id 
    } 
} 

let array = [MyObject(type: .type1, id: 1), 
      MyObject(type: .type2, id: 2), 
      MyObject(type: .type3, id: 3), 
      MyObject(type: .type2, id: 4), 
      MyObject(type: .type3, id: 5)] 

/* filter w.r.t. to rawValue */ 
let type2Array = array.filter { $0.type.rawValue == 2} 
type2Array.forEach { print($0.id) } // 2, 4 

/* filter using pattern matching, for rawValues in range [1,2], 
    <=> filter true for cases .type1 and .type2 */ 
let type1or2Array = array.filter { 1...2 ~= $0.type.rawValue } 
type1or2Array.forEach { print($0.id) } // 1, 2, 4 
+0

カスタムクラスにinitが必要ですか?どうすれば 'let object1 = MyObject; object1.id = 1; object1.type = type1 ... '? – bluenowhere

関連する問題