示例:制作地址簿

作者:追风剑情 发布于:2019-3-1 13:26 分类:Objective-C

地址卡片类 (版本一:手写存取器)

AddressCard.h

  1. // 地址卡片
  2. #import <Foundation/Foundation.h>
  3.  
  4. @interface AddressCard : NSObject
  5.  
  6. -(void) setName: (NSString *) theName;
  7. -(void) setEmail: (NSString *) theEmail;
  8. -(NSString *) name;
  9. -(NSString *) email;
  10. -(void) print;
  11.  
  12. @end


AddressCard.m

  1. #import "AddressCard.h"
  2.  
  3. @implementation AddressCard
  4. {
  5. NSString *name;
  6. NSString *email;
  7. }
  8.  
  9. -(void) setName: (NSString *) theName
  10. {
  11. if (name != theName)
  12. name = [NSString stringWithString: theName];
  13. }
  14.  
  15. -(void) setEmail: (NSString *) theEmail
  16. {
  17. if (email != theEmail)
  18. email = [NSString stringWithString: theEmail];
  19. }
  20.  
  21. -(NSString *) name
  22. {
  23. return name;
  24. }
  25.  
  26. -(NSString *) email
  27. {
  28. return email;
  29. }
  30.  
  31. -(void) print
  32. {
  33. // %-31s 表示要用31个字符的字段宽度左对齐打印UTF8 C-字符串
  34. NSLog(@"========================");
  35. NSLog(@"| %-31s |", [name UTF8String]);
  36. NSLog(@"| %-31s |", [email UTF8String]);
  37. NSLog(@"========================");
  38. }
  39.  
  40. @end


====================================================================

地址卡片类 (版本二:自动生成存取器)

AddressCard.h

  1. // 地址卡片
  2. #import <Foundation/Foundation.h>
  3.  
  4. @interface AddressCard : NSObject
  5.  
  6. // 自动生成存取器
  7. // copy特性: 会在setter方法内生成实例变量的副本。默认的方法不会生成副本,仅仅进行赋值(默认为assign特性)
  8. // nonatomic特性: 确保线程安全
  9. @property (copy, nonatomic) NSString *name, *email;
  10.  
  11. // instancetype: 告诉编译器返回的类型是发送消息的对象
  12. -(instancetype) initWithName: (NSString *) theName andEmail: (NSString *) theEmail;
  13. -(void) setName: (NSString *) theName andEmail: (NSString *) theEmail;
  14. -(void) print;
  15. -(NSComparisonResult) compareNames: (id) element;
  16.  
  17. @end


AddressCard.m

  1. #import "AddressCard.h"
  2.  
  3. @implementation AddressCard
  4.  
  5. @synthesize name, email;
  6.  
  7. -(instancetype) initWithName: (NSString *) theName andEmail: (NSString *) theEmail
  8. {
  9. self = [super init];
  10. if (self) {
  11. self.name = theName;
  12. self.email = theEmail;
  13. }
  14. return self;
  15. }
  16.  
  17. -(void) setName: (NSString *) theName andEmail: (NSString *) theEmail
  18. {
  19. // 会绕过setter方法
  20. //name = theName;
  21. //email = theEmail;
  22. // 调用setter方法
  23. self.name = theName;
  24. self.email = theEmail;
  25. // 等价于下面两句
  26. //[self setName: theName];
  27. //[self setEmail: theEmail];
  28. }
  29.  
  30. -(void) print
  31. {
  32. // %-31s 表示要用31个字符的字段宽度左对齐打印UTF8 C-字符串
  33. NSLog(@"====================================");
  34. NSLog(@"| %-31s |", [name UTF8String]);
  35. NSLog(@"| %-31s |", [email UTF8String]);
  36. NSLog(@"====================================");
  37. }
  38.  
  39. // 重写相等性判断
  40. -(BOOL) isEqual: (AddressCard *) theCard
  41. {
  42. if ([name isEqualToString: theCard.name] == YES &&
  43. [email isEqualToString: theCard.email] == YES)
  44. return YES;
  45. else
  46. return NO;
  47. }
  48.  
  49. // 比较指定的地址卡片中的两个名字
  50. -(NSComparisonResult) compareNames: (id) element
  51. {
  52. return [name compare: [element name]];
  53. }
  54.  
  55. @end


AddressBook.h

  1. // 地址簿
  2. #import <Foundation/Foundation.h>
  3. #import "AddressCard.h"
  4.  
  5. @interface AddressBook : NSObject
  6.  
  7. // strong特性:声明变量为强变量
  8. @property (nonatomic, copy) NSString *bookName;
  9. @property (nonatomic, strong) NSMutableArray *book;
  10.  
  11. -(instancetype) initWithName: (NSString *) name;
  12. -(void) addCard: (AddressCard *) theCard;
  13. -(int) entries;
  14. -(void) list;
  15. -(AddressCard *) lookup: (NSString *) theName;
  16. -(void) removeCard: (AddressCard *) theCard;
  17. -(void) sort;
  18.  
  19. @end


