枚举值和谓词
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 可以在幕后处理数组 => NSArray
和 Int
=> 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)
有没有办法在 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 可以在幕后处理数组 => NSArray
和 Int
=> 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)