Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 枚举值和谓词_Swift_Enums_Nspredicate - Fatal编程技术网

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个小时里,我一直在努力,这让我感到震惊。