2011年4月30日 星期六

CH15-Practice2 AddressBook

//

// main.m

// CH15-Practice2 AddressBook

//

// Created by jason on 2011/4/30.

// Copyright 2011 __MyCompanyName__. All rights reserved.


#import

#import

#import

#import


@interface AddressCard : NSObject {

NSString *name;

NSString *email;

}


//以下的兩個屬性(attribute)

// Copy : 表示setter中複製一個實體變數 ( ch15-18中預設為不要複製,這裡是先改變屬性為assign)

// Nonatomic :表示getter在回傳值前不可保留(retain)或自動釋放變數(autorelease )實體變數


@property (copy, nonatomic) NSString *name, *email;

-(void) setName:(NSString *) name andEmail:(NSString *) email;

-(void) print;

-(NSComparisonResult) compareNames: (id) element;

@end


@implementation AddressCard

@synthesize name,email;

-(void) setName:(NSString *) theName andEmail:(NSString *) theEmail{

name=theName;

email=theEmail;

}


-(void) print{

NSLog(@"===============================");

NSLog(@"== ==");

NSLog(@"== %-24s==",[name UTF8String]);

NSLog(@"== %-24s==",[email UTF8String]);

NSLog(@"== ==");

NSLog(@"== ==");

NSLog(@"== ==");

NSLog(@"=======O================O======");

NSLog(@"=======o================o======");

}


//Compare the two names from the specified address cards


-(NSComparisonResult) compareNames: (id) element{

return [name compare: [element name]];

}


@end


@interface AddressBook : NSObject {

NSString *bookName;

NSMutableArray *book;

NSMutableArray *bookMatches;

}


-(id) initWithName: (NSString *) name; // 設定一個陣列以儲存名片與通訊錄名稱

-(void) addcard: (AddressCard *) theCard; // AddressCard加入通訊錄

-(void) removeCard:(AddressCard *) theCard;// 刪除theCard

-(void) sort; //排序

-(int) entries; //回傳通訊錄中有多少張名片

-(void) list; //列出名片內容

-(NSMutableArray *) lookup: (NSString *) theName;

-(void) dealloc;


@end


@implementation AddressBook;

// set up the AddressBook's name and an empty book


//我們將initWithName 的回傳值設為id而不是AddressBook,是因為若AddressBook是子類別的話

//傳給initWith的參數就不應該是AddressBook而是子類別型態


-(id) initWithName: (NSString *) name{

self = [super init];//呼叫父類別方法init來初始化

//接著建立空字串

if (self){

bookName=[[NSString alloc] initWithString:name];

book=[[NSMutableArray alloc]init];

//若你使用book= [NSMutbleArray array];來建立book的話,你不是book的擁有者,所以之後你可能沒辦法釋放記憶體

}

return self;

}


-(void) addcard: (AddressCard *) theCard{

[book addObject:theCard];//AddressCard為物件做參數並將他加入通訊錄

}


//使用NSSArray removeObjectIdenticalTo: 的方法,來移除參數為theCard的資訊內容

//這會移除相同參數名稱的資料,但有可能有兩個位在不同位址的兩張名片(:複製過的名片)

//不過這前提是要有可以儲存相同物件

-(void) removeCard:(AddressCard *) theCard{

[book removeObjectIdenticalTo:theCard];

}


-(void) sort{

[book sortUsingSelector:@selector(compareNames:)];

// @selector 表示建立一個型態為SELselector 參數為一指定的方法名稱

// 此方法名為 sortUsingSelector:

//這個方法(sortUsingSelector)是用來比較陣列中的兩筆資料

//當需要比較的時候,會呼叫一個指定的方法,這裡就是compareNames傳送訊息給陣列中的第一個元素以何其參數做比較

//回傳值為 NSComparisonResult ( NSOrderedAscending ; NSOrderedSame ; NSOrderedDescending)

}


-(int) entries{

return [book count]; //count的方法式計算陣列個數

}


-(void) list{

NSLog(@"=========Content of: %@ ===========", bookName);

//快速列舉,book陣列的每個元素順序取出

for( AddressCard *theCard in book)

//首先定義一個可以得到陣列每個元素的參數(AddressCard *theCard)

//然後加上 "in" 最後是陣列名稱( book )

//然後執行迴圈主體

NSLog(@"%-20s %-32s",[theCard.name UTF8String],[theCard.email UTF8String]);

NSLog(@"=======================================================");

}


// lookup address casrd by name - assume an exact match

-(NSMutableArray *) lookup: (NSString *) theName

{

[bookMatches release]; // release memory for multiply searches

bookMatches = [[NSMutableArray alloc]init];

AddressCard *nextCard;

for (nextCard in book) // ("varaible" "in" "name of array")

{

NSRange test = [[nextCard name] rangeOfString: theName options: NSCaseInsensitiveSearch];

if (test.length)

[bookMatches addObject:nextCard];

}

if ([bookMatches count])

return bookMatches;

return nil;

}


-(void) dealloc{

[bookName release];

[book release];

[bookMatches release];

[super dealloc];

}


