在前面一篇博文中,我 说到过 search:这项措施 显得 很原始,因为 这项措施 无法找到 部分匹配的结果,也无法找到 多个匹配的结果。于是 我们 需要修改一下 search:这项措施。其中 AddressBook.h这个文件中的search: 修改成 这样。
| -(NSMutableArray *)search:(NSString *)nameToSearch; |
AddressBook.m这个文件中 search:这项措施的实施细则 修改成 这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-(NSMutableArray*)search:(NSString*)nameToSearch
{
NSMutableArray*matches=[[NSMutableArrayalloc]init];
for(AddressCard*currentCardinbook)
{
if([currentCard.namerangeOfString:nameToSearchoptions:NSCaseInsensitiveSearch].location!=NSNotFound)
{
[matchesaddObject:currentCard];
}
}
returnmatches;
}
|
为了 search:这项措施 能够找到 多个匹配的结果,其结果类型 由AddressBook类型的物件 换成了 可修改数组,也就是 NSMutableArray类型的物件,这样 就可以容纳 多个结果。
在search:这项措施中,我 首先 创建了 一个NSMutableArray类型的数组物件matches,用来 存储 匹配结果。
接着 同样 用 快速枚举 将book中的地址卡片 一个一个地 依次 读取 到currentCard当中。
每读取 一张卡片,都会对 这张卡片中的姓名,也就是 currentCard.name,采取 rangeOfString:options:这项措施。
rangeOfString:options:这项措施 附带 两个参数。其中 第一个参数 是 需要在其实施对象中搜索的字符串,第二个参数 是 选项。在这里 我 将 需要搜索的内容,也就是 字符串nameToSearch,作为 第一个参数,将 NSCaseInsensitiveSearch 作为 第二个参数,NSCaseInsensitiveSearch 表示 忽略 大小写。
rangeOfString:options:这项措施所产生的结果 是 NSRange类型的组织,这个NSRange组织中的两个成员location 和 length 分别 用来表示 rangeOfString:options:这项措施的参数所代表的字符串 在其实施对象所代表的字符串中的位置 和 长度。如果 rangeOfString:options:这项措施 在其实施对象所代表的字符串中 没有找到 其参数所代表的字符串,那么 它所产生的结果中的成员location的值 就是 NSNotFound
用来表示 没有找到。
for()循环中的if()语句 会判断 rangeOfString:options:这项措施所产生的结果中location这个成员的值 是否不是 NSNotFound,如果 不是,就表明 需要搜索的字符串 在当前的卡片当中 找到了,于是 就会执行
| [matches addObject:currentCard]; |
这行语句,将 当前的卡片 添加 到数组物件matches当中。在search:这项措施的最后
这行语句 会将 存储着匹配结果的数组物件matches 作为结果 传递回去。
接下来 我们 来看看 经过修改的search:措施 是否能够 如我们所愿地 工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #import <Foundation/NSAutoreleasePool.h> #import "AddressBook.h" int main(int argc,const char *argv[]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; AddressCard *cardOne=[[AddressCard alloc] init]; AddressCard *cardTwo=[[AddressCard alloc] init]; AddressCard *cardThree=[[AddressCard alloc] init]; AddressCard *cardFour=[[AddressCard alloc] init]; [cardOne setName:@"Julia Kochan" andEmail:@"jewls337@axlc.com"]; [cardTwo setName:@"Tony Iannino" andEmail:@"tony.iannino@techfitness.com"]; [cardThree setName:@"Jamie Baker" andEmail:@"jbaker@kochan-wood.com"]; [cardFour setName:@"Zijin Zhang" andEmail:@"540596744@qq.com"]; AddressBook *myBook=[[AddressBook alloc] initWithName:@"Zijin's Address Book"]; [myBook addCard:cardOne]; [myBook addCard:cardTwo]; [myBook addCard:cardThree]; [myBook addCard:cardFour]; NSMutableArray *cardsWanted=[myBook search:@"ia"]; if([cardsWanted count]!=0) { for(AddressCard *cardFound in cardsWanted) { [cardFound print]; } } else { NSLog(@"没找到!"); } [cardOne release]; [cardTwo release]; [cardThree release]; [cardFour release]; [myBook release]; [pool drain]; return 0; } |
运行 这个程序后,可以得到 这样的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
2012-04-25 12:54:36.127 Sample[993:707] =================================
2012-04-25 12:54:36.129 Sample[993:707] | |
2012-04-25 12:54:36.134 Sample[993:707] |Julia Kochan |
2012-04-25 12:54:36.134 Sample[993:707] |jewls337@axlc.com |
2012-04-25 12:54:36.135 Sample[993:707] | |
2012-04-25 12:54:36.135 Sample[993:707] | |
2012-04-25 12:54:36.136 Sample[993:707] | 0 0 |
2012-04-25 12:54:36.136 Sample[993:707] =================================
2012-04-25 12:54:36.136 Sample[993:707] =================================
2012-04-25 12:54:36.137 Sample[993:707] | |
2012-04-25 12:54:36.137 Sample[993:707] |Tony Iannino |
2012-04-25 12:54:36.138 Sample[993:707] |tony.iannino@techfitness.com |
2012-04-25 12:54:36.138 Sample[993:707] | |
2012-04-25 12:54:36.138 Sample[993:707] | |
2012-04-25 12:54:36.139 Sample[993:707] | 0 0 |
2012-04-25 12:54:36.139 Sample[993:707] =================================
|
在这个程序中 我 在地址簿myBook当中 搜索了 字符串”ia”,并且 将 结果 存储 在可修改数组物件cardsWanted当中。
接着 我 对cardsWanted这个数组物件 采取了 count这项措施,用来计算 cardsWanted这个物件中的卡片的数量。如果 cardsWanted这个数组物件中的卡片数量 不为 0,那么 就利用 快速枚举 将 其中的卡片 依次 读取 并且 显示出来;如果 cardsWanted这个数组物件中的卡片数量 为 0,那么 就提示 用户 什么 也没有找到。