#import <Foundation/Foundation.h> @interface AddressCard : NSObject -(void)setName:(NSString *) theName; -(void)setEmail:(NSString *) theEmail; -(void)setfirstName:(NSString *)first lastName:(NSString *)last; //聯繫4 -(NSString *)firstName; -(NSString *)lastName; -(NSString *)name; -(NSString *)email; //系統生成訪問器方法 @property (copy,nonatomic) NSString *name,*email,*firstName,*lastName; -(void)print; -(void)setName:(NSString *)theName andEmail:(NSString *) theEmail; @end
// // AddressCard.m // OC15數字字符串和集合 // // Created by Zoujie on 15/10/6. // Copyright © 2015年 Zoujie. All rights reserved. // #import "AddressCard.h" @implementation AddressCard { NSString *name; NSString *email; } @synthesize name,email; -(void)setName:(NSString *)theName { // name = [NSString stringWithString:theName]; 老方法 if (name != theName) name = [NSString stringWithString:theName];//if語句測試發送到訪問器方法的對象是否已經存在於實例變量中,若是傳入的是同一個對象,就不須要再進行設置。 } -(void)setEmail:(NSString *)theEmail { if (email != theEmail) email = [NSString stringWithString:theEmail]; } //練習4 -(void)setfirstName:(NSString *)first lastName:(NSString *)last { if (_firstName != first){ _firstName = [NSString stringWithString:first]; } if (_lastName != last) _lastName = [NSString stringWithString:last]; } -(NSString *)name { return name; } -(NSString *)email { return email; } -(void)setName:(NSString *)theName andEmail:(NSString *)theEmail { self.name = theName; self.email = theEmail; } -(void)print { NSLog(@"================================="); NSLog(@"| |"); NSLog(@"|%-31s|",[name UTF8String]);//%-31s 表示用31個字符的字段寬度左對齊打印UTF8 C-字符串 修飾結果的做用 NSLog(@"|%-31s|",[email UTF8String]); NSLog(@"|%-31s|",[_lastName UTF8String]); NSLog(@"|%-31s|",[_firstName UTF8String]); NSLog(@"| |"); NSLog(@"| |"); NSLog(@"================================="); } -(NSComparisonResult)compareNames:(id)element { return [name compare:[element name]]; } @end
// // AddressBook.h // OC15數字字符串和集合 // // Created by Zoujie on 15/10/6. // Copyright © 2015年 Zoujie. All rights reserved. // #import <Foundation/Foundation.h> #import "AddressCard.h" @interface AddressBook : NSObject @property (nonatomic,copy) NSString *bookName; @property (nonatomic,strong) NSMutableArray *book; -(instancetype) initWithName:(NSString *)name; -(void) addCard:(AddressCard *) theCard; -(NSInteger) entries;//獲取卡片(AddressCard)數量 -(void)list; //經過名稱查找地址卡片--假定精確匹配 -(AddressBook *) lookup:(NSString *) theName; //刪除 -(void) removeCard:(AddressCard *)theCard; //排序 -(void)sort; @end
// // AddressBook.m // OC15數字字符串和集合 // // Created by Zoujie on 15/10/6. // Copyright © 2015年 Zoujie. All rights reserved. // #import "AddressBook.h" @implementation AddressBook @synthesize bookName,book; //設置一個AddressBook的名稱和一個空的AddressBook -(instancetype)initWithName:(NSString *)name { self = [super init]; if (self){ bookName = [NSString stringWithString:name]; book = [NSMutableArray array]; } return self; } -(instancetype)init { return [self initWithName:@"NoName"]; } -(void) addCard:(AddressCard *)theCard { [book addObject:theCard]; } -(NSInteger)entries { return [book count]; } -(void)list { NSLog(@"======== Contents of :%@ ========",bookName); for (AddressCard *theCard in book)//快速枚舉 for( in) { NSLog(@"%-20s %-32s",[theCard.name UTF8String],[theCard.email UTF8String]); } NSLog(@"================================================="); } #pragma mark 查找 -(AddressCard *)lookup:(NSString *)theName { for (AddressCard *nextCard in book) { if ([nextCard.name caseInsensitiveCompare:theName]==NSOrderedSame) return nextCard; } return nil; // NSIndexSet NSUInteger result =[book indexOfObjectPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([[obj name] caseInsensitiveCompare:theName] == NSOrderedSame){ * stop = YES;//查找一個匹配,一個就足夠了 return YES; } else return NO;//繼續查找 }]; // 若是找到一個匹配,則查看它 if (result != NSNotFound)//只有一個元素 return book[result]; else return nil; } #pragma mark 刪除 -(void)removeCard:(AddressCard *)theCard { [book removeObjectIdenticalTo:theCard];//方法會刪除和參數全部相同的對象。但只有一個對象在數組中出現屢次,纔會出現這個問題 // [self isEqual:theCard]; } #pragma mark 排序 -(void)sort { // [book sortUsingSelector:@selector(compareNames:)];//需再AddressCard類中添加compareNames 方法 指定selector方法的比較器對數組排序 // 塊方法直接排序,不用修改AddressCard類 [book sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { return [[obj1 name] compare:[obj2 name]]; }]; } @end
// // ViewController.h // OC15數字字符串和集合 // // Created by Zoujie on 15/10/5. // Copyright © 2015年 Zoujie. All rights reserved. // #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> //使用Printint類別,將打印方法添加到NSSet @interface NSSet (Printing) -(void) print; @end @implementation NSSet (Printing) -(void) print { printf("{"); for (NSNumber *element in self) printf(" %li ",(long)[element integerValue]); printf("} \n"); } @end @interface NSDate (ElapsedDays) -(unsigned long) elapsedDays:(NSDate *) theDate; @end @implementation NSDate (ElapsedDays) -(unsigned long) elapsedDays:(NSDate *)theDate { NSDate *date = [NSDate date]; date = theDate; return date; } @end @interface ViewController : UIViewController @end
// // ViewController.m // OC15數字字符串和集合 // // Created by Zoujie on 15/10/5. // Copyright © 2015年 Zoujie. All rights reserved. // #import "ViewController.h" #import "AddressCard.h" #import "AddressBook.h" //#import "NSSet(Printing)" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // [self studyNSNumber]; // 不可變字符串 // [self studyNSString]; // 可變字符串 // [self studyNSMutableNSString]; // 數組 // [self studyNSArray]; // 地址薄製做 // [self makeAddressCard]; // [self makeAddressCardTWO]; // AddressBook測試 // [self textAddressBook]; // 數組排序 // [self sortArray]; // NSValue類 // [self studyNSValue]; // NSDictionary // [self studyNSDictionary]; [self studyNSSet]; } #pragma mark NSNumber -(void)studyNSNumber { //經常使用基本數據類型int,float,double,long並非對象 NSNumber *myNumber,*floatNumber,*intNumber; NSInteger myInt;//NSInterger不是一個對象,而是基本數據類型的typedef // integer型取值 intNumber = [NSNumber numberWithInt:10]; intNumber = @10;//字面量語法 myInt = [intNumber integerValue]; NSLog(@"%li",(long)myInt); // long型取值 myNumber = [NSNumber numberWithLong:0xabcdef]; NSLog(@"%lx",[myNumber longValue]); // char myNumber = [NSNumber numberWithChar:'X']; myNumber = @'X'; NSLog(@"%c",[myNumber charValue]); // float floatNumber = [NSNumber numberWithFloat:10.00]; floatNumber = @10.00f; NSLog(@"%f",[floatNumber floatValue]); // double myNumber = [NSNumber numberWithDouble:12345e+15]; myNumber = @12345e+15; NSLog(@"%lg",[myNumber doubleValue]); //發生錯誤 NSLog(@"%li",(long)[myNumber integerValue]); // 驗證兩個Number是否相等 if ([intNumber isEqualToNumber:floatNumber]==YES) { NSLog(@"Number is Equal"); }else { NSLog(@"Numbers are not equal"); } if ([intNumber compare:myNumber]== NSOrderedAscending){ NSLog(@"First Number is less than second"); } /* // 注意 **************** NSNumber *yourNumber = [[NSNumber alloc]initWithInt:20]; [yourNumber initWithInt:10000];//直接修改會引發程序崩潰,全部數字對象都必須是新建立的; */ //NSDecimalNumber 提供一些四則運算方法 } #pragma mark 字符串 -(void)studyNSString { //格式字符 %@ 來顯示NSString對象 NSString *str = @"Programming is fun"; NSLog(@"%@",str); // 不可變字符串的基本處理方式 NSString *str1 = @"This is String A"; NSString *str2 = @"This is String B"; NSString *res; NSComparisonResult compareResult; //計算字符串中得字符 NSLog(@"LengTh of Str1:%lu",[str1 length]); // 將一個字符串複製到另外一個字符串 res = [NSString stringWithString:str1]; NSLog(@"copy:%@",res); // 將一個字符串複製到另外一個字符串的末尾 str2 = [str1 stringByAppendingString:str2]; NSLog(@"%@",str2); // 驗證兩個字符串是否相等 if ([str1 isEqualToString:res]==YES) { NSLog(@"str1 = res"); } else { NSLog(@"str1 != res "); } // 驗證一個字符串是否小於,等於或大於另外一個字符串 compareResult = [str1 compare:str2]; if (compareResult == NSOrderedAscending) NSLog(@"str1 < str2"); else if (compareResult == NSOrderedSame) NSLog(@"str1 = str2"); else if (compareResult == NSOrderedDescending) NSLog(@"str1 > str2"); // 將字符串轉換爲大寫 res = [str1 uppercaseString]; NSLog(@"Uppercase conversion:%s",[res UTF8String]); // 將字符串轉換爲小寫 res = [str1 lowercaseString]; NSLog(@"Lowercase conversion:%@",res); NSLog(@"Orugunal string:%@",str1); NSRange subRange; // 從字符串中提取前3個字符 res = [str1 substringToIndex:3]; NSLog(@"Firest 3 chars of str1 %@",res); // 提取從索引5開始直到結尾的子字符串 res = [str1 substringFromIndex:5]; NSLog(@"Chars from index 5 of str1:%@",res); // 提取從索引5開始到索引13的子字符串(6個字符) res = [[str1 substringFromIndex:8] substringToIndex:6]; NSLog(@"Chars from index 8 through 13:%@",res); // 更簡單的方法 res = [str1 substringWithRange:NSMakeRange(8, 6)]; NSLog(@"Chars from index 8 through 13:%@",res); // 從另外一個字符串中查找一個字符串 subRange = [str1 rangeOfString:@"String A"]; NSLog(@"String is at index %lu, length is %lu",subRange.location,subRange.length); subRange = [str1 rangeOfString:@"String B"]; if (subRange.location == NSNotFound) NSLog(@"String not found"); else NSLog(@"String is at index %lu,length is %lu",subRange.location,subRange.length); // 常見的NSString方法 // NSString stringWithContentsOfFile:<#(nonnull NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#> // 建立一個新字符串,並將其設置爲path指定的文件的內容,使用字符編碼enc,若是非零,則返回err中得錯誤 // [NSString stringWithContentsOfURL:<#(nonnull NSURL *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>] // 建立一個新字符串,並將其設置URL的內容,使用字符編碼enc,若是非零,則返回err中得錯誤 // [NSString string];建立一個新的空字符串 // str1 compare:<#(nonnull NSString *)#> // 比較兩個字符串 } #pragma mark 可變字符串 -(void)studyNSMutableNSString { NSString *str1 = @"This is String A"; NSString *search,*replace; NSMutableString *mstr; NSRange substr; //從不可變字符串建立可變字符串 mstr = [NSMutableString stringWithString:str1]; NSLog(@"%@",mstr); //插入字符 [mstr insertString:@"mutable" atIndex:7]; NSLog(@"%@",mstr); //插入末尾進行有效拼接 [mstr insertString:@" and string B" atIndex:[mstr length]]; NSLog(@"%@",mstr); //直接使用appendString [mstr appendString:@" and string C"]; NSLog(@"%@",mstr); //根據範圍刪除子字符串 [mstr deleteCharactersInRange:NSMakeRange(16, 13)]; NSLog(@"%@",mstr); //查找而後將其刪除 substr = [mstr rangeOfString:@"string B and "]; if (substr.location != NSNotFound) { [mstr deleteCharactersInRange:substr]; NSLog(@"%@",mstr); } //直接設置爲可變的字符串 [mstr setString:@"This is string A"]; NSLog(@"%@",mstr); //替換一些字符 [mstr replaceCharactersInRange:NSMakeRange(8, 8) withString:@"a mutable string"]; NSLog(@"%@",mstr); // 查找和替換 search = @"This is"; replace = @"An example of "; substr = [mstr rangeOfString:search]; if (substr.location != NSNotFound) { [mstr replaceCharactersInRange:substr withString:replace]; NSLog(@"%@",mstr); } // 查找和替換全部的匹配項 search = @"a"; replace = @"X"; substr = [mstr rangeOfString:search]; while (substr.location != NSNotFound) { [mstr replaceCharactersInRange:substr withString:replace]; substr = [mstr rangeOfString:search]; } NSLog(@"%@",mstr); // 若是須要把字符串分解爲語言符號 ,能夠查看NSScanner類 [NSMutableString stringWithCapacity:10];//建立一個初始包含10個字符的字符串 [[NSMutableString alloc]setString:mstr];//將字符串設置爲mstr [[NSMutableString alloc] replaceOccurrencesOfString:search withString:replace options:24 range:NSMakeRange(0, [mstr length])];//根據選項options,在指定範圍range中用replace替換全部的search. } #pragma mark NSArray -(void)studyNSArray { int i ; // 建立一個包含月份的數組 NSArray *monthName = [NSArray arrayWithObjects:@"Januay",@"February",@"March",@"April",@"May",@"June",@"July",@"August",@"September",@"October",@"Novermber",@"December", nil]; // 列出數組中得全部元素 NSLog(@"Month Name"); NSLog(@"=========="); for (i=0;i<12;i++) { NSLog(@"%i:%@",i+1,monthName[i]); } printf("\n"); NSArray *monthNames = @[@"Januay",@"February",@"March",@"April",@"May",@"June",@"July",@"August",@"September",@"October",@"Novermber",@"December"]; NSLog(@"Month Names"); NSLog(@"=========="); for (i=0;i<12;i++) { NSLog(@"%i:%@",i+1,monthNames[i]); } NSMutableArray *numbers = [NSMutableArray array]; for (i = 0;i<10;i++) { numbers[i]=@(i); } // 遍歷數組於顯示其值 for (i=0;i<10;i++) { NSLog(@"%@",numbers[i]); } // 使用帶有%@格式的NSlog顯示 NSLog(@"==========USing a single NSLog"); NSLog(@"%@",numbers); } #pragma mark AddressCard 1 -(void)makeAddressCard { NSString *name = @"Zou JieMac"; NSString *email = @"zj89011810@163.com"; AddressCard *card1 = [[AddressCard alloc]init]; [card1 setName:name]; [card1 setEmail:email]; [card1 print]; } #pragma mark AddressCard 2 -(void)makeAddressCardTWO { NSString *aName = @"Zou JieMac"; NSString *aEmail = @"zj89011810@163.com"; NSString *bName = @"Chen wenTingSB"; NSString *bEmail = @"305130241@qq.com"; AddressCard *cardZ = [[AddressCard alloc]init]; AddressCard *cardC = [[AddressCard alloc]init]; [cardZ setName:aName andEmail:aEmail]; [cardC setName:bName andEmail:bEmail]; [cardZ print]; [cardC print]; } #pragma mark AddressBook -(void)textAddressBook { NSString *aName = @"Zoujie Mac"; NSString *aEmail = @"zj89011810@163.com"; NSString *bName = @"Huangshuxian UI"; NSString *bEmail = @"xiaoluoli@sina.com"; NSString *cName = @"Chenwenting SB"; NSString *cEmail = @"bigchest@qq.com"; AddressCard *card1 = [AddressCard new]; AddressCard *card2 = [AddressCard new]; AddressCard *card3 = [AddressCard new]; // AddressCard *card4 = [AddressCard new]; //建立一個新的地址薄 AddressBook *myBook = [[AddressBook alloc]initWithName:@"Love for Jie AddressBook"]; NSLog(@"Entries in address book after creation:%li",[myBook entries]); // 建立3個地址卡片 [card1 setName:aName andEmail:aEmail]; [card2 setName:bName andEmail:bEmail]; [card3 setName:cName andEmail:cEmail]; // 將地址卡片添加到地址薄 [myBook addCard:card1]; [myBook addCard:card2]; [myBook addCard:card3]; NSLog(@"Enter in address book after adding cards:%li",[myBook entries]); // 列出地址薄全部條目 [myBook list]; // 經過名字查找一我的 NSLog(@"lookup Huangshuxian"); AddressCard *myCard; myCard = [myBook lookup:@"Huangshuxian UI"]; if (myCard != nil) { [myCard print]; } else NSLog(@"Not found"); NSLog(@"lookup hanyifei"); myCard = [myBook lookup:@"hanyifei"]; if (myCard != nil) { [myCard print]; } else NSLog(@"Not found"); // 從電話薄中刪除 myCard =[myBook lookup:@"Chenwenting SB"]; [myBook removeCard:myCard]; [myBook list]; } -(void)sortArray { NSString *aName = @"Zoujie Mac"; NSString *aEmail = @"zj89011810@163.com"; NSString *bName = @"Huangshuxian UI"; NSString *bEmail = @"xiaoluoli@sina.com"; NSString *cName = @"Chenwenting SB"; NSString *cEmail = @"bigchest@qq.com"; AddressCard *card1 = [AddressCard new]; AddressCard *card2 = [AddressCard new]; AddressCard *card3 = [AddressCard new]; // AddressCard *card4 = [AddressCard new]; //建立一個新的地址薄 AddressBook *myBook = [[AddressBook alloc]initWithName:@"Love for Jie AddressBook"]; NSLog(@"Entries in address book after creation:%li",[myBook entries]); // 建立3個地址卡片 [card1 setName:aName andEmail:aEmail]; [card2 setName:bName andEmail:bEmail]; [card3 setName:cName andEmail:cEmail]; // 將地址卡片添加到地址薄 [myBook addCard:card1]; [myBook addCard:card2]; [myBook addCard:card3]; NSLog(@"Enter in address book after adding cards:%li",[myBook entries]); // 列出地址薄全部條目 [myBook list]; [myBook sort]; [myBook list]; // 經常使用的NSArray方法 NSArray *arrayText; [arrayText containsObject:myBook];//肯定數組中是否包含對象 [arrayText count];//數組元素個數 [arrayText lastObject];//返回數組最後的對象 [arrayText objectAtIndex:1];//存儲在元素1的對象 [arrayText makeObjectsPerformSelector:@selector(textArray)];//將selector指示的消息發送給數組中得每一個元素 NSMutableArray *MutableArrayText; [MutableArrayText initWithCapacity:2];//指定初始的size給新的數組 [MutableArrayText addObject:myBook];//對象添加到數組的末尾 [MutableArrayText insertObject:card1 atIndex:3];//將對象插入到數組的序號3的位置 [MutableArrayText replaceObjectAtIndex:1 withObject:card2];//將序號1的對象用card2替換 [MutableArrayText removeObjectAtIndex:2];//刪除數組序號爲2的元素 } -(void)textArray { return; } #pragma mark NSValue類 -(void)studyNSValue { //將結構體轉化爲對象 CGPoint myPoint; CGSize mySize; CGRect myRect; NSValue *pointObjc; NSMutableArray *touchPoints = [NSMutableArray array]; myPoint.x = 100; myPoint.y = 200; mySize.height = 20; mySize.width = 40; myRect.origin = myPoint; myRect.size = mySize; pointObjc = [NSValue valueWithCGPoint:myPoint]; [touchPoints addObject:pointObjc]; pointObjc = [NSValue valueWithCGSize:mySize]; [touchPoints addObject:pointObjc]; pointObjc = [NSValue valueWithCGRect:myRect]; [touchPoints addObject:pointObjc]; NSLog(@"%@",touchPoints); // CGPoint youPoint; // NSLog(@"%@",[[touchPoints lastObject]rectValue]); } #pragma mark NSDictionary -(void)studyNSDictionary { NSMutableDictionary *glossary = [NSMutableDictionary dictionary]; // 存儲三個條目在類別中 [glossary setObject:@"The Men like a girl" forKey:@"first_love"]; [glossary setObject:@"The Men must earn a lot of money" forKey:@"because_life"]; [glossary setObject:@"What the Men best like" forKey:@"i_know"]; NSLog(@"%@",[glossary objectForKey:@"first_love"]); NSLog(@"%@",[glossary objectForKey:@"because_life"]); NSLog(@"%@",[glossary objectForKey:@"i_know"]); // 新語法 dict[key] = object glossary[@"boy"] = @"I love you so much"; glossary[@"girl"] = @"you are my best love"; glossary[@"life"] = @"Family include men and women ,girl and boy,dog and cat"; NSLog(@"%@",glossary[@"boy"]); NSLog(@"%@",glossary[@"girl"]); NSLog(@"%@",glossary[@"life"]); // 打印字典中全部的鍵值對,和數組對象不同,字典對象是無序的 for (NSString *key in glossary) { NSLog(@"%@:%@",key,[glossary objectForKey:key]); } // 經常使用的NSDictionary方法 // initWithObjectsAndKeys:@"obj1",@"key1",@"obj2",@"key2", nil 將新分配的詞典初始化爲鍵-對象{key1,obj1}{key2,obj2} // NSArray *sortKey = [glossary keysSortedByValueUsingSelector:<#(nonnull SEL)#>] 返回詞典中得鍵數組,它根據selector指定的比較方法進行排序 } #pragma mark 集合NSSet -(void)studyNSSet { NSMutableSet *set1 = [NSMutableSet setWithObjects:@1,@3,@5,@10, nil]; NSSet *set2 = [NSSet setWithObjects:@-5,@100,@3,@5, nil]; NSSet *set3 = [NSSet setWithObjects:@12,@200,@3, nil]; NSLog(@"set1:"); [set1 print]; NSLog(@"set2:"); [set2 print]; // 相等性測試 if ([set1 isEqualToSet:set2]== YES) { NSLog(@"set1 equals set2"); } else { NSLog(@"set1 is not equal to set2"); } // 成員測試 if ([set1 containsObject:@10]==YES) NSLog(@"set1 contains 10"); else NSLog(@"set1 does not contain 10"); if ([set2 containsObject:@10]==YES) NSLog(@"set2 contains 10"); else NSLog(@"set2 does not contain 10"); // 在可變集合SET1中添加和移除對象 [set1 addObject:@4]; [set1 removeObject:@10]; NSLog(@"set1 after adding 4 and removing 10:"); [set1 print]; // 得到兩個集合的交集 [set1 intersectSet:set2]; NSLog(@"set1 intersect set2:"); [set1 print]; // 兩個集合的並集 [set1 unionSet:set3]; NSLog(@"set1 union set3"); [set1 print]; // 經常使用NSSet方法 [set2 anyObject];//返回集合中任一對象 [set2 containsObject:@10];//肯定集合是否包含對象obj [set2 member:@10];//使用isEquak:方法肯定集合是否包含OBJ // NSIndexSet 用於存儲有序的索引到某種數據結構,好比數組 } @end