@end


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

{

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];

NSString *aName=@"Jason Huang";

NSString *aEmail=@"jason.huang@hotmail.com";

NSString *bName=@"Sharon Kang";

NSString *bEmail=@"sharon.kang@hotmail.com";

NSString *cName=@"Julia Lin";

NSString *cEmail=@"julia.lin@hotmail.com";

NSString *dName=@"Irene Huang";

NSString *dEmail=@"irene.huang@hotmail.com";


AddressCard *card1=[[AddressCard alloc] init];

AddressCard *card2=[[AddressCard alloc] init];

AddressCard *card3=[[AddressCard alloc] init];

AddressCard *card4=[[AddressCard alloc] init];

AddressBook *myBook=[AddressBook alloc];

AddressCard *myCard;

NSMutableArray *mySearch;


//First set up four address cards

[card1 setName: aName andEmail: aEmail];

[card2 setName: bName andEmail: bEmail];

[card3 setName: cName andEmail: cEmail];

[card4 setName: dName andEmail: dEmail];

//Now initialize the address book

myBook =[myBook initWithName:@"Joe's address book"];

NSLog(@"Entries in address book after creation: %i",[myBook entries]);

//Add some cards to the address book

[myBook addcard:card1];

[myBook addcard:card2];

[myBook addcard:card3];

[myBook addcard:card4];

NSLog(@"Entries in address book after adding cards: %i",[myBook entries]);

//List all the entries in the book now

[myBook list];

NSLog(@"Look up someone's card by name: Huang");

mySearch = [myBook lookup:@"Huang"];

if([mySearch count])

for(myCard in mySearch)

[myCard print];

else

NSLog(@"Not found!");


[card1 release];

[card2 release];

[card3 release];

[card4 release];

[myBook release];

[pool drain];

return 0;

}


Ch15-Practice1 NSCalendarDate

//

// main.m

// Ch15-Practice1 NSCalendarDate

//

// Created by jason on 2011/4/30.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import

#import


@interface NSCalendarDate (ElapseDays)


-(unsigned long) numberOfElapseDays: (NSCalendarDate *) theDate;


@end


@implementation NSCalendarDate (ElapseDays)


-(unsigned long) numberOfElapseDays: (NSCalendarDate *) theDate{


NSInteger days;

[self years:NULL months:NULL days:& days hours:NULL minutes:NULL seconds: NULL sinceDate: theDate];


return days;

}


@end



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

{

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

NSCalendarDate *startDate=[NSCalendarDate dateWithYear: 2010

month: 12

day: 20

hour: 20

minute: 20

second: 30

timeZone:[NSTimeZone systemTimeZone]];


NSCalendarDate *endDate=[NSCalendarDate dateWithYear: 2000

month: 12

day: 30

hour: 20

minute: 20

second: 30

timeZone:[NSTimeZone systemTimeZone]];

NSLog(@"%li",[startDate numberOfElapseDays:endDate]);

[pool drain];

return 0;

//return NSApplicationMain(argc, (const char **) argv);

}

2011年4月29日 星期五

Foundation Framework -CH15-16 NSSet

//

// main.m

// CH15-16 NSSet

//

// Created by jason on 2011/4/29.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//


//#import


//資料集(Set)是種獨特的物件集合,他也有不可變更與可變更兩種

//Set 的運作: 搜尋,新增,刪除,比較,找出交集,聯集


#import

#import

#import

#import

#import


// Create an integerobject


//指定巨集INTOBJ 將整數值轉換成物件 及例如 INTOBJ( 10 ,會將10 這個int資料型態轉成 NSNumber的物件種類

#define INTOBJ(v) [NSNumber numberWithInteger:v]//之後程式就用這個去代


// Add a print method to NSSet with the printing category

@interface NSSet (Printing)

-(void) print;// print 方法以類目的方式加入NSSet類別中

//由於print只能處理 整數值,所以用類目加入比較好

@end


@implementation NSSet (Printing)

-(void) print{

printf("{");

for(NSNumber *element in self)

printf(" %li",(long)[element integerValue]);


printf("}\n");

}

@end



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

{


NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

//setWithObjects: 方法建立一以nil結束的物件列表的set

NSMutableSet *set1 = [NSMutableSet setWithObjects: INTOBJ(1), INTOBJ(3), INTOBJ(5),INTOBJ(10), nil];

NSSet *set2= [NSSet setWithObjects: INTOBJ(-5), INTOBJ(100), INTOBJ(3), INTOBJ(5), nil];

NSSet *set3= [NSSet setWithObjects: INTOBJ(12),INTOBJ(200), INTOBJ(3), nil];

NSLog(@"set1:");

[set1 print];

NSLog(@"set2:");

[set2 print];

// Equality test (比較是否相等)

if([set1 isEqualToSet:set2] ==YES)

NSLog(@"set1 equals set2");

else

NSLog(@"set1 is not equal to set2");

// Membership test (是否包含)

if([set1 containsObject:INTOBJ(10)]==YES)

NSLog(@"set1 contains 10");

else

NSLog(@"set1 does not contain 10");

if([set2 containsObject:INTOBJ(10)]==YES)

NSLog(@"set2 contains 10");

else

NSLog(@"set2 does not contain 10");


[set1 addObject:INTOBJ(4)]; //新增

[set1 removeObject:INTOBJ(10)]; //刪除

NSLog(@"set1 after adding 4 and removing 10:");

[set1 print];

// get intersection of two sets 交集

[set1 intersectSet:set2];

NSLog(@"set1 intersect set2:");

[set1 print];

//union of two sets //聯集

[set1 unionSet:set3];

NSLog(@"set1 union set3:");

[set1 print];

[pool drain];

return 0;

// return NSApplicationMain(argc, (const char **) argv);

}


