【OC学习-33】谓词介绍和小案例,其实相当于一个筛选过滤器的作用

本文介绍如何使用NSPredicate对象进行对象筛选,包括创建对象数组、设置过滤条件、输出符合条件的对象名,以及使用占位符、逻辑运算符、包含查询等特性进行复杂查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谓词,呃,其实是一个NSPredicate对象,你可以设置一些条件给这个对象,那么这个对象就相当于一个过滤器了,满足它条件的和不满足的如何如何,是一个过滤作用。

(1)创建一个对象,有name和age两个实例变量,然后利用for语句创建10个对象到一个数组中,最后创建一个谓词,过滤一下,把年龄小于25的那个对象的名字输出。

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

@interface Person : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,retain)NSNumber *age;
@end

//main.m文件
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //定义一个数组,并利用for语句往里面添加10个元素
        NSMutableArray *mutarr1=[NSMutableArray arrayWithCapacity:10];
        for (int i=0; i<10; i++) {
            Person *person=[[Person alloc]init];
            person.age=@(20+i);
            if (i<5) {
                person.name=[NSString stringWithFormat:@"jack_%d",i];
            }else{
                person.name=[NSString stringWithFormat:@"tom_%d",i];
            }
            [mutarr1 addObject:person];
        }
        //创建一个谓词,也就是过滤条件,直观可见这个条件就是年龄小于25
        NSPredicate *predic1=[NSPredicate predicateWithFormat:@"age<25"];
        //利用循环这个数组,输出符合条件的对象的name
        for (Person *p in mutarr1) {
            if ([predic1 evaluateWithObject:p]) {
                NSLog(@"%@",p.name);
            }
        }
    }
    return 0;
}


结果就是过滤出来的:

jack_0
jack_1
jack_2
jack_3
jack_4

(2)也可以利用谓词先过滤一下这个数组,然后再输出:

NSArray *arr2=[mutarr1 filteredArrayUsingPredicate:predic1];
        NSLog(@"%@",arr2);
当然,这样做之前,需要先定义对象的打印方法,在Person.m文件中:

#import "Person.h"

@implementation Person
-(NSString *)description{
    NSString *s=[NSString stringWithFormat:@"%@,%@",_name,_age];
    return s;
}
@end

(3)也可以使用占位符,以下的几条主要是针对条件里面的书写的

NSPredicate *predic1=[NSPredicate predicateWithFormat:@"age<%d",25];


(4)也可以使用and和or(&&和||)都可以
NSPredicate *predic1=[NSPredicate predicateWithFormat:@"age<%d && age>21",25];

(5)用in。in后面也可以跟一个数组,也就是要再数组里面。

NSPredicate *predic1=[NSPredicate predicateWithFormat:@"name in {'jack_0','jack_1'}"];

(6)还可以用BEGINSWITH和ENDSWITH来匹配,大小写敏感

NSPredicate *predic1=[NSPredicate predicateWithFormat:@"name BEGINSWITH'j' || ENDSWITH '1'"];

(7)CONTAINS和LIKE包含查询

NSPredicate *predic1=[NSPredicate predicateWithFormat:@"name CONTAINS 'a' "];
NSPredicate *predic1=[NSPredicate predicateWithFormat:@"name LIKE '*a*' "];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值