NSPredicate 按名称 [in Swift] 传递 "multiple" 参数

NSPredicate pass "multiple" parameters by name [in Swift]

是否可以通过命名而不是 %@

将多个参数传递给 NSPredicate

比如我有一个directly-passed参数meyou

public static func ConversationByUserId( userId : String ) -> [Message] {

    // Either Created By me and sent to you.
    // Or, created by you and sent to me


    let me = UserRepo.GetLoggedInUser()?.id

    var format = "( createdBy == '" + me! + "'  && createdTo == '"  +  userId + "') "
    format += " || ( createdBy == '" + userId + "'  && createdTo == '" + me! + "') "


    print(format)
    //prints: ( createdBy == '1'  && createdTo == '5')  || ( createdBy == '5'  && createdTo == '1')


    let predicate = NSPredicate(format:  format)

    return Filter(predicate);


}

注:Filter(predicate)执行运算,returns结果。到目前为止,一切都很好。我得到了预期的结果。但我猜这可能会产生 SQL 攻击之类的问题。

我可以做如下的事情吗:如果可以,怎么做?

  var format = "( createdBy == @me  && createdTo == @you ) "
  format += " || ( createdBy == @you  && createdTo == @me ) "


 let predicate = NSPredicate(format:  format, [ "me" : me, "you" : you ])

到目前为止我取得的成绩是:

    format = "( createdBy == %@  && createdTo == %@ ) "
    format += " || ( createdBy == %@  && createdTo == %@ ) "


    let predicate = NSPredicate(format:  format, me!, you, me!, you)

您可以使用 NSPredicate 的 predicateWithSubstitutionVariables(参见 Apple Docs)。像往常一样创建谓词,使用“$variable”代替您要替换的值:

var format = "( createdBy == $me  && createdTo == $you ) "
format += " || ( createdBy == $you  && createdTo == $me ) "
let predicate = NSPredicate(format:  format)

然后创建一个包含变量名称和您要传递的值的字典:

let subVars = ["me" : me!, "you" : you!]

最后用您的值替换变量名创建谓词:

let finalPredicate = predicate.predicateWithSubstitutionVariables(subVars)

注意: 您不会在 iOS 应用程序中进行 SQL 注入攻击。除非您让用户输入 SQL,然后将 SQL 发送到某处的 服务器 ,否则不会有 SQL 的风险注入攻击。

Core Data 和 NSPredicate 不是那样工作的。

话虽如此;您可以使用 NSExpression 个实例并从 NSExpression 个片段的组合中构建一个 NSComparisonPredicate

let me = 1123 //Example value

let test = [["createdBy":1124,"name":"Fred"],["createdBy":1123,"name":"Jane"]] as NSArray

let lhs = NSExpression(forKeyPath: "createdBy")
let rhs = NSExpression(forConstantValue: me)

let predicate = NSComparisonPredicate(leftExpression: lhs, rightExpression: rhs, modifier: NSComparisonPredicateModifier.DirectPredicateModifier, type: NSPredicateOperatorType.EqualToPredicateOperatorType, options: [])

let results = test.filteredArrayUsingPredicate(predicate)
print("Results: \(results)")

NSComparisonPredicateNSCompoundPredicate 相结合,您可以构建任何您想要的东西。