1、地址簿的制作(控制台应用程序)
•定义类AddressCard表示联系人名片,联系人信息包括姓名、email、手机号码;定义初始化函数对名片进行初始化,初始化时需要验证emial和手机号码的有效性;
•定义类AddressBook表示地址簿,地址簿中使用NSMutableArray数组存放所有的联系人名片,定义方法实现地址簿中名片的添加、删除、查找(根据姓名查找)、排序(按姓名升序排列)、打印所有联系人信息的功能。
•将地址簿进行归档。
导航:
--AdressCard.h
--AdressCard.h
--AdressBook.h
--AdressBook.h
--main.m
//AdressCard.h #import <Foundation/Foundation.h> @interface AddressCard : NSObject<NSCoding> // //属性的参数说明(参见博客内的其他文章),深浅拷贝 @property (nonatomic,copy) NSString *name; @property (nonatomic,copy) NSString *email; @property (nonatomic,copy) NSString *number; // -(AddressCard *)initWith:(NSString *)_name Email:(NSString *)_email Number:(NSString *)_number; -(BOOL)judgeEmail:(NSString *)_email; -(BOOL)judgeNumber:(NSString *)_number; @end //AdressCard.m #import "AddressCard.h" @implementation AddressCard @synthesize name; @synthesize email; @synthesize number; //对象的归档,系统对象,自定义对象(参见博客内的其他文章) //编码 -(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.email forKey:@"email"]; [aCoder encodeObject:self.number forKey:@"number"]; } //解码 -(id)initWithCoder:(NSCoder *)aDecoder{ self.name=[aDecoder decodeObjectForKey:@"name"]; self.email=[aDecoder decodeObjectForKey:@"email"]; self.number=[aDecoder decodeObjectForKey:@"number"]; return self; } //初始化 -(AddressCard *)initWith:(NSString *)_name Email:(NSString *)_email Number:(NSString *)_number{ self=[super init]; if ([self judgeEmail:_email]&&[self judgeNumber:_number]) { self.name=_name; self.email=_email; self.number=_number; } else{ if ([self judgeEmail:_email]==NO) { NSLog(@"%@:邮箱不符合规范",_email); } if ([self judgeNumber:_number]==NO) { NSLog(@"%@:号码不符合规范",_number); } } return self; } //正则表达式(参见博客内的其他文章) //判断email是否符合要求 -(BOOL)judgeEmail:(NSString *)_email{ NSString *emailCheck=@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest=[NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailCheck]; return [emailTest evaluateWithObject:_email]; } //判断number是否符合要求 -(BOOL)judgeNumber:(NSString *)_number{ NSString *phoneCheck=@"^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; NSPredicate *phonelTest=[NSPredicate predicateWithFormat:@"SELF MATCHES%@",phoneCheck]; return [phonelTest evaluateWithObject:_number]; } // 重写用于输出自定义对象的成员 -(NSString *)description{ return [NSString stringWithFormat:@"%@,%@,%@",self.name,self.email,self.number]; } @end
//AdressBook.h #import <Foundation/Foundation.h> #import "AddressCard.h" @interface AddressBook : NSObject<NSCoding> @property (nonatomic,retain)NSMutableArray *books; -(void)addCard:(id)_card; -(void)deletCard:(id)_card; -(void)findCard:(id)_card; -(void)sortBooks; -(id)initAddressBooks; @end //AdressBook.m #import "AddressCard.h" @implementation AddressCard @synthesize name; @synthesize email; @synthesize number; //对象的归档,系统对象,自定义对象(参见博客内的其他文章) //编码 -(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:self.email forKey:@"email"]; [aCoder encodeObject:self.number forKey:@"number"]; } //解码 -(id)initWithCoder:(NSCoder *)aDecoder{ self.name=[aDecoder decodeObjectForKey:@"name"]; self.email=[aDecoder decodeObjectForKey:@"email"]; self.number=[aDecoder decodeObjectForKey:@"number"]; return self; } //初始化 -(AddressCard *)initWith:(NSString *)_name Email:(NSString *)_email Number:(NSString *)_number{ self=[super init]; if ([self judgeEmail:_email]&&[self judgeNumber:_number]) { self.name=_name; self.email=_email; self.number=_number; } else{ if ([self judgeEmail:_email]==NO) { NSLog(@"%@:邮箱不符合规范",_email); } if ([self judgeNumber:_number]==NO) { NSLog(@"%@:号码不符合规范",_number); } } return self; } //判断email是否符合要求 -(BOOL)judgeEmail:(NSString *)_email{ NSString *emailCheck=@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest=[NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailCheck]; return [emailTest evaluateWithObject:_email]; } //判断number是否符合要求 -(BOOL)judgeNumber:(NSString *)_number{ NSString *phoneCheck=@"^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; NSPredicate *phonelTest=[NSPredicate predicateWithFormat:@"SELF MATCHES%@",phoneCheck]; return [phonelTest evaluateWithObject:_number]; } // 重写用于输出自定义对象的成员 -(NSString *)description{ return [NSString stringWithFormat:@"%@,%@,%@",self.name,self.email,self.number]; } @end
//main.m #import <Foundation/Foundation.h> #import "AddressBook.h" #import "AddressCard.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... // NSString *name=@"gaole"; NSString *email=@"[email protected]"; NSString *number=@"18051481079"; NSString *name1=@"gao"; NSString *email1=@"[email protected]"; NSString *number1=@"18752007721"; NSString *name2=@"Neo"; NSString *email2=@"[email protected]"; NSString *number2=@"18051481077"; // NSString *name3=@"Neo"; NSString *email3=@"gaoneohotmail.com"; NSString *number3=@"180514810"; AddressCard *card1=[[AddressCard alloc]initWith:name Email:email Number:number]; AddressCard *card2=[[AddressCard alloc]initWith:name1 Email:email1 Number:number1]; AddressCard *card3=[[AddressCard alloc]initWith:name2 Email:email2 Number:number2]; AddressCard *card4=[[AddressCard alloc]initWith:name3 Email:email3 Number:number3]; AddressBook *book1=[[AddressBook alloc]initAddressBooks]; //添加 [book1 addCard:card1]; [book1 addCard:card2]; [book1 addCard:card3]; [book1 addCard:card4]; NSLog(@"%@",book1); //删除 [book1 deletCard:card3]; NSLog(@"%@",book1); //查找 [book1 findCard:card1]; //排序 [book1 sortBooks]; NSLog(@"%@",book1); //归档 if([NSKeyedArchiver archiveRootObject:book1 toFile:@"book1"]){ NSLog(@"归档成功"); } else{ NSLog(@"归档失败"); } //OC中的文件操作(参见博客内的其他文章) //取档 NSFileManager *manager=[NSFileManager defaultManager]; NSMutableArray *book2=[[NSMutableArray alloc]init]; //判断文件是否存在 if([manager fileExistsAtPath:@"book1"]){ book2=[NSKeyedUnarchiver unarchiveObjectWithFile:@"book1"]; NSLog(@"取档成功"); } NSLog(@"%@",book2); } return 0;