18-1 Simple way
« on: January 23, 2010, 10:04:14 AM »
AddressCard.h
Code: (Objective-C)
view plaincopy to clipboardprint?
#import <Foundation/Foundation.h>
#define FN @"First Name"
#define LN @"Last Name"
@interface AddressCard: NSObject
{
NSMutableDictionary *fields;
}
@property (copy, nonatomic) NSMutableDictionary *fields;
-(AddressCard *) init;
-(AddressCard *) intiWithFirstName: (NSString *) fn andLastName: (NSString *) ln;
-(void) setFirstName: (NSString *) fn andLastName: (NSString *) ln;
-(void) setField: (NSString *) newField;
-(void) setField: (NSString *) newField withContents: (NSString *) newContents;
-(NSComparisonResult) compareNames: (id) element;
-(void) print;
-(void) dealloc;
@end
AddressCard.m
Code: (Objective-C)
view plaincopy to clipboardprint?
#import "AddressCard.h"
@implementation AddressCard
@synthesize fields;
-(void) print
{
NSLog (@"==============================================");
NSLog (@"| |");
NSLog (@"| %-41s |", [[NSString stringWithFormat:@"%@ %@", [fields valueForKey: FN], [fields valueForKey: LN]] UTF8String]);
NSLog (@"| |");
for(NSString *key in fields)
if([key caseInsensitiveCompare: FN] != NSOrderedSame &&
[key caseInsensitiveCompare: LN] != NSOrderedSame)
NSLog (@"| %-15s: %-24s |", [key UTF8String], [[fields valueForKey: key] UTF8String]);
NSLog (@"| |");
NSLog (@"| |");
NSLog (@"| |");
NSLog (@"| O O |");
NSLog (@"==============================================");
}
-(AddressCard *) init
{
[self initWithFirstName: @"" andLastName: @""];
return self;
}
-(AddressCard *) initWithFirstName:(NSString *) fn andLastName:(NSString *) ln
{
self = [super init];
if(self) {
fields = [[NSMutableDictionary alloc] init];
[fields setObject: fn forKey: FN];
[fields setObject: ln forKey: LN];
}
return self;
}
-(void) setFirstName:(NSString *) fn andLastName:(NSString *) ln
{
[fields setObject: fn forKey: FN];
[fields setObject: ln forKey: LN];
}
-(void) setField: (NSString *) newField withContents: (NSString *) newContents
{
[fields setObject: newContents forKey: newField];
}
-(void) setField: (NSString *) newField
{
[self setField: newField withContents: nil];
}
-(NSComparisonResult) compareNames: (id) element
{
NSComparisonResult result;
result = [[self.fields objectForKey: LN] caseInsensitiveCompare: [[element fields] objectForKey: LN]];
if (result == NSOrderedSame)
result = [[self.fields objectForKey: FN] caseInsensitiveCompare: [[element fields] objectForKey: FN]];
return result;
}
-(void) dealloc
{
[fields release];
[super dealloc];
}
@end
AddressBook.h
Code: (Objective-C)
view plaincopy to clipboardprint?
#import <Foundation/Foundation.h>
#import "AddressCard.h"
@interface AddressBook: NSObject <NSCopying>
{
NSString *bookName;
NSMutableArray *book;
}
@property (retain, nonatomic) NSString *bookName;
@property (copy, nonatomic) NSMutableArray *book;
-(id) initWithName: (NSString *) name;
-(void) addCard: (AddressCard *) theCard;
-(NSMutableArray *) lookup: (NSString *) theName;
-(BOOL) removeName: (NSString *) theName;
-(int) entries;
-(void) list;
-(void) sort;
-(void) dealloc;
@end
AddressBook.m
Code: (Objective-C)
view plaincopy to clipboardprint?
#import "AddressBook.h"
@implementation AddressBook;
@synthesize book, bookName;
-(id) initWithName: (NSString *) name
{
self = [self init];
if (self) {
bookName = [[NSString alloc] initWithString: name];
book = [[NSMutableArray alloc] init];
}
return self;
}
-(void) addCard: (AddressCard *) theCard
{
if(![book containsObject: theCard])
[book addObject: theCard];
}
-(int) entries
{
return [book count];
}
-(void) list
{
NSLog (@"========= Contents of: %@ =============", bookName);
for ( AddressCard *theCard in book )
NSLog (@" %@", [NSString stringWithFormat:@"%@ %@", [[theCard fields] valueForKey: FN], [[theCard fields] valueForKey: LN]]);
NSLog (@"===========================================");
}
-(NSMutableArray *) lookup: (NSString *) theName
{
NSMutableArray *result = [NSMutableArray array];
for (AddressCard *nextCard in book)
{
for(NSString *key in nextCard.fields)
if ([[nextCard.fields valueForKey: key] rangeOfString: theName options: NSCaseInsensitiveSearch].length)
{
[result addObject: nextCard];
break;
}
if(![result containsObject: nextCard])
if ([[NSString stringWithFormat: @"%@ %@", [nextCard.fields valueForKey: FN], [nextCard.fields valueForKey: LN]] compare: theName] == NSOrderedSame)
[result addObject: nextCard];
}
if([result count])
return result;
return nil;
}
-(BOOL) removeName: (NSString *) theName
{
NSMutableArray *result = [self lookup: theName];
if([result count] != 1)
return NO;
[book removeObject: [result objectAtIndex: 0]];
return YES;
}
-(void) sort
{
[book sortUsingSelector: @selector (compareNames:)];
}
-(void) dealloc
{
[bookName release];
[book release];
[super dealloc];
}
-(id) copyWithZone: (NSZone *) zone
{
AddressBook *newBook = [[AddressBook allocWithZone: zone] initWithName: @""];
newBook.book = [book mutableCopy];
return newBook;
}
//This was added at a later date. If you intend to read the posts bellow imagine this didn't exist until my 4th post here.
-(void) setBook: (id) nbook
{
if(book)
[book release];
book = [nbook mutableCopy];
}
@end
main.m
Code: (Objective-C)
view plaincopy to clipboardprint?
#import <Foundation/Foundation.h>
#import "AddressCard.h"
#import "AddressBook.h"
int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *fn = @"Julia";
NSString *ln = @"Baker";
AddressCard *card1 = [[AddressCard alloc] initWithFirstName: fn andLastName: ln];
NSString *fn2 = @"Joanna";
NSString *ln2 = @"Baker";
AddressCard *card2 = [[AddressCard alloc] initWithFirstName: fn2 andLastName: ln2];
NSString *fn3 = @"Thomas";
NSString *ln3 = @"Green";
AddressCard *card3 = [[AddressCard alloc] initWithFirstName: fn3 andLastName: ln3];
NSString *fn4 = @"George";
NSString *ln4 = @"Anderson";
AddressCard *card4 = [[AddressCard alloc] initWithFirstName: fn4 andLastName: ln4];
NSString *fn5 = @"Luke";
NSString *ln5 = @"Skywalker";
AddressCard *card5 = [[AddressCard alloc] initWithFirstName: fn5 andLastName: ln5];
AddressBook *book1 = [[AddressBook alloc] initWithName: @"MyBook"];
[book1 addCard: card1];
[book1 addCard: card2];
[book1 addCard: card3];
[book1 addCard: card4];
[book1 sort];
[book1 list];
AddressBook *book2 = [book1 copy];
book2.bookName = @"MyBook2";
//Testin
评论4
最新资源