Objective-C簡(jiǎn)易通訊錄的實(shí)現(xiàn)

1.Contact.h

#import <Foundation/Foundation.h>

@interface Contact : NSObject

/**

*? 姓名

*/

@property(nonatomic, copy) NSString *name;

/**

*? 電話號(hào)碼

*/

@property(nonatomic, copy) NSString *phoneNumber;

/**

*? 分組名稱

*/

@property(nonatomic, copy) NSString *groupName;

- (instancetype)initWithName:(NSString *)name PhoneNumber:(NSString *)phoneNumber;

+ (instancetype)contactWithName:(NSString *)name PhoneNumber:(NSString *)phoneNumber;

- (void)showInfo;

? ?@end

2.Contact.m

#import "Contact.h"

@implementation Contact

#pragma mark 重寫dealloc

- (void)dealloc

{

[_name release];

[_phoneNumber release];

[_groupName release];

[super dealloc];

NSLog(@"contact對(duì)象已釋放!");

}

#pragma mark 初始化方法

- (instancetype)initWithName:(NSString *)name PhoneNumber:(NSString *)phoneNumber

{

self = [super init];

if (self)

{

//初始化過程中直接將姓名首字母大寫,規(guī)范格式

_name = [name capitalizedString];

_phoneNumber = phoneNumber;

//直接將分組名設(shè)置為首字母

_groupName? = [_name substringToIndex:1];

}

return self;

}

#pragma mark 遍歷構(gòu)造器

+ (instancetype)contactWithName:(NSString *)name PhoneNumber:(NSString *)phoneNumber

{

return [[[Contact alloc] initWithName:name PhoneNumber:phoneNumber] autorelease];

}

#pragma mark 顯示聯(lián)系人信息

- (void)showInfo

{

NSLog(@"%@-%@", self.name, self.phoneNumber);

}

@end

3.ContactBook.h

#import#import "Contact.h"

@interface ContactBook : NSObject

/**

*? 聯(lián)系人字典

*/

@property(nonatomic, retain) NSMutableDictionary *contactDic;

- (void)showContactInfo;

- (void)addNewContact;

- (void)removeContactByName;

- (void)removeContactByPhoneNumber;

- (void)removeAllGroup;

- (void)searchByName;

- (void)searchByPhoneNumber;

- (void)sortByNameAscending;

@end

4.Contact.m

#import "ContactBook.h"

@implementation ContactBook

#pragma mark 重寫init

- (instancetype)init

{

self = [super init];

if (self)

{

//在init中進(jìn)行字典的初始化過程,可以讓程序更好的封裝

//1.定義可變數(shù)組allKey接收26個(gè)大寫英文字母

NSMutableArray *allKey = [NSMutableArray array];

//2.定義可變數(shù)組allValue接收26個(gè)存儲(chǔ)在對(duì)應(yīng)key下的存儲(chǔ)聯(lián)系人的數(shù)組

NSMutableArray *allValue = [NSMutableArray array];

for (NSInteger i = 65; i < 91; i++)

{

//此處通過format這個(gè)萬能公式將長(zhǎng)整形i轉(zhuǎn)化為字符類型,將26個(gè)字母存入allKey數(shù)組(此處操作會(huì)出現(xiàn)編譯警告,暫時(shí)沒想出其他的方法)

[allKey addObject:[NSString stringWithFormat:@"%c",i]];

//此處將26個(gè)空數(shù)組放入allValue

[allValue addObject:[NSMutableArray array]];

}

//通過allKey和allValue為存儲(chǔ)字典賦值

_contactDic = [NSMutableDictionary dictionaryWithObjects:allValue forKeys:allKey];

}

//用來檢測(cè)字典是否創(chuàng)建成功,正式運(yùn)行時(shí)可注釋

NSLog(@"%@", _contactDic);

return self;

}

#pragma mark 顯示通訊錄聯(lián)系人信息

- (void)showContactInfo

{

//用來進(jìn)行計(jì)數(shù)

NSInteger count = 0;

//對(duì)字典進(jìn)行循環(huán)

for (NSString *str in self.contactDic)

{

//對(duì)每個(gè)key對(duì)應(yīng)的數(shù)組進(jìn)行遍歷,輸出聯(lián)系人

for (Contact *contact in [self.contactDic objectForKey:str])

{

NSLog(@"%@-%@", contact.name, contact.phoneNumber);

count ++;

}

}

//如果flag等于0則說明26個(gè)數(shù)組全為空

if (count == 0)

{

//輸出通訊錄為空

printf("通訊錄為空!\n");

}

else

{

NSLog(@"輸出結(jié)束,總共%ld個(gè)聯(lián)系人!", count);

}

}

#pragma mark 添加聯(lián)系人

- (void)addNewContact

