我有一个不是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 :(得分: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
作为直接过滤到枚举案例的替代方法,您可以指定枚举的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