Objective-C裏面的集合主要包括:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionaryc#
首先,NSString,NSArray和NSDictionary都是不可變的,一經分配空間,長度是固定的。另外3個類是可變的,初始化後還能夠動態增長空間,長度不固定。這幾個類在初始化和相關操做上有必定的類似性,放在一塊兒對比學習,能加深理解。數組和字典有一些特殊的地方須要注意,後面進行說明,先從初始化開始:數組
字面量建立:NSString *string = @"this is a string"; app
格式化建立:+ (id) stringWithFormat:(NSString *) format,...;oop
例如:NSString * str = [NSString stringWithFormat:@"Your age is %d,and your height is %d",26,140];學習
從前面的+號能夠看出,這是一個類方法優化
方法一:- (BOOL) isEqualToString:(NSString *) aStringui
用來比較接收方和做爲參數傳遞過來的字符串,返回一個BOOL(YES或NO)來表示兩個字符串的內容是否相同,例如:this
NSString *thing1 = @"hello 5"; NSString *thing2 = [NSString:stringWithFormat:@"hello %d",5]; if([thing1:isEqualToString:thing2]) { NSLog(@"they are the same!"); }
thing1==thing2與[thing1 isEqualToString:thing2]的區別,==運算符只判斷thing1和thing2的指針數值是否相同,即:他們是不是同一事物;後者用來判斷兩個字符串的內容是否相同spa
方法二:- (NSComparisonResult) compare: (NSString *) aString option: (NSStringCompareOptions) mask;指針
compare方法將接收對象和傳遞過來的字符串逐個進行比較,返回一個NSComparisonResult(枚舉類型)來表示比較結果。NSComparisonResult的定義以下:
enum { NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending }; typedef NSInteger NSComparisonResult
參數option是一個掩位碼,能夠經過位或來添加標記,經常使用的標記以下:
若是你相比較字符串,須要忽略大小寫並按字符個數進行排序,那麼應該這麼作:
if([thing1 compare:thing2 option:NSCaseInsensitiveSearch | NSNumerbicSearch] == NSOrderedSame) { NSLog(@"They match!"); }
起始處包含(以aString開頭):- (BOOL) hasPrefix: (NSString *) aString;
結尾處包含(以aString結尾):- (BOOL) hasSuffix: (NSString *) aString;
內部包含(內部含有aString):- (NSRange) rangeOfString: (NSString *) aString;
rangeOfString方法返回的是一個NSRange結構體,封裝來字符串匹配的位置和可以匹配的字符個數,例如:
NSString *fileName = @"draft-chapter.pages"; NSRange range = [fileName rangeOfString:@"chapter"]; //返回的range.location爲6,range.length爲7
若是傳遞的參數在接收字符串中沒有找到,那麼range.location則等於NSNotFound。
NSMutableString是NSString的子類,長度可變,相似於c#中的StringBuilder,聲明以下:
+ (id) stringWithCapacity: (NSUInteger) capacity;
這裏的capacity只是個建議值,實際字符串大小並不限於所提供的容量。
例如:
NSMutableString *string = [NSMutableString stringWithCapacity:50]; [string appendString:@"Hello there "]; [string appendFormat:@"human %d!",66]; //最後string的值爲:"Hello there human 66!"
方法:- (void) deleteCharactersInRange:(NSRange) aRange;
NSMutableString *friends = [NSMutableString stringWithCapacity:50]; [friends appendString:@"James BethLynn Jack Evan"]; NSRange jackRange = [friends rangeOfString:@"jack"]; jackRange.length++; [friends deleteCharactersInRange:jackRange]; //最終結果:"James BethLynn Evan"
NSMutableString是NSString的子類,因此任何使用NSString的地方均可以用NSMutableString來代替,例如,咱們能夠添加格式化字符串:
NSMutableString *string = [NSMutableString stringWithFormat:@"jo%dy",2]; //string的值爲"jo2y"
NSArray是一個Cocoa類,它比C、C++數組強大的地方在於,NSArray能夠保存任意類型的對象,好比字符串、自定義類型甚至其餘數組或字典,可是請記住:NSArray只能保存對象,像int ,char,double等基本數據類型不能直接保存,須要經過轉換成對象才能加入數組。另外,NSArray是不可變數組,一旦建立它的長度就固定下來來,不能添加和刪除任何元素,固然數組中包含的對象是能夠改變的,只不過數組對象自己是一直都不會變的。
NSArray的建立:
相關方法:
- (NSUInteger) count; //獲取數組中對象的個數
- (id) objectAtIndex:(NSUInteger)index; //獲取指定索引處的對象
還能夠經過字面量訪問數組,例如:id *myObject = array[1];咱們能夠利用計數和取值來遍歷數組中的對象:
//方式一 NSUInteger count = [array count]; for(NSUInteger i = 0; i < count; i++) { NSLog(@"index %d has %@.", i, [array objectAiIndex:i]); } //方式二 for(NSUInteger j = 0; j < count; j++) { NSLog(@"index %d has %@", j, array[j]); }
NSArray還有一種特別的建立方式,就是經過切分字符串,方法的聲明以下:
- (NSArray) componentsSeparatedByString:(NSString *) separater;
例如:NSString *string = @"oop:ack:bork:greeble:ponies";
NSArray *chunks = [string componentsSeparatedByString:@":"];
還能夠反過來用指定字符串來合併NSArray中的元素來建立字符串,例如:
string = [chunks componentsJoinedByString:@"+"]; //string的內容爲:"oop+ack:bork+greeble+ponies"
NSMutableArray的建立:+ (id) arrayWithCapacity:(NSUInteger) numItems;
與NSMutableString中的stringWithCapacity方法同樣,這裏的容量只是一個建議值,當超出容量時可變數組可以動態的擴展空間。
尾部添加對象:- (void) addObject:(id) anObject;
指定索引處插入對象: - (void) insertObject:(id) anObject atIndex:(NSUInteger) index; //後面的元素向後移
刪除指定索引處的對象: - (void) removeObjectAtIndex:(NSUInteger) index;
刪除所有對象:- (void) removeAllObjects;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:17]; //建立 for(NSInteger i = 0; i < 4; i++) //在尾部添加四個對象 { Tire *tire = [Tire new]; [array addObject:tire]; }
Tire *t = [Tire new];
[array insertObject:t atIndex:1]; //在第二個位置處添加一個對象 [array removeObjectAtIndex:1]; //刪除索引爲1的對象,即:第二個對象
[array removeAllObjects];
和c#中的字典同樣,Objective-c中的NSDictionary能在給定關鍵字(一般是一個NSString字符串)下存儲一個數值,而後能夠經過這個關鍵詞來查找相應的數據。相對於數組,字典採用的是鍵查詢的優化方式,它能夠當即找出要查找的數據,而不須要遍歷整個數組,對於頻繁的查詢和大型數據集來講,使用字典比數組要快得多。
像NSString和NSArray同樣,NSDictionary也是不可變的,在建立新的NSDictionary時,就要提供該字典所存儲的所有對象和關鍵字。
基本操做:
一、建立方式一:經過字面量方式,使用相似@{key:value,...}的方法來定義
二、建立方式二:經過dictionaryWithObjectsAndKeys方法,該方法接受對象和關鍵字交替出現的序列,以nil值做爲終止符號,定義以下:
+ (id) dictionaryWithObjectsAndKeys:(id) firstObject,...
三、獲取字典中的數據方式一:使用objectForKey,接收一個關鍵字,經過該關鍵字來獲取對應的數據,該方法定義以下:
- (id) objectForKey:(id) aKey;
四、獲取字典中的數據方式二:dictionary[key];
示例代碼以下:
1 Tire *tire1 = [Tire new]; 2 Tire *tire2 = [Tire new]; 3 Tire *tire3 = [Tire new]; 4 Tire *tire4 = [Tire new]; 5 NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:tire1,@"front-left",tire2,@"front-right",tire3,@"back-left",tire4,@"back-right",nil]; 6 //字面量方式 7 NSDictionary *tires = @{@"front-left":tire1,@"front-right":tire2,@"back-left":tire3,@"back-right":tire4}; 8 9 //獲取方式一 10 Tire *tire = [tires objectForKey:@"front-left"]; 11 //獲取方式二 12 Tire *tire = tires[@"front-left"];
能夠經過向NSMutableDictionary類發送dictionary消息來建立新的NSMutableDictionary對象,也能夠經過dictionaryWithCapacity:方法來建立帶初始大小的可變字典對象,這個方法的定義以下:
+ (id) dictionaryWithCapacity:(NSUInteger) numItems;
與以前提到過的NSMutableString和NSMutableArray同樣,在這裏,字典的容量只是一個建議值,而不是對其大小的限制。
能夠經過setObject:forKey:的方法來爲字典添加元素,定義以下:
- (void) setObject:(id) andObject forKey:(id) aKey;
若是對字典中已有的關鍵字使用setObject:forKey:方法,那麼這個方法將會用新值替換原有的數據。若是想刪除一些關鍵字,可以使用removeObjectForKey:方法,定義以下:
- (void) removeObjectForKey:(id) aKey;
示例代碼以下:
1 //建立詞典對象,初始化長度爲10 2 NSMutableDictionary *tires = [NSMutableDictionary dictionaryWithCapacity:10]; 3 // NSMutableDictionary *tires = [NSMutableDictionary dictionary]; 4 5 //動態添加元素 6 [tires setObject:tire1:forKey:@"front-left"]; 7 [tires setObject:tire2:forKey:@"front-right"]; 8 [tires setObject:tire3:forKey:@"back-left"]; 9 [tires setObject:tire4:forKey:@"back-right"]; 10 11 //刪除元素 12 [tires removeObjectForKey:@"back-left"];