{

char name[30];

printf("請(qǐng)輸入聯(lián)系人姓名:");

scanf("%s", name);

char phoneNumber[30];

printf("請(qǐng)輸入聯(lián)系人電話號(hào)碼:");

scanf("%s", phoneNumber);

//通過NSString的方法將用戶輸入字符串轉(zhuǎn)換為對(duì)象

NSString *s_name? ? ? ? = [NSString stringWithUTF8String:name];

NSString *s_phoneNumber = [NSString stringWithUTF8String:phoneNumber];

//用s_name和s_phoneNumber新建聯(lián)系人

Contact *newContact = [Contact contactWithName:s_name PhoneNumber:s_phoneNumber];

//通過分組名稱找到對(duì)應(yīng)數(shù)組將聯(lián)系人添加進(jìn)數(shù)組

[[self.contactDic objectForKey:[newContact groupName]] addObject:newContact];

printf("添加成功!\n");

NSLog(@"%@", self.contactDic);

}

#pragma mark 通過姓名刪除聯(lián)系人

- (void)removeContactByName

{

NSInteger count = 0;

char name[30];

printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:");

scanf("%s", name);

NSString *s_name = [[NSString stringWithUTF8String:name] capitalizedString];

NSString *s_groupName = [s_name substringToIndex:1];

//接收groupName對(duì)應(yīng)的目標(biāo)數(shù)組

NSMutableArray *targetArray = [self.contactDic objectForKey:s_groupName];

for (Contact *contact in targetArray)

{

if ([contact.name isEqualToString: s_name])

{

[targetArray removeObject:contact];

count ++;

printf("刪除成功!\n");

}

}

//如果沒有刪除到聯(lián)系人則顯示無此聯(lián)系人

if (count == 0)

{

printf("無此聯(lián)系人!\n");

}

}

#pragma mark 通過電話號(hào)碼刪除聯(lián)系人

- (void)removeContactByPhoneNumber

{

NSInteger count = 0;

char phoneNumber[30];

printf("請(qǐng)輸入聯(lián)系人電話號(hào)碼:");

scanf("%s", phoneNumber);

NSString *s_phoneNumber = [NSString stringWithUTF8String:phoneNumber];

for (NSString *str in self.contactDic)

{

NSMutableArray *targetArray = [self.contactDic objectForKey:str];

for (Contact *contact in targetArray)

{

if ([contact.phoneNumber isEqualToString:s_phoneNumber])

{

[targetArray removeObject:contact];

printf("刪除成功!\n");

count ++;

}

}

[targetArray release];

}

//如果沒有刪除到聯(lián)系人則顯示無此聯(lián)系人

if (count == 0)

{

printf("此電話號(hào)碼不在通訊錄中!\n");

}

}

#pragma mark 刪除分組

- (void)removeAllGroup

{

char groupName[30];

printf("請(qǐng)輸入分組字母:");

scanf("%s", groupName);

NSString *s_groupName = [[NSString stringWithUTF8String:groupName] capitalizedString];

//如果輸入字符過多則返回輸入有誤

if (s_groupName.length > 1)

{

printf("輸入有誤!");

}

else if ((groupName[0] >= 'a' && groupName[0] <= 'z') || (groupName[0] >= 'A' && groupName[0] <= 'Z'))

{

[self.contactDic removeObjectForKey:s_groupName];

printf("刪除成功!\n");

}

}

#pragma mark 按照姓名查找

- (void)searchByName

{

NSInteger count = 0;

char name[30];

printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:");

scanf("%s", name);

NSString *s_name = [[NSString stringWithUTF8String:name] capitalizedString];

NSString *s_groupName = [s_name substringToIndex:1];

//接收groupName對(duì)應(yīng)的目標(biāo)數(shù)組

NSMutableArray *targetArray = [self.contactDic objectForKey:s_groupName];

for (Contact *contact in targetArray)

{

if ([contact.name isEqualToString: s_name])

{

[contact showInfo];

}

}

//如果沒有刪除到聯(lián)系人則顯示無此聯(lián)系人

if (count == 0)

{

printf("無此聯(lián)系人!\n");

}

[s_groupName release];

[targetArray release];

}

#pragma mark 按電話號(hào)碼查找

- (void)searchByPhoneNumber

{

NSInteger count = 0;

char phoneNumber[30];

printf("請(qǐng)輸入聯(lián)系人電話號(hào)碼:");

scanf("%s", phoneNumber);

NSString *s_phoneNumber = [NSString stringWithUTF8String:phoneNumber];

for (NSString *str in self.contactDic)

{

NSMutableArray *targetArray = [self.contactDic objectForKey:str];

for (Contact *contact in targetArray)

{

if ([contact.phoneNumber isEqualToString:s_phoneNumber])

{

[contact showInfo];

}

}

[targetArray release];

}

//如果沒有刪除到聯(lián)系人則顯示無此聯(lián)系人

if (count == 0)

{

printf("此電話號(hào)碼不在通訊錄中!\n");

}

}

