Object-c中以AdressBook为例知识点实战

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;


你可能感兴趣的:(oc知识点总结)