首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS NSPredicate 動態查詢字符串變量的正確寫法

     編輯:程式設計綜合問答

問題現象

使用 NSPredicate 過濾數組時,硬編碼字符串常量正常,但使用變量 NSString *user = @"Joe"; 時查詢失敗。

錯誤代碼

NSString *user = @"Joe";
// 錯誤:謂詞格式字符串中直接寫變量名,不會被解析
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == user", @"id"];

%K 是鍵路徑佔位符,但 user 在格式字符串中被視為字面量鍵名,而非變量值。

正確寫法:使用 %@ 佔位符傳遞對象值

NSString *user = @"Joe";
// 正確:%@ 代表對象值,自動處理引號、轉義
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"id", user];
NSArray *filtered = [usersInfo filteredArrayUsingPredicate:predicate];

格式字符串佔位符對照表

佔位符含義適用類型
%@對象描述 (調用 description)NSString, NSNumber, NSDate, 自定義對象等
%K鍵路徑 / 屬性名NSString (作為屬性名)
%d, %i整數int, NSInteger
%f浮點數float, double, CGFloat
%ld長整數long, long long

進階用法示例

// 多條件組合
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@ AND %K > %@", 
                          @"name", userName, @"age", @(18)];

// 包含關係 (類似 SQL LIKE)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", @"name", searchText];
// [cd] = 不區分大小寫 + 不區分重音

// 集合操作
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"status", @[@"active", @"pending"]];

// 正則表達式
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES %@", @"email", @"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$"];

動態構建謂詞 (字符串拼接方式)

若謂詞格式本身需動態生成:

NSString *key = @"id";
NSString *value = @"Joe";
NSString *format = [NSString stringWithFormat:@"%%K == %%@", key]; // 雙 %% 轉義為單 %
NSPredicate *predicate = [NSPredicate predicateWithFormat:format, value];

但**強烈建議直接使用第一種參數化方式**,避免格式字符串注入風險與轉義錯誤。

總結

NSPredicate predicateWithFormat: 採用參數化綁定機制,**值類參數必須用 %@**,鍵名參數用 %K。切勿在格式字符串中直接拼接變量名,這是導致查詢失效的常見原因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved