过滤自定义对象的数组

blu*_*ere 2 arrays filter swift

我有一个不是该类的子类的类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]
Run Code Online (Sandbox Code Playgroud)

这是造成的 fatal error: array cannot be bridged from Objective-C

如何正确过滤数组?

我是否必须从子类NSObject或使我的类符合任何协议?

dfr*_*fri 8

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

  • MyObject 没有初始化程序(从Swift 2.2开始,你应该包含至少一个初始化程序).
  • 什么是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
Run Code Online (Sandbox Code Playgroud)

作为直接过滤枚举情况的替代方法,您可以指定rawValue枚举的类型并与之匹配.例如,使用an Int rawValue允许您(除了过滤wrt 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
Run Code Online (Sandbox Code Playgroud)