NSPredicate按名称传递"多个"参数[在Swift中]

tik*_*ika 2 core-data nspredicate ios 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);


}
Run Code Online (Sandbox Code Playgroud)

注意:Filter(predicate)执行操作并返回结果.到现在为止还挺好.我得到了预期的结果.但是,我想这可能会出现SQL攻击等问题.

我可以做下面的事情:如果是这样,怎么样?

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


 let predicate = NSPredicate(format:  format, [ "me" : me, "you" : you ])
Run Code Online (Sandbox Code Playgroud)

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

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


    let predicate = NSPredicate(format:  format, me!, you, me!, you)
Run Code Online (Sandbox Code Playgroud)

pba*_*sdf 5

您可以使用NSPredicate predicateWithSubstitutionVariables(请参阅Apple Docs).像往常一样创建谓词,使用"$ variable"代替要替换的值:

var format = "( createdBy == $me  && createdTo == $you ) "
format += " || ( createdBy == $you  && createdTo == $me ) "
let predicate = NSPredicate(format:  format)
Run Code Online (Sandbox Code Playgroud)

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

let subVars = ["me" : me!, "you" : you!]
Run Code Online (Sandbox Code Playgroud)

最后创建一个变量名称替换为您的值的谓词:

let finalPredicate = predicate.predicateWithSubstitutionVariables(subVars)
Run Code Online (Sandbox Code Playgroud)