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或使我的类符合任何协议?
从我的问题中可以看出,以上都没有与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)
| 归档时间: |
|
| 查看次数: |
4023 次 |
| 最近记录: |