有没有办法在NSPredicate
中使用枚举值而不调用rawValue
?
例如:
enum MyEnum: Int32 {
case A, B, C
}
var predicate: NSPredicate = NSPredicate(format: "prop_status == %i",
argumentArray: [MyEnum.A])
我在考虑扩展NSPredicate
以便它可以处理MyEnum
但不知道如何做到这一点。
答案 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 => NSArray
和Int
=>幕后NSNumber
转换,但无法自动将枚举值转换为原始值。编译器没有足够的信息来做到这一点。