微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift – 动态生成NSPredicate?

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

值可以是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)

解决方法

作为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)

输出

name == "John Doe" AND age == 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 = %@",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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