iOS開發(fā)-NSPredicate謂詞專題


Cocoa提供了一個名為NSPredicate的類,它用于指定過濾器的條件。可以創(chuàng)建NSPredicate對象,通過它準(zhǔn)確的描述所需的條件,通過謂詞篩選每個對象,判斷它們是否與條件相匹配。Cocoa用NSPredicate描述查詢的方式,原理類似于在數(shù)據(jù)庫中進行查詢,可以在數(shù)據(jù)庫風(fēng)格的API中使用NSPredicate類,比如Core DataSpotlight

代碼示例:

兩個對象類:Student和Teacher

//
//  Student.h
//  謂詞
//
//  Created by on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject

@property (nonatomic, retain) NSString *stuName;
@property (nonatomic, assign) NSInteger stuAge;

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;

@end
//
//  Student.m
//  謂詞
//
//  Created by on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import "Student.h"

@implementation Student

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
    if (self = [super init]) {
        _stuName = name;
        _stuAge = age;
    }
    return self;
}

@end
//
//  Teacher.h
//  謂詞
//
//  Created by on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>

@class Student;

@interface Teacher : NSObject

@property (nonatomic, strong) Student *student;
@property (nonatomic, retain) NSString *teaName;
@property (nonatomic, assign) NSInteger teaAge;

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;

@end
//
//  Teacher.m
//  謂詞
//
//  Created by wujiafeng on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import "Teacher.h"

@implementation Teacher

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
    if (self = [super init]) {
        _teaName = name;
        _teaAge = age;
    }
    return self;
}

@end

測試:

//
//  main.m
//  謂詞
//
//  Created by wujiafeng on 15/3/16.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *stu = [[Student alloc] initWithName:@"Jack" andAge:12];
        Teacher *teacher = [[Teacher alloc] initWithName:@"Tom" andAge:20];
        
//        設(shè)置teacher中的student對象
        teacher.student = stu;
        
//        創(chuàng)建謂詞
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"student._stuName == 'Jack'"];
//        通知接收對象(即謂詞)根據(jù)指定的對象計算自身的值
        BOOL match = [predicate evaluateWithObject:teacher];
        NSLog(@"%s", (match) ? "YES" : "NO");
        
        
        NSMutableArray *stuArray = [NSMutableArray arrayWithCapacity:10];
        for (int i = 0; i < 10; i++) {
            Student *studentTemp = [[Student alloc] initWithName:[NSString stringWithFormat:@"jack%d", i] andAge:20 + i];
            [stuArray addObject:studentTemp];
        }
        
        NSPredicate *pre = [NSPredicate predicateWithFormat:@"_stuAge > 25"];
//        迭代出年齡大于25歲的學(xué)生信息
        for (Student *temp in stuArray) {
            if ([pre evaluateWithObject:temp]) {
                NSLog(@"姓名:%@,年齡:%ld", temp.stuName, temp.stuAge);
            }
        }
        
//        調(diào)用數(shù)組過濾器實現(xiàn)過濾
//        此方法會返回一個NSArray數(shù)組
        NSArray *stus = [stuArray filteredArrayUsingPredicate:pre];
        
//        此方法是直接從NSMutableArray中過濾掉不滿足條件的項
        [stuArray filterUsingPredicate:pre];
//        KVC的運用
        NSArray *stuNamesForMutable = [stuArray valueForKey:@"stuName"];
        NSLog(@"%@", stuNamesForMutable);
        
        NSLog(@"=======調(diào)用數(shù)組方法處理=======");
        for (Student *temp in stus) {
            NSLog(@"姓名:%@,年齡:%ld", temp.stuName, temp.stuAge);
        }
        
//        KVC的運用
        NSArray *arryForStuName = [stus valueForKey:@"stuName"];
        NSLog(@"%@", arryForStuName);
        
        pre = [NSPredicate predicateWithFormat:@"_stuName == %@", @"Tom"];
//        這里的%K指的是鍵路徑
        pre = [NSPredicate predicateWithFormat:@"%K == %@", @"_stuName", @"Tom"];
        
        
//        另一種方式是將變量名放入字符串中,類似于環(huán)境變量
        NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"_stuName == $NAME"];
//        這里鍵是變量名(不包括美元符號),這里用字符串Jack作為鍵“NAME”的值
        NSDictionary *varDic = [NSDictionary dictionaryWithObjectsAndKeys:@"Jack", @"NAME", nil];
        pre = [predicateTemplate predicateWithSubstitutionVariables:varDic];
        BOOL match1 = [pre evaluateWithObject:stu];
        NSLog(@"%s", (match1) ? "YES" : "NO");
    }
    return 0;
}

輸出結(jié)果如下:

2015-03-16 18:30:23.938 謂詞[581:15147] YES

2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack6,年齡:26

2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack7,年齡:27

2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack8,年齡:28

2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack9,年齡:29

2015-03-16 18:30:23.939 謂詞[581:15147] (
jack6,
jack7,
jack8,
jack9
)

2015-03-16 18:30:23.939 謂詞[581:15147] =======調(diào)用數(shù)組方法處理=======

2015-03-16 18:30:23.939 謂詞[581:15147] 姓名:jack6,年齡:26

2015-03-16 18:30:23.940 謂詞[581:15147] 姓名:jack7,年齡:27

2015-03-16 18:30:23.940 謂詞[581:15147] 姓名:jack8,年齡:28

2015-03-16 18:30:23.940 謂詞[581:15147] 姓名:jack9,年齡:29

2015-03-16 18:30:23.940 謂詞[581:15147] (
jack6,
jack7,
jack8,
jack9
)
2015-03-16 18:30:23.940 謂詞[581:15147] YES

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:http://www.cocoachina.com/ios/20160111/14926.html 1、大...
    一筆春秋閱讀 2,861評論 0 2
  • 點 擊 ?? 含淚的 眼 點 擊 ?? 他山之石,亦有璞玉 點 擊 ??...
    小義子_正版閱讀 358評論 0 0
  • 故事:河邊的蘋果。 昨晚九點多到十一點多,一個半小時的時間,升華、錄音。錄著錄著有點著急了,越說越不成型。還是得提...
    斑馬_b1e3閱讀 204評論 0 0
  • 最近在讀《街道與廣場》,其中緒論中有句原文為“城市規(guī)劃可以定義為資源分配的過程”。最近2016年普立茲獎得主智利建...
    自語者閱讀 643評論 0 0
  • 【也許,父母子女之間的緣份,就是一場漸行漸遠(yuǎn)的別離。】 01 回家 清明節(jié),我又回到了老家,一是掃墓,二是看看父親...
    富蘭克劉閱讀 596評論 8 7