NSPredicate 按名称 [in Swift] 传递 "multiple" 参数
NSPredicate pass "multiple" parameters by name [in Swift]
是否可以通过命名而不是 %@
将多个参数传递给 NSPredicate
比如我有一个directly-passed
参数me
和you
。
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)")
将 NSComparisonPredicate
与 NSCompoundPredicate
相结合,您可以构建任何您想要的东西。
是否可以通过命名而不是 %@
比如我有一个directly-passed
参数me
和you
。
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)")
将 NSComparisonPredicate
与 NSCompoundPredicate
相结合,您可以构建任何您想要的东西。