標籤:des style blog color 使用 os io 資料
Objective-C裡面的集合主要包括:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary
首先,NSString,NSArray和NSDictionary都是不可變的,一經分配空間,長度是固定的。另外3個類是可變的,初始化後還可以動態增加空間,長度不固定。這幾個類在初始化和相關操作上有一定的相似性,放在一起對比學習,能加深理解。數組和字典有一些特殊的地方需要注意,後面進行說明,先從初始化開始:
字串-NSString
字面量建立:NSString *string = @"this is a string";
格式化建立:+ (id) stringWithFormat:(NSString *) format,...;
例如:NSString * str = [NSString stringWithFormat:@"Your age is %d,and your height is %d",26,140];
從前面的+號可以看出,這是一個類方法
1、比較大小
方法一:- (BOOL) isEqualToString:(NSString *) aString
用來比較接收方和作為參數傳遞過來的字串,返回一個BOOL(YES或NO)來表示兩個字串的內容是否相同,例如:
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的指標數值是否相同,即:他們是否是同一事物;後者用來判斷兩個字串的內容是否相同
方法二:- (NSComparisonResult) compare: (NSString *) aString option: (NSStringCompareOptions) mask;
compare方法將接收對象和傳遞過來的字串逐個進行比較,返回一個NSComparisonResult(枚舉類型)來表示比較結果。NSComparisonResult的定義如下:
enum{ NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending};typedef NSInteger NSComparisonResult
參數option是一個掩位碼,可以通過位或來委任標記,常用的標記如下:
- NSCaseInsensitiveSearch:不區分大小寫自負。
- NSLiteralSearch:進行完全比較,區分大小寫字元。
- NSNumbericSearch:比較字串的字元個數,而不是字串值。如果沒有這個選項,100會排在99的前面。
如果你相比較字串,需要忽略大小寫並按字元個數進行排序,那麼應該這麼做:
if([thing1 compare:thing2 option:NSCaseInsensitiveSearch | NSNumerbicSearch] == NSOrderedSame){ NSLog(@"They match!");}
2、字串包含
起始處包含(以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
NSMutableString是NSString的子類,長度可變,類似於c#中的StringBuilder,聲明如下:
+ (id) stringWithCapacity: (NSUInteger) capacity;
這裡的capacity只是個建議值,實際字串大小並不限於所提供的容量。
1、添加字串:
- - (void) appendString: (NSString *) aString;
- - (void) appendFormat: (NSString *) format,...;
例如:
NSMutableString *string = [NSMutableString stringWithCapacity:50];[string appendString:@"Hello there "];[string appendFormat:@"human %d!",66];//最後string的值為:"Hello there human 66!"
2、刪除字串
方法:- (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
NSArray是一個Cocoa類,它比C、C++數組強大的地方在於,NSArray可以儲存任意類型的對象,比如字串、自訂類型甚至其他數組或字典,但是請記住:NSArray只能儲存對象,像int ,char,double等基礎資料型別 (Elementary Data Type)不能直接儲存,需要通過轉換成對象才能加入數組。另外,NSArray是不可變數組,一旦建立它的長度就固定下來來,不能添加和刪除任何元素,當然數組中包含的對象是可以改變的,只不過數組對象本身是一直都不會變的。
NSArray的建立:
- 1、NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",nil];
- 2、NSArray *array1 = [NSArray arrayWithArray:array];(以現用的數組建立數組)
- 3、NSArray *array2 = [NSArray arrayWithObjects:@"one",@"two",@"three",nil]; //對象列表必須以nil結尾
- 4、NSArray *array3 = @[@"one",@"two",@"three"]; //以字面量的方式建立時,不必在結尾處特意補上nil
相關方法:
- (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
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];
不可變字典-NSDictionary
和c#中的字典一樣,Objective-c中的NSDictionary能在給定關鍵字(通常是一個NSString字串)下儲存一個數值,然後可以通過這個關鍵詞來尋找相應的資料。相對於數組,字典採用的是鍵查詢的最佳化方式,它可以立即找出要尋找的資料,而不需要遍曆整個數組,對於頻繁的查詢和大型資料集來說,使用字典比數組要快得多。
像NSString和NSArray一樣,NSDictionary也是不可變的,在建立新的NSDictionary時,就要提供該字典所儲存的全部對象和關鍵字。
基本操作:
1、建立方式一:通過字面量方式,使用類似@{key:value,...}的方法來定義
2、建立方式二:通過dictionaryWithObjectsAndKeys方法,該方法接受對象和關鍵字交替出現的序列,以nil值作為終止符號,定義如下:
+ (id) dictionaryWithObjectsAndKeys:(id) firstObject,...
3、擷取字典中的資料方式一:使用objectForKey,接收一個關鍵字,通過該關鍵字來擷取對應的資料,該方法定義如下:
- (id) objectForKey:(id) aKey;
4、擷取字典中的資料方式二: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
可以通過向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"];