AddressBook.m

  1. #import "AddressBook.h"
  2.  
  3. @implementation AddressBook
  4.  
  5. @synthesize bookName, book;
  6.  
  7. // 设置AddressBook的名称和一个空的AddressBook
  8. -(instancetype) initWithName: (NSString *) name
  9. {
  10. self = [super init];
  11. if (self) {
  12. bookName = [NSString stringWithString: name];
  13. book = [NSMutableArray array];
  14. }
  15. return self;
  16. }
  17.  
  18. -(instancetype) init
  19. {
  20. return [self initWithName: @"NoName"];
  21. }
  22.  
  23. // 添加地址卡片
  24. -(void) addCard: (AddressCard *) theCard
  25. {
  26. [book addObject: theCard];
  27. }
  28.  
  29. // 返回地址卡片数目
  30. -(int) entries
  31. {
  32. return (int)[book count];
  33. }
  34.  
  35. -(void) list
  36. {
  37. NSLog(@"======== Contents of: %@ ========", bookName);
  38. // 遍历地址簿,方法一
  39. /*for (AddressCard *theCard in book)
  40. NSLog(@"%-20s %-32s", [theCard.name UTF8String],
  41. [theCard.email UTF8String]);*/
  42. // 遍历地址簿,方法二
  43. /*AddressCard *theCard;
  44. for (theCard in book)
  45. NSLog(@"%-20s %-32s", [theCard.name UTF8String],
  46. [theCard.email UTF8String]);*/
  47. // 遍历地址簿,方法三
  48. [book enumerateObjectsUsingBlock:
  49. //idx 数组索引 stop 是否停止遍历
  50. ^(AddressCard *theCard, NSUInteger idx, BOOL *stop) {
  51. NSLog(@"%-20s %-32s", [theCard.name UTF8String],
  52. [theCard.email UTF8String]);
  53. }];
  54. NSLog(@"===================================================");
  55. }
  56.  
  57. // 通过名称查找地址卡片-(精确匹配)
  58. -(AddressCard *) lookup: (NSString *) theName
  59. {
  60. for (AddressCard *nextCard in book)
  61. if ([nextCard.name caseInsensitiveCompare: theName] == NSOrderedSame)
  62. return nextCard;
  63. return nil;
  64. }
  65.  
  66. -(void) removeCard: (AddressCard *) theCard
  67. {
  68. // removeObjectIdenticalTo 会删除重复对象(即,一个对象在数组中出现多次)
  69. [book removeObjectIdenticalTo: theCard];
  70. }
  71.  
  72. -(void) sort
  73. {
  74. // 方法一:传递一个比较方法
  75. //[book sortUsingSelector: @selector(compareNames:)];
  76. //[book sortUsingSelector:];//提供一个比较方法
  77. //[book sortUsingFunction: context:]; //提供一个比较函数
  78. // 方法二:使用区块(Block)排序
  79. [book sortUsingComparator:
  80. ^(id obj1, id obj2){
  81. return [[obj1 name] compare: [obj2 name]];
  82. }];
  83. }
  84.  
  85. @end


main.m

  1. #import <Foundation/Foundation.h>
  2. #import "AddressCard.h"
  3. #import "AddressBook.h"
  4.  
  5. int main(int argc, const char * argv[]) {
  6. @autoreleasepool {
  7. NSString *aName = @"Julia Kochan";
  8. NSString *aEmail = @"jewls337@axlc.com";
  9. NSString *bName = @"Tony Iannino";
  10. NSString *bEmail = @"tony.iannino@techfitness.com";
  11. NSString *cName = @"Stephen Kochan";
  12. NSString *cEmail = @"steve@classroomM.com";
  13. NSString *dName = @"Jamie Baker";
  14. NSString *dEmail = @"jbaker@classrooM.com";
  15. AddressCard *card1 = [[AddressCard alloc] init];
  16. AddressCard *card2 = [[AddressCard alloc] init];
  17. AddressCard *card3 = [[AddressCard alloc] init];
  18. AddressCard *card4 = [[AddressCard alloc] init];
  19. // 创建地址薄
  20. AddressBook *myBook = [[AddressBook alloc]
  21. initWithName: @"Linda's Address Book"];
  22. AddressCard *myCard;
  23. // 创建4个地址卡片
  24. [card1 setName: aName andEmail: aEmail];
  25. [card2 setName: bName andEmail: bEmail];
  26. [card3 setName: cName andEmail: cEmail];
  27. [card4 setName: dName andEmail: dEmail];
  28.  
  29. // 添加卡片到地址薄
  30. [myBook addCard: card1];
  31. [myBook addCard: card2];
  32. [myBook addCard: card3];
  33. [myBook addCard: card4];
  34. NSLog(@"Entries in address book after adding cards: %i", [myBook entries]);
  35. // 列出未排序的地址薄
  36. [myBook list];
  37. // 列出排序后的地址薄
  38. [myBook sort];
  39. [myBook list];
  40. // 通过名字查找一个人
  41. NSLog(@"Lookup: Stephen Kochan");
  42. myCard = [myBook lookup: @"Stephen Kochan"];
  43. if (myCard != nil)
  44. [myCard print];
  45. else
  46. NSLog(@"Not found!");
  47. // 从地址薄中删除条目
  48. [myBook removeCard: myCard];
  49. [myBook list];
  50. }
  51. return 0;
  52. }

运行测试
111.png

标签: Objective-C

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号