Swift 枚举值和谓词
是否有一种方法可以在Swift 枚举值和谓词,swift,enums,nspredicate,Swift,Enums,Nspredicate,是否有一种方法可以在NSPredicate中使用枚举值而不调用rawValue 例如: enum MyEnum: Int32 { case A, B, C } var predicate: NSPredicate = NSPredicate(format: "prop_status == %i", argumentArray: [MyEnum.A]) 我正在考虑扩展NSPredicate,这样它就可以处
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框架,它不理解enums的概念。NSPredicated
获取的所有内容都必须是对象。它实际上并没有得到一个包含Int32
的swift数组,而是得到一个带有NSNumber
实例的NSArray
实例
Swift可以在幕后处理数组=>
NSArray
和Int
=>NSNumber
转换,但不能自动将枚举值转换为原始值。编译器没有足够的信息来执行此操作。一种方法是使用CustomStringConvertible,当您遵守此协议时,需要实现返回字符串类型的描述方法。然后可以对其使用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 { ($0.0 as? MyClass)?.status == .A }
let filteredArray = (array as NSArray).filteredArrayUsingPredicate(predicate)
我不认为有任何方法可以做到这一点,除非你使用rawValue。从Int32继承的Swift枚举并不意味着它本身就是Int32。这只是意味着原始Int32值决定了枚举中的枚举数。谢谢你,这让我很开心。在过去的1-2个小时里,我一直在努力,这让我感到震惊。