枚举值和谓词

时间:2015-08-30 16:17:50

标签: swift enums nspredicate

有没有办法在NSPredicate中使用枚举值而不调用rawValue

例如:

enum MyEnum: Int32 {
    case A, B, C
}

var predicate: NSPredicate = NSPredicate(format: "prop_status == %i",
                                         argumentArray: [MyEnum.A])

我在考虑扩展NSPredicate以便它可以处理MyEnum但不知道如何做到这一点。

3 个答案:

答案 0 :(得分:2)

另一种解决方法是使用块创建NSPredicate

enum MyEnum: Int32 {
    case A, B, C
}

class MyClass: NSObject {
    var status: MyEnum

    init(status: MyEnum) {
        self.status = status
        super.init()
    }
}

let array = [MyClass(status: .A), MyClass(status: .B), MyClass(status: .C)]
let predicate = NSPredicate { ($0.0 as? MyClass)?.status == .A }
let filteredArray = (array as NSArray).filteredArrayUsingPredicate(predicate)

答案 1 :(得分:1)

一种方法是使用CustomStringConvertible,当您遵循此协议时,您需要实现返回String类型的描述方法。然后你可以使用String.init方法来获取字符串值。

有点像这样,

enum MyEnum: Int32, CustomStringConvertible {
    case A, B, C

    var description: String {
        return "\(rawValue)"
    }
}

var predicate: NSPredicate = NSPredicate(format: "prop_status == %@",
    argumentArray: [String(MyEnum.A)])

答案 2 :(得分:0)

NSPredicate是一个Objective-C框架,它不理解枚举的概念。 NSPredicated获得的所有内容都必须是对象。它实际上并没有获得Int32的快速数组,而是获得NSArray实例的NSNumber实例。

Swift可以处理array => NSArrayInt =>幕后NSNumber转换,但无法自动将枚举值转换为原始值。编译器没有足够的信息来做到这一点。