#pragma mark 按照姓名升序排序

- (void)sortByNameAscending

{

NSSortDescriptor *desName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:1];

for (NSString *str in self.contactDic)

{

//進(jìn)行排序

NSMutableArray *targetArr = [self.contactDic objectForKey:str];

[targetArr sortUsingDescriptors:@[desName]];

//輸出排序結(jié)果

for (Contact *contact in targetArr)

{

[contact showInfo];

}

[targetArr release];

}

[desName release];

}

@end

5.main.m

#import <Foundation/Foundation.h>

#import "Contact.h"

#import "ContactBook.h"

int main(int argc, const char * argv[])

{

@autoreleasepool

{

ContactBook *myContactBook = [[ContactBook alloc] init];

while (YES)

{

printf("-----------------------------\n");

printf("------------通訊錄------------\n");

printf("------1.查看通訊全部聯(lián)系人------\n");

printf("------2.添加聯(lián)系人-------------\n");

printf("------3.刪除聯(lián)系人-------------\n");

printf("------4.查找聯(lián)系人-------------\n");

printf("------5.對(duì)聯(lián)系人進(jìn)行排序--------\n");

printf("------6.退出------------------\n");

printf("-----------------------------\n");

//提示用戶輸入操作代碼

NSInteger userNumber = 0;

printf("請(qǐng)輸入您要進(jìn)行的操作:");

scanf("%ld", &userNumber);

//運(yùn)用switch語句進(jìn)行分支功能的執(zhí)行

switch (userNumber)

{

case 1:

{

[myContactBook showContactInfo];

}

break;

case 2:

{

[myContactBook addNewContact];

}

break;

case 3:

{

BOOL b = YES;

while (b)

{

printf("-----------------------------\n");

printf("--------1.通過姓名刪除---------\n");

printf("--------2.通過號(hào)碼刪除---------\n");

printf("--------3.刪除整個(gè)分組---------\n");

printf("--------4.返回上級(jí)菜單---------\n");

printf("-----------------------------\n");

NSInteger Num = 0;

printf("請(qǐng)輸入操作代碼:");

scanf("%ld", &Num);

switch (Num) {

case 1:

{

[myContactBook removeContactByName];

}

break;

case 2:

{

[myContactBook removeContactByPhoneNumber];

}

break;

case 3:

{

[myContactBook removeAllGroup];

}

break;

case 4:

{

b = NO;

break;

}

break;

default:

{

printf("輸入有誤!\n");

break;

}

break;

}

}

}

break;

case 4:

{

BOOL b = YES;

while (b)

{

printf("-----------------------------\n");

printf("--------1.通過姓名查找---------\n");

printf("--------2.通過號(hào)碼查找---------\n");

printf("--------3.返回上級(jí)菜單---------\n");

printf("-----------------------------\n");

NSInteger Num = 0;

printf("請(qǐng)輸入操作代碼:");

scanf("%ld", &Num);

switch (Num) {

case 1:

{

[myContactBook searchByName];

}

break;

case 2:

{

[myContactBook searchByPhoneNumber];

}

break;

case 3:

{

b = NO;

break;

}

break;

default:

{

printf("輸入有誤!\n");

break;

}

break;

}

}

}

break;

case 5:

{

[myContactBook sortByNameAscending];

}

break;

case 6:

{

return 0;

}

break;

default:

break;

}

}

}

return 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橄抹,一起剝皮案震驚了整個(gè)濱河市笛洛,隨后出現(xiàn)的幾起案子络拌,更是在濱河造成了極大的恐慌,老刑警劉巖陶贼,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異待秃,居然都是意外死亡拜秧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門章郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枉氮,“玉大人,你說我怎么就攤上這事暖庄×奶妫” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵培廓,是天一觀的道長(zhǎng)惹悄。 經(jīng)常有香客問我,道長(zhǎng)肩钠,這世上最難降的妖魔是什么泣港? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮价匠,結(jié)果婚禮上当纱,老公的妹妹穿的比我還像新娘。我一直安慰自己踩窖,他們只是感情好惫东,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般廉沮。 火紅的嫁衣襯著肌膚如雪颓遏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天滞时,我揣著相機(jī)與錄音叁幢,去河邊找鬼。 笑死坪稽,一個(gè)胖子當(dāng)著我的面吹牛曼玩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窒百,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼黍判,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了篙梢?” 一聲冷哼從身側(cè)響起顷帖,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渤滞,沒想到半個(gè)月后贬墩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妄呕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年陶舞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绪励。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肿孵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疏魏,到底是詐尸還是另有隱情颁井,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布蠢护,位于F島的核電站雅宾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏葵硕。R本人自食惡果不足惜眉抬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懈凹。 院中可真熱鬧蜀变,春花似錦、人聲如沸介评。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寒瓦,卻和暖如春情屹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杂腰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工垃你, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喂很。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓惜颇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親少辣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凌摄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容