【问题标题】:Swift - Dynamically generate NSPredicate?Swift - 动态生成 NSPredicate?
【发布时间】:2014-09-01 21:20:39
【问题描述】:

我正在尝试动态创建谓词并执行提取。

值可以是 String 或 Int,当 int 值被发送到 NSPredicate 初始化程序时,它会崩溃并出现以下错误:

-[__NSCFNumber rangeOfString:]:无法识别的选择器发送到实例

我知道问题是 Int 的 %@ 格式,但是有没有办法使这种动态化,这样我就不必手动检查 String 和 Int 然后创建谓词?

var keyValues: [String: AnyObject]
var predicates: [NSPredicate]()

for (key, value) in keyValues {
   var predicate = NSPredicate(format: "%K = %@", key: [value])
   predicates.append(predicate) 
}

var compundPredicate = NSCompoundPredicate.andPredicateWithSubpredicates(predicates)

【问题讨论】:

    标签: swift nspredicate


    【解决方案1】:

    value as NSObject 成功了:

    var keyValues: [String: AnyObject] = ["name" : "John Doe", "age" : 39]
    var predicates = [NSPredicate]()
    
    for (key, value) in keyValues {
        var predicate = NSPredicate(format: "%K = %@", key, value as NSObject)
        predicates.append(predicate) 
    }
    
    var compundPredicate = NSCompoundPredicate.andPredicateWithSubpredicates(predicates)
    println(compundPredicate)
    

    输出:

    姓名 == "John Doe" AND 年龄 == 39

    Swift 3/4 更新:

    let keyValues = ["name" : "John Doe" as NSObject, "age" : 39 as NSObject]
    var predicates = [NSPredicate]()
    
    for (key, value) in keyValues {
        let predicate = NSPredicate(format: "%K = %@", key, value)
        predicates.append(predicate)
    }
    
    let compundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
    

    或更短:

    let keyValues = ["name" : "John Doe" as NSObject, "age" : 39 as NSObject]
    let predicates = keyValues.map { NSPredicate(format: "%K = %@", $0.key, $0.value) }
    let compundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
    

    【讨论】:

    • 你无处不在 :) 感谢您的回答,会试一试
    • 只是为了更新代码。 NSCompoundPredicate 在 swift 2 中改变,你现在必须使用初始化器 NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2014-11-13
    • 2017-09-30
    相关资源
    最近更新 更多