NSPredicate使用小结

本文总结了NSPredicate在iOS开发中的常见用法,包括查询过滤、条件构造等方面,帮助开发者更高效地处理数据。
摘要由CSDN通过智能技术生成

Person

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    NSString *_name;
    NSNumber *_age;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *age;

@end

使用:

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSMutableArray *mutableArray = [NSMutableArray array];
        
        for (int i=0; i<6; i++) {
            Person *person = [[Person alloc] init];
            person.name = [NSString stringWithFormat:@"TOM-%d", i];
            person.age = @(33 + i);
            [mutableArray addObject:person];
            [person release];
        }
        
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age>32"];
        
        //判断是否满足条件
        for (Person *per in mutableArray) {
            BOOL result = [predicate evaluateWithObject:per];
            if (result) {
                NSLog(@"%@", per);
            }
            
        }
        
        //过滤
        NSArray *array = [mutableArray filteredArrayUsingPredicate:predicate];
        NSLog(@"array :%@", array);
        
        //占位符参数
        NSArray *array2 = [mutableArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"age>%d" , 34]];
        NSLog(@"array2 :%@", array2);

        //and
        NSArray *array3 = [mutableArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"age>%d and age<%d" , 34, 37]];
        NSLog(@"array3 :%@", array3);
        
        
        //or
        NSArray *array4 = [mutableArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"age > 32 || age < 35"]];
        NSLog(@"array4:%@", array4);
        
        //in
        NSArray *array5 = [mutableArray filteredArrayUsingPredicate:
                           [NSPredicate predicateWithFormat:@"name in {'TOM-1', 'TOM-3'}"]];
        NSLog(@"array5%@", array5);
        
        
        //检查是否以某个字母开头(BEGINSWITH)
        NSArray *array6 = [mutableArray filteredArrayUsingPredicate:
                           [NSPredicate predicateWithFormat:@"name BEGINSWITH 'T'"]];
        NSLog(@"array6:%@", array6);
        
        
        //检查是否以某个字母结尾(ENDSWITH)
        NSArray *array7 = [mutableArray filteredArrayUsingPredicate:
                           [NSPredicate predicateWithFormat:@"name ENDSWITH '4'"]];
        NSLog(@"array7:%@", array7);
        
        //包含 CONTAINS
        NSArray *array8 = [mutableArray filteredArrayUsingPredicate:
                           [NSPredicate predicateWithFormat:@"name CONTAINS '-3'"]];
        NSLog(@"array8:%@", array8);
        
        
        //like
        NSArray *array9 = [mutableArray filteredArrayUsingPredicate:
                           [NSPredicate predicateWithFormat:@"name like 'TOM*'"]];
        NSLog(@"array9:%@", array9);
        
    }
    return 0;
}


日志:

2013-03-17 19:29:25.304 PredicateDemo[1107:303] name:TOM-0   age:33
2013-03-17 19:29:25.307 PredicateDemo[1107:303] name:TOM-1   age:34
2013-03-17 19:29:25.309 PredicateDemo[1107:303] name:TOM-2   age:35
2013-03-17 19:29:25.310 PredicateDemo[1107:303] name:TOM-3   age:36
2013-03-17 19:29:25.311 PredicateDemo[1107:303] name:TOM-4   age:37
2013-03-17 19:29:25.311 PredicateDemo[1107:303] name:TOM-5   age:38
2013-03-17 19:29:25.312 PredicateDemo[1107:303] array :(
    "name:TOM-0   age:33",
    "name:TOM-1   age:34",
    "name:TOM-2   age:35",
    "name:TOM-3   age:36",
    "name:TOM-4   age:37",
    "name:TOM-5   age:38"
)
2013-03-17 19:29:25.313 PredicateDemo[1107:303] array2 :(
    "name:TOM-2   age:35",
    "name:TOM-3   age:36",
    "name:TOM-4   age:37",
    "name:TOM-5   age:38"
)
2013-03-17 19:29:25.314 PredicateDemo[1107:303] array3 :(
    "name:TOM-2   age:35",
    "name:TOM-3   age:36"
)
2013-03-17 19:29:25.315 PredicateDemo[1107:303] array4:(
    "name:TOM-0   age:33",
    "name:TOM-1   age:34",
    "name:TOM-2   age:35",
    "name:TOM-3   age:36",
    "name:TOM-4   age:37",
    "name:TOM-5   age:38"
)
2013-03-17 19:29:25.316 PredicateDemo[1107:303] array5(
    "name:TOM-1   age:34",
    "name:TOM-3   age:36"
)
2013-03-17 19:29:25.316 PredicateDemo[1107:303] array6:(
    "name:TOM-0   age:33",
    "name:TOM-1   age:34",
    "name:TOM-2   age:35",
    "name:TOM-3   age:36",
    "name:TOM-4   age:37",
    "name:TOM-5   age:38"
)
2013-03-17 19:29:25.317 PredicateDemo[1107:303] array7:(
    "name:TOM-4   age:37"
)
2013-03-17 19:29:25.318 PredicateDemo[1107:303] array8:(
    "name:TOM-3   age:36"
)
2013-03-17 19:29:25.324 PredicateDemo[1107:303] array9:(
    "name:TOM-0   age:33",
    "name:TOM-1   age:34",
    "name:TOM-2   age:35",
    "name:TOM-3   age:36",
    "name:TOM-4   age:37",
    "name:TOM-5   age:38"
)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用NSPredicate的Swift代码示例,用于将大量数据按时间分组: ```swift struct DataItem { let name: String let timeStamp: TimeInterval // 时间戳 } func groupDataByTime(_ data: [DataItem]) -> [[DataItem]] { // 将数据按时间先后排序 let sortedData = data.sorted { $0.timeStamp < $1.timeStamp } // 创建空字典 var groups = [String: [DataItem]]() // 使用NSPredicate过滤并分组数据 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" for item in sortedData { let date = Date(timeIntervalSince1970: item.timeStamp) let dateString = dateFormatter.string(from: date) let predicate = NSPredicate(format: "SELF.dateString == %@", dateString) let filteredArray = (groups as NSDictionary).filtered(using: predicate) if var items = filteredArray.first?.value as? [DataItem] { items.append(item) groups[dateString] = items } else { groups[dateString] = [item] } } // 将分组后的数据按时间先后顺序排序 let sortedGroups = groups.sorted { $0.key < $1.key } // 将所有分组添加到一个数组中 var result = [[DataItem]]() for (_, items) in sortedGroups { result.append(items) } return result } ``` 在这个示例中,我们同样定义了一个`DataItem`结构体来表示数据的名称和时间戳。`groupDataByTime`函数首先将数据按时间先后排序,然后使用`NSPredicate`过滤并分组数据。我们指定`NSPredicate`的格式为`SELF.dateString == %@`,其中`dateString`是我们根据时间戳计算得到的时间字符串,`%@`是用于替换的占位符。通过对字典进行过滤,我们可以得到一个包含指定时间字符串的数组,然后将新的数据项添加到这个数组中。最后,我们将所有分组添加到一个大数组中,按时间先后顺序排序,并返回结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值