过滤自定义对象的数组

时间:2016-03-28 10:28:12

标签: arrays swift filter

我有一个不是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继承或使我的类符合任何协议?

1 个答案:

答案 0 :(得分:8)

从我的问题中可以看出,以上都没有与Objective-C有任何联系。您的示例包含一些其他问题,但是,使其无法按预期工作。

  • MyObject没有初始化程序(从Swift 2.2开始,您应该至少包含一个初始化程序)。
  • 什么是obj1obj2,......?当我假设您打算将这些作为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类型并与之匹配。例如。使用Int rawValue允许您(除了过滤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