枚举值和谓词

Enum value and predicates

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

例如:

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

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

我正在考虑扩展 NSPredicate 以便它可以处理 MyEnum 但不确定该怎么做。

NSPredicate 是一个 Objective-C 框架,它不理解枚举的概念。 NSPredicated 得到的所有东西都必须是对象。它实际上并没有获得 Int32 的 swift 数组,它获得了 NSArray 实例和 NSNumber 实例。

Swift 可以在幕后处理数组 => NSArrayInt => NSNumber 转换,但它不能自动将枚举值转换为其原始值。编译器只是没有足够的信息来执行此操作。

一种方法是使用 CustomStringConvertible,当您遵守此协议时,您将需要实现 return 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)])

另一种解决方法是用方块创建 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 { ([=10=].0 as? MyClass)?.status == .A }
let filteredArray = (array as NSArray).filteredArrayUsingPredicate(predicate)