当你 拥有 一本庞大的地址簿时,你 就不大愿意 每次要查找 某人时 都将 全部的内容 都列举出来。于是 一个比较自然的做法 就是 编写 一项措施 来查找 某个联系人的信息。我们 可以把 这项措施 称为 search:,把 我们需要查找的联系人的姓名 作为 参数。先 把 这行语句
1
|
-
(
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
*currentCard
in
book
)
{
if
(
[
currentCard
.
name
caseInsensitiveCompare
:
nameToSearch
]
==
NSOrderedSame
)
{
return
currentCard
;
}
}
return
nil
;
}
|
在search:这项措施当中 参数,也就是 需要搜索的姓名,会存储 在本地变量nameToSearch当中。search:这项措施中的快速枚举 会 依次 读取 book这个数组物件中的各个物件。每次读取出来的物件 都会存储 在currentCard当中。每次读取完 一个物件,都会执行 循环体:
1
2
3
4
5
6
7
|
if
(
[
currentCard
.
name
caseInsensitiveCompare
:
nameToSearch
]
==
NSOrderedSame
)
{
return
currentCard
;
}
|
在循环体中的if()里面,
1
|
[
currentCard
.
name
caseInsensitiveCompare
:
nameToSearch
]
|
这行语句 对 包含在currentCard这个物件中的物件name 采取了 caseInsensitiveCompare:这项措施 并且 参数 为 nameToSearch这个物件。currentCard这个物件中的物件name 为 当前地址卡片中的姓名,而 nameToSearch这个物件 为 需要搜索的姓名。于是 caseInsensitiveCompare:这项措施 会比较 当前地址卡片中的姓名 和 需要搜索的姓名 并且 忽略 大小写。如果 caseInsensitiveCompare:这项措施 产生出 NSOrderedSame这个结果,则 表明 当前卡片中的姓名 和 需要搜索的姓名 在忽略 大小写的情况下 一致。
如果 caseInsensitiveCompare:这项措施产生的结果 为 NSOrderedSame,就会执行
1
|
return
currentCard
;
|
这行语句,将 当前的地址卡片 作为结果 传递回去。
如果 快速枚举 执行结束后,还是 没有找到 和需要搜索的姓名一致的地址卡片,则会执行
1
|
return
nil
;
|
这行语句,将 空值 作为结果 传递回去。
接下来 我们 在程序中 测试一下 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
;
}
|
运行 过后,得到 这样的结果:
1
2
3
4
5
6
7
8
9
|
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:这项措施 能找到 多个匹配的结果,则 需要 创建 一个可修改的数组物件。每找到 一个匹配的地址卡片,就将 这张卡片 添加 到数组物件当中。最后 将 包含匹配结果的数组物件 作为结果 传递回去。