当你 拥有 一本庞大的地址簿时,你 就不大愿意 每次要查找 某人时 都将 全部的内容 都列举出来。于是 一个比较自然的做法 就是 编写 一项措施 来查找 某个联系人的信息。我们 可以把 这项措施 称为 search:,把 我们需要查找的联系人的姓名 作为 参数。先 把 这行语句
| -(AddressCard *)search:(NSString *)nameToSearch; |
添加 到AddressBook这类物件的接口文件AddressBook.h当中。然后 在实施文件AddressBook.m当中 具体地 描述 search:这项措施 是如何 实施的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
-(AddressCard*)search:(NSString*)nameToSearch
{
for(AddressCard*currentCardinbook)
{
if([currentCard.namecaseInsensitiveCompare:nameToSearch]==NSOrderedSame)
{
returncurrentCard;
}
}
returnnil;
}
|
在search:这项措施当中 参数,也就是 需要搜索的姓名,会存储 在本地变量nameToSearch当中。search:这项措施中的快速枚举 会 依次 读取 book这个数组物件中的各个物件。每次读取出来的物件 都会存储 在currentCard当中。每次读取完 一个物件,都会执行 循环体:
| if([currentCard.name caseInsensitiveCompare:nameToSearch]==NSOrderedSame) { return currentCard; } |
在循环体中的if()里面,
|
[currentCard.namecaseInsensitiveCompare:nameToSearch]
|
这行语句 对 包含在currentCard这个物件中的物件name 采取了 caseInsensitiveCompare:这项措施 并且 参数 为 nameToSearch这个物件。currentCard这个物件中的物件name 为 当前地址卡片中的姓名,而 nameToSearch这个物件 为 需要搜索的姓名。于是 caseInsensitiveCompare:这项措施 会比较 当前地址卡片中的姓名 和 需要搜索的姓名 并且 忽略 大小写。如果 caseInsensitiveCompare:这项措施
产生出 NSOrderedSame这个结果,则 表明 当前卡片中的姓名 和 需要搜索的姓名 在忽略 大小写的情况下 一致。
如果 caseInsensitiveCompare:这项措施产生的结果 为 NSOrderedSame,就会执行
这行语句,将 当前的地址卡片 作为结果 传递回去。
如果 快速枚举 执行结束后,还是 没有找到 和需要搜索的姓名一致的地址卡片,则会执行
这行语句,将 空值 作为结果 传递回去。
接下来 我们 在程序中 测试一下 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 76 77 78 79 80 81 82 83 84 85 86 87 | #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]; AddressCard *cardWanted=[myBook search:@"jamie baker"]; if(cardWanted!=nil) { [cardWanted print]; } else { NSLog(@"没找到!"); } cardWanted=[myBook search:@"Baker"]; if(cardWanted!=nil) { [cardWanted print]; } else { NSLog(@"没找到!"); } [cardOne release]; [cardTwo release]; [cardThree release]; [cardFour release]; [myBook release]; [pool drain]; return 0; } |
运行 过后,得到 这样的结果:
|
2012-04-24 15:06:04.461 Sample[7909:707] =================================
2012-04-24 15:06:04.463 Sample[7909:707] | |
2012-04-24 15:06:04.468 Sample[7909:707] |Jamie Baker |
2012-04-24 15:06:04.470 Sample[7909:707] |jbaker@kochan-wood.com |
2012-04-24 15:06:04.470 Sample[7909:707] | |
2012-04-24 15:06:04.470 Sample[7909:707] | |
2012-04-24 15:06:04.472 Sample[7909:707] | 0 0 |
2012-04-24 15:06:04.472 Sample[7909:707] =================================
2012-04-24 15:06:04.473 Sample[7909:707] 没找到!
|
在这个程序当中 我 分别 搜索了 jamie baker 和 Baker两个名字,其中 第一个 找到了,并且 显示了出来,而 第二个 没有找到。
search:这项措施 还比较原始,因为 它 只能找到 准确匹配,而 不能找到 部分匹配,而且 也无法找到 多个结果。
如果 需要 search:这项措施 能找到 部分匹配的结果,那么 则 需要用到 rangeOfString:这项措施。因为 rangeOfString这项措施 如果 在其实施对象当中 找到了 参数的内容,产生的结果 就是 参数 在其实施对象中的位置;如果 没有找到,那么 产生出来的结果 就是 nil。利用 这个原理,我们 可以使 search:这项措施 找到 可以部分匹配的地址卡片。
如果 需要 search:这项措施 能找到 多个匹配的结果,则 需要 创建 一个可修改的数组物件。每找到 一个匹配的地址卡片,就将 这张卡片 添加 到数组物件当中。最后 将 包含匹配结果的数组物件 作为结果 传递回去。