实现简单通讯录操作。
1、定义联系⼈人类Contact。实例变量:姓名、性别、电话号码、住址、分组名称。⽅方法:初始化⽅方法(姓名、电话号码)、显⽰示联系⼈人信息
2、在main.m中定义可变数组,管理所有联系人。可以添加新联系人对象,如果姓名或电话号码为空,打印添加失败。
3、获取某个分组下的所有联系⼈。
4、根据电话号码搜索联系人。
5、获取所有⼥女性联系人
6、根据姓名删除联系⼈
7、删除某个分组全部联系人
8、展⽰示通讯录中所有联系人
9、选做:定义AddressBook类,封装上述功能。
实现中等难度通讯录。需求:
1、定义联系⼈人类Contact。实例变量:姓名(拼⾳音,⾸首字⺟母⼤大写)、性别、电话号码、住址、分组名称、年龄。⽅方法:⾃自定义初始化⽅方法(姓名、电话号码)、显⽰示联系⼈人信息
2、在main.m中定义字典,分组管理所有联系⼈人。分组名为26个⼤大写的英⽂文字⺟母。
3、可以添加联系⼈人对象,如果姓名或电话号码为空,添加失败。添加联系⼈人到匹配的分组。
4、获取某个分组名称下所有联系⼈人,并且按照姓名升序排列。
5、从通讯录中根据电话号码搜索联系⼈人。
6、获取所有⼥女性的联系⼈人,并且按照年龄的降序排列。
7、根据姓名删除某个联系⼈人。
8、删除某个分组的全部联系⼈人。
#pragma mark -- 非@property用法
第一,申请一个AddressPerson类
AddressPerson.h
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface AddressPerson : NSObject
{
NSString *_name;
NSString *_gender;
NSString *_phoneNumber;
NSString *_address;
NSString *_groupName;
}
//初始化方法 名字和电话
- (id)initWithPersonName:(NSString *)name
phoneNumber:(NSString *)phoneNumber;
//set赋值方法
- (void)setPersonGender:(NSString *)gender
address:(NSString *)address
groupName:(NSString *)groupName;
//取值方法
- (NSString *)getName;
- (NSString *)getGender;
- (NSString *)getAddress;
- (NSString *)getPhoneNumber;
- (NSString *)getGroupName;
//打印联系人信息
- (void)printPersonInfo;
@end
</span>
<span style="font-size:14px;">#import "AddressPerson.h"
@implementation AddressPerson
- (id)initWithPersonName:(NSString *)name phoneNumber:(NSString *)phoneNumber{
if (self = [super init]) {
_name = name;
_phoneNumber = phoneNumber;
}
return self;
}
- (void)setPersonGender:(NSString *)gender address:(NSString *)address groupName:(NSString *)groupName{
_gender = gender;
_address = address;
_groupName = groupName;
}
- (NSString *)getName{
return _name;
}
- (NSString *)getGender{
return _gender;
}
- (NSString *)getGroupName{
return _groupName;
}
- (NSString *)getPhoneNumber{
return _phoneNumber;
}
- (NSString *)getAddress{
return _address;
}
- (void)printPersonInfo{
NSLog(@"联系人的信息为:名字 %@ , 性别 %@ , 电话 %@ , 地址 %@ , 分组名称 %@" , _name , _gender , _phoneNumber , _address , _groupName);
}
@end</span>
第二,申请一个AddressBook类
AddressBook.h
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface AddressBook : NSObject
{
NSMutableArray *_addressArray;
}
//初始化
- (id)initWithMutableArray:(NSMutableArray *)array;
//添加联系人信息
- (void)addContaxtPersonName:(NSString *)name
gender:(NSString *)gender
phoneNumber:(NSString *)phoneNumber
address:(NSString *)address
groupName:(NSString *)groupname;
//打印所有的女性联系人
- (void)searchAllContaxtOfGirl;
//根据组名来查找联系人,你得先拿到查找哪个组。所以需要一个参数 -- 组名
- (void)searchALLContaxtBaseGroupName:(NSString *)groupName;
//根据电话来查找联系人,同样需要一个电话参数作为查找依据
- (void)searchContaxtBasePhoneNumber:(NSString *)phoneNumber;
//根据名字删除联系人
- (void)deleteTheContaxtBaseName:(NSString *)name;
//根据组名来删除联系人
- (void)deleteContaxtsBaseGroupName:(NSString *)groupName;
//打印所有联系人
- (void)printAllContaxtsInOf;
//对数组取值
- (NSMutableArray *)getArray;
@end</span>
AddressBook.m
<span style="font-size:14px;">#import "AddressBook.h"
#import "AddressPerson.h"
@implementation AddressBook
- (id)initWithMutableArray:(NSMutableArray *)array{
_addressArray = array;
return self;
}
- (void)addContaxtPersonName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber address:(NSString *)address groupName:(NSString *)groupname{
AddressPerson *tempPerson = [[AddressPerson alloc]initWithPersonName:name phoneNumber:phoneNumber];
[tempPerson setPersonGender:gender address:address groupName:groupname];
if (!([tempPerson getName] && [tempPerson getPhoneNumber] )) {
NSLog(@"添加失败 , 请填写号码或者名字");
}
else{
[_addressArray addObject:tempPerson];
NSLog(@"添加成功");
}
}
- (void)searchAllContaxtOfGirl{
for (int i = 0; i < [_addressArray count]; i++) {
if ([[_addressArray[i] getGender]isEqualToString:@"girl"] ) {
[_addressArray[i] printPersonInfo];
}
}
}
- (void)searchALLContaxtBaseGroupName:(NSString *)groupName{
for (int i = 0; i < [_addressArray count]; i ++) {
if ([[_addressArray[i] getGroupName]isEqualToString:groupName] ) {
[_addressArray[i] printPersonInfo];
}
}
}
- (void)searchContaxtBasePhoneNumber:(NSString *)phoneNumber{
int i = 0;//希望它做一个全局变量,方便下面使用
for (i = 0 ; i < [_addressArray count]; i ++) {
if ([[_addressArray[i] getPhoneNumber] compare:phoneNumber ] ) {
[_addressArray[i] printPersonInfo ];
//找到这个人之后,就结束吧,下面的不需要再执行了
return;
}
}
//但是如果,数组都全部遍历一遍之后还没有找到这个人,那么.....
if (i == [_addressArray count] ) {
NSLog(@"亲,您的号码是不是输错了啊!");
}
}
//封装的中心思想就是把某些功能放到其他类里面来写。这样就减轻mian.m的工作量。但是,不管是OC还是C,数据--永远是我们最关注的事情。所以,在封装的时候,我们把在main.m里面写好的数据,用间接传值的方式,传了进来。而且,以后也会继续做这件事情。所以,大家不要感觉压力太大或是太难,学习就是个循序渐进的过程,见过的多了就会有经验了!加油!
//根据名字来删联系人
- (void)deleteTheContaxtBaseName:(NSString *)name{
NSLog(@"要删除的联系人的名字是%@" , name);
for (int i = 0; i < [_addressArray count]; i++) {
if ([[_addressArray[i] getName]isEqualToString:name]) {
//第一种删除方式
[_addressArray removeObject:_addressArray[i]];
//第二种删除
[_addressArray removeObjectAtIndex:i];
}
}
}
- (void)deleteContaxtsBaseGroupName:(NSString *)groupName{
NSLog(@"删除%@组" , groupName);
for (int i = 0; i < [_addressArray count] ; i ++) {
if ([[_addressArray[i] getGroupName]isEqualToString:groupName]) {
[_addressArray removeObjectAtIndex:i];
}
}
}
- (void)printAllContaxtsInOf{
for (AddressPerson *person in _addressArray) {
NSLog(@"名字 %@, 性别 %@ , 电话号码: %@ , 地址 :%@ , 分组:%@" , [person getName] , [person getGender] , [person getPhoneNumber] , [person getAddress] , [person getGroupName]);
}
}
@end</span>
第三,申请一个AddressBookManager类
AddressBookManager.h
<span style="font-size:14px;">#import <Foundation/Foundation.h>
#import "AddressPerson.h"
@interface AddressBookManager : NSObject
//这个字典,就是用来存储所有的联系人
{
NSMutableDictionary *_mutableDic;
}
//初始化
- (id)initWithMutableDic:(NSMutableDictionary *)dictionary;
- (NSMutableDictionary *)getDic;
//在此之前,大家的手机通讯录,是怎么快速查找到一个人的?
- (void)addContaxtPerson:(AddressPerson *)person;
//根据号码查找联系人
- (AddressPerson *)searchTheContaxtBasePhoneNumber:(NSString *)phoneNumber;
//根据号码来删除联系人
- (AddressPerson *)deleteTheContaxtBasePhoneNumber:(NSString *)phoneNumber;
- (void)printAddressBook;
@end
</span>
AddressBookManager.m
<span style="font-size:14px;">#import "AddressBookManager.h"
@implementation AddressBookManager
- (id)initWithMutableDic:(NSMutableDictionary *)dictionary{
_mutableDic = dictionary;
return self;
}
#pragma mark -- 下面有个地方需要大家修改啊!!!!!!!!
- (void)addContaxtPerson:(AddressPerson *)person{
// 第一步,先把这个联系人的名字拿到,之后首字母变大写。。然后,在进行取首字母操作。
NSString *capitalLetter = [[[person getName] capitalizedString] substringToIndex:1];
//这个时候呢,如果是一个从未被创建的键值对,这个数组肯定还没有被开辟过。肯定是没有值的,但是,没有关系,我们下面会判断一下!!
// 但是如果已经有这个键值对的话,就无需在看下面的了!
NSMutableArray *tempArray = [_mutableDic objectForKey:capitalLetter];
// 这个就是用来判断,如果数组从未被创建,直接赋值的话肯定是空的。所以,判断一下,如果数组为空,就重❤️创建一个键值对,以首字母为 键,以数组为 值。。
if (! tempArray) {
///
/嗨 在这里,大家修改一下啊
tempArray = [[NSMutableArray alloc]init];
[_mutableDic setObject:tempArray forKey:capitalLetter];
}
//最后一步,把添加的联系人加进数组中
[tempArray addObject:person];
}
- (NSMutableDictionary *)getDic{
return _mutableDic;
}
//方法的实现
- (AddressPerson *)searchTheContaxtBasePhoneNumber:(NSString *)phoneNumber{
//通过快速遍历,来查找联系人
for (NSString *key in _mutableDic) {
//这一步,就是通过遍历字典,来得到字典里面的值,只不过这个值比较庞大,是一个数组!
NSMutableArray *tempArr = [_mutableDic objectForKey:key];
//下面该遍历这个数组了,在数组里面找人。找到人之后,在把号码取出来比较一下!!
for (AddressPerson *person in tempArr) {
//通过,一层一层的获取。把联系人的号码拿到之后,跟行参传进来的值进行比较。如果比较成功。就进行打印。并且停止查找
if ([[person getPhoneNumber]isEqualToString:phoneNumber]) {
[person printPersonInfo];
//停止查找
return person;
}
}
}
return nil;
}
- (AddressPerson *)deleteTheContaxtBasePhoneNumber:(NSString *)phoneNumber{
//这一步,先通过号码,找到这个人。 之后再删除,所以第一步先找人
//我们上一个方法就是通过号码找人的,可否拿来借用一下啊???
//通过借助上面查找联系人的方法,在这里做一个嵌套。
AddressPerson *person1 = [self searchTheContaxtBasePhoneNumber:phoneNumber];
if (person1) {
//如果,已经找到这个人,就把这个人的名字的首字母拿出来。可以通过 kay来取值
NSString *captialLetter = [[[person1 getName] capitalizedString]substringToIndex:1];
//先找到这个人所在的数组
NSMutableArray *tempArray = [_mutableDic objectForKey:captialLetter];
//既然已经找到了这个人所在的数组,那就直接删除吧
[tempArray removeObject:person1];
//如果,这个数组里面的人已经被删空了,那就把数组也给删除吧
if ([tempArray count] == 0) {
[_mutableDic removeObjectForKey:captialLetter];
}
}
return nil;
}
- (void)printAddressBook {
for (NSString *key in _mutableDic) {
NSLog(@"Group %@:\n%@", key, _mutableDic[key]);
}
}
@end</span>
第四,main.m里面调用
<span style="font-size:14px;">#import <Foundation/Foundation.h>
#import "AddressPerson.h"
#import "AddressBook.h"
#import "AddressBookManager.h"
int main(int argc, const char * argv[]) {
//开始创建对象
AddressBookManager *manager = [[AddressBookManager alloc]initWithMutableDic:[NSMutableDictionary dictionary ]];
AddressPerson *one = [[AddressPerson alloc]initWithPersonName:@"AAA" phoneNumber:@"13523423456"];
[one setPersonGender:@"girl" address:@"China" groupName:@"朋友"];
[manager addContaxtPerson:one];
AddressPerson *two = [[AddressPerson alloc]initWithPersonName:@"BBB" phoneNumber:@"187987654321"];
[two setPersonGender:@"boy" address:@"USA" groupName:@"陌生人"];
[manager addContaxtPerson:two];
AddressPerson *three = [[AddressPerson alloc]initWithPersonName:@"CCC" phoneNumber:@"1357894562"];
[three setPersonGender:@"girl" address:@"China" groupName:@"朋友"];
[manager addContaxtPerson:three];
AddressPerson *four = [[AddressPerson alloc]initWithPersonName:@"DDD" phoneNumber:@"1357890962"];
[four setPersonGender:@"boy" address:@"China" groupName:@"陌生人"];
[manager addContaxtPerson:four];
AddressPerson *five = [[AddressPerson alloc]initWithPersonName:@"FFF" phoneNumber:@"1357894562"];
[five setPersonGender:@"girl" address:@"China" groupName:@"朋友"];
[manager addContaxtPerson:five];
NSLog(@"%@" , [manager getDic]);
//创建数组,把五个联系人放进数组里面
// NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithObjects:one , two , three , four , five, nil];
// NSLog(@"%@" , mutableArray);
//
//
// AddressBook *array = [[AddressBook alloc]initWithMutableArray:mutableArray];
// // [array addContaxtPersonName:@"Haha" gender:@"boy" phoneNumber:@"1234543234"
address:@"China"
groupName:@"朋友"];
// NSLog(@"打印所有人的信息");
// // [array printAllContaxtsInOf];
// NSLog(@"打印所有的女生");
[array searchAllContaxtOfGirl];
[array deleteTheContaxtBaseName:@"BBB"];
// [array deleteContaxtsBaseGroupName:@"朋友"];
// [array printAllContaxtsInOf];
NSLog(@"%@" , [manager getDic]);
[manager printAddressBook];
return 0;
}
</span>
#pragma mark -- @property用法
第一,创建Person类
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic , retain)NSString *name;
@property (nonatomic , retain)NSString *gender;
@property (nonatomic , retain)NSString *groupName;
@property (nonatomic , retain)NSString *phoneNumber;
- (id)initWithPersonName:(NSString *)name
gender:(NSString *)gender
groupName:(NSString *)groupName
phoneNumber:(NSString *)phoneNumber;
+ (id)personWithName:(NSString *)name
gender:(NSString *)gender
groupName:(NSString *)groupName
phoneNumber:(NSString *)phoneNumber;
@end
Person.m
#import "Person.h"
@implementation Person
- (id)initWithPersonName:(NSString *)name gender:(NSString *)gender groupName:(NSString *)groupName phoneNumber:(NSString *)phoneNumber{
if (self = [super init]){
_name = name;
_gender = gender;
_phoneNumber = phoneNumber;
_groupName = groupName;
}
return self;
}
+ (id)personWithName:(NSString *)name gender:(NSString *)gender groupName:(NSString *)groupName phoneNumber:(NSString *)phoneNumber{
Person *one = [[Person alloc]initWithPersonName:name gender:gender groupName:groupName phoneNumber:phoneNumber];
return one;
}
@end
第一,创建AddressBook类
AddressBook.h
#import <Foundation/Foundation.h>
@interface AddressBook : NSObject
@property (nonatomic , retain)NSMutableArray *mutableArray;
//创建初始化方法,借用这个方法来传值
- (id)initWithMutableArray:(NSMutableArray *)array;
//方法的声明
//查找所有的女生
- (void)searchAllContactOfGirl;
//按照号码查找
- (void)searchAllContactByPhoneNumber:(NSString *)number;
//按名字删除
- (void)deleteTheContactByName:(NSString *)name;
@end
AddressBook.m
<span style="font-size:14px;">#import "AddressBook.h"
#import "Person.h"
@implementation AddressBook
- (id)initWithMutableArray:(NSMutableArray *)array{
if (self=[super init]){
_mutableArray = array;
}
return self;
}
//查找所有女生
- (void)searchAllContactOfGirl{
//1.先遍历数组,因为对象都在数组中,再把性别拿出来看看
for (Person *obj in _mutableArray){
if ([obj.gender isEqualToString:@"girl"]){
NSLog(@"名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",obj.name , obj.gender , obj.groupName , obj.phoneNumber);
}
}
}
//按照号码查找联系人
- (void)searchAllContactByPhoneNumber:(NSString *)number{
NSLog(@"查询了电话号码后为");
for (Person *object in _mutableArray){
if ([object.phoneNumber isEqualTo:number]){
NSLog(@"名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",object.name , object.gender , object.groupName , object.phoneNumber);
}
}
}
//按名字删除
- (void)deleteTheContactByName:(NSString *)name{
NSLog(@"按照某人姓名删除");
for (Person *object in _mutableArray){
if ([object.name isEqualTo:name]){
NSLog(@"删除的人的名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",object.name , object.gender , object.groupName , object.phoneNumber);
[_mutableArray removeObject:object];
//第一种方式
break;//安全起见,找到这个对象后就停止循环,不在查找。
}
}
//第二种方式
NSLog(@"按照某人姓名删除");
for (int i = 0; i < [_mutableArray count] ; i ++){
if ([[[_mutableArray objectAtIndex:i]name] isEqualTo:name]){
[_mutableArray removeObjectAtIndex:i];
}
}
for (int i = 0; i < [_mutableArray count] ; i ++){
NSLog(@"名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",[[_mutableArray objectAtIndex:i]name] , [[_mutableArray objectAtIndex:i]gender] , [[_mutableArray objectAtIndex:i]groupName] ,[[_mutableArray objectAtIndex:i]phoneNumber]);
}
//第三种
for (int i = 0; i < [_mutableArray count] ; i ++){
Person *two = [_mutableArray objectAtIndex:i];
if ([two.name isEqualTo:name]){
[_mutableArray removeObjectAtIndex:i];
}
}
}
@end</span>