//常用的NSSet的方法


//建立包含{ obj1,obj2, ... , nil} 這些物件的set

+(id) setWithObjects: obj1, obj2, ... ,nil


//建立與初始包含{ obj1, obj2,...,nil} 這些物件的set

-(id) initWithObjects: obj1,obj2,... nil


-(NSNInteger) count //計算物件成員的次數


-(BOOL) containsObject:obj //判斷set是否包含 obj


-(BOOL) member :obj // 判斷set中是否包含obj 使用isEqual:方法)


-(NSEnumerator *)objectEnumerator //回傳set中所有NSEnumerator的物件


-(BOOL) isSubsetOfSet: nsset //判斷接收端的每一成員是否出現於nsset


-(BOOL) intersectsSet: neset //判斷接收端是否至少有一成員出現於nsset


-(BOOL) isEqualToSet: neset //判斷兩個set是否相等


//常用的NSMuableSet的方法

-(id) setWithCapacity: size //建立一新的set,其空間為size


-(id) initWithCapacity: size //設定新的配置set的初始空間大小為size


-(void) addObject: obj//新增objset


-(void) removeObject: obj//set內移除obj


-(void) removeAllObject: obj//刪除所有接收端成員


-(void) unionSet: nsset//nsset內所有成員加入於接收端


-(void) minusSet: nsset//從接收端移除nsset內的所有物件


-(void) intersectSet: nsset//移除接收端的所有物件,但不包含在nsset的物件

詞典物件常用的方法

//NSDictionary 常用的方法


//以成對的鍵值-物件{key1,obj1},{key2,obj2} ....建立辭典

+(id) dictionaryWithObjectsAndKeys: obj1,key1,obj2,key2,...,nil


//以成對的鍵值-物件{key1,obj1},{key2,obj2} ....初始與配置詞典

-(id) initWithObjectsAndKeys: obj1,key1,obj2,key2,...,nil


-(unsigned int) count //回傳辭典內項目個數


-(NSEnumerator *) keyEnumerator //回傳辭典物件內所有鍵值的NSEnumerator物件


//依照selector 所指定的排序方法排序辭典

-(NSArray *) keysSortedByValueUsingSelector: (SEL) selector


//回傳辭典物件內所有鍵值的NSEnumerator物件

-(NSEnumerator *) objectEnumerator


-(id) objectForKey: key//回傳某一特定key的物件


//NSMutableDictionary 常用的方法


+(id) dictionaryWithCapacity:size//建立一個大小為size的辭典物件


-(id) initWithCapacity:size//依照size初始化詞典物件


-(void) removeAllObjects //移除辭典內所有物件


-(void) removeObjectForKey: key//依照鍵值移除物件


//[鍵值-物件]加入於辭典中,若鍵值已經存在則取代之

-(void) setObject: obj forKey: key


Foundation Framework -CH15-15 List- Dictionary

//

// main.m

// CH15-15 List Dictionary

//

// Created by jason on 2011/4/29.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//


//Dictionary 是個鍵值與物件(key - object )成對資料的集合

#import

#import

#import

#import


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

{

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];

//利用 dictionaryWithObjectsAndKeys:來將鍵值與物件成對的資料加入到辭典中

//dictionaryWithObjectsAndKeys:方法的參數是物件-鍵值成對的列表,之間以逗號隔開最後以nil結束

NSDictionary *glossary=[NSDictionary dictionaryWithObjectsAndKeys:

@"Apple Inc. is an American multinational corporation that designs and markets consumer electronics, computer software, and personal computers.",@"Apple",

@"The iPhone is a line of Internet and multimedia-enabled smartphones designed and marketed by Apple Inc.",@"iPhone",

@"The iPad is a line of tablet computers designed, developed and marketed by Apple Inc.",@"iPad",nil];

// Print all key-value pairs from dictionary

// 當辭典建立完後就用for 迴圈將其內容舉出

// 這裡的方法是沒有特定排序,若要用字母排序可以用 keySortByValueUsingSelector:的方法將已排序好的鍵值回傳

for(NSString *key in glossary)

NSLog(@"%@:%@", key, [glossary objectForKey:key]);

[pool drain];

return 0;

//return NSApplicationMain(argc, (const char **) argv);

}