iOS學習之集合

jopen 10年前發布 | 18K 次閱讀 IOS iOS開發 移動開發
NSArray

NSArray是一個Cocoa類,是用來存儲對象的有序列表的,可以在有序列表中存放任意類型的對象。
NSArray有兩個限制,首先是只能存儲Objective-c對象,而不能存儲原始的C語言數據對象比如說:int,float,struct,enum和NSArray中的隨機指針,當然也不能在NSArray中保存nil。
可以通過arrayWithObjects創建一個新的NSArray。發送一個以逗號分割的列表對象,在列表解結尾添加nil代表列表的結束(這就是不能在NSArray中添加nil的原因)
NSArray *array = [NSArray arrayWithObjects:@“one”,@“two”,@“three“,nil]
也可以使用NSString來創建數組,比如
NSArray *array2 = @[@“one”,@“two”,@“three”]
顯然后者的代碼量小于前者,然而兩者的內容是一樣的。
只要有了一個數組就可以獲得它所包含的對象個數
- (NSUInteger) count
也可以獲得特定索引處的對象:
- (id) objectAtIndex:(NSUInteger) index
字面上的賦值方法和C語言一樣
id *myObject = array[1];
可以通過循環的方法遍歷數組
NSArray *array = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];
for (NSInteger i = 0; i < [array count]; i++) {
     
NSLog(@"index %d has %@",i,[array objectAtIndex:i]);
}

當然也可以使用數字變量來循環
for (NSInteger i = 0; i < [array count]; i++) {
     
NSLog(@"index %d has %@",i,array[i]);
}

在array[i]中i的值要是超過了索引值就會報錯。

可以使用componentsSeparatedByString將字符串切割成數組
NSString *string = @“oop:ack:bork:greeble:ponies”;
NSArray *chunks = [string componentsSeparatedByString:@“:”];
這時chunks是[‘oop’,’ack’,’bork’,’greeble’,’ponies’]的NSArray數組
還可以使用componentsJoinedByString來合并數組
string = [chunk componentsJoinedByString:@“:)”];
這時,string的值就是”oop:)ack:)bork:)greeble:)ponies:)”的NSString字符串

可變數組

與NSString一樣,NSArray創建的數組是不可變的,一旦創建了就不能添加或者刪除任何元素,為了彌補NSArray的不足,也出現了NSMutbleArray這個可變數組的類,這樣就可以通過arrayWithCapacity添加或者刪除元素。

+ (id) arrayWithCapacity:(NSUInteger) numItems;

與stringWithCapacity一樣,書組容量也只是一個參考值,容量存在的意義就是讓Cocoa能夠對代碼進行優化

NSMutableArray *array = [NSMutableArray arrayWithCapacity:17];

使用addObject在末尾添加對象

- (void) addObject:(id) anObject;

比如要添加四個輪胎

for (NSInteger i = 0; i<4; i++) {
     Tire *tire = [Tire new];
     [array addObject:tire];
}


也可以刪除索引處特定的對象

-(void) removeObjectAtIndex:(NSUInteger) index;

如果要刪除第二個對象:

[array removeObjectAtIndex:1]


枚舉

NSArray 經常要對數組中的每個元素都執行同一個操作,比如給每個元素的值+1,也可以都*1,—1等等。可以編寫一個循環體從0到[array count]來讀取每個索引來進行處理,也可以使用NSEnumerator,Cocoa可以用它來表示集合中迭代出的對象。使用 NSEnumerator需要通過objectEnumerator向數組請求枚舉器。

- (NSEnumerator *) objectEnumerator;
NSEnumerator *enumerator = [array objectEnumerator];

如果是從后向前x循環,還有一個reverseObjectEnumerator方法。
在獲得枚舉器之后,便可以開始一個while循環體每次循環都可以向它請求nextObject

- (id) nextObject;

nextObject返回一個nil值時,訓話結束,這也是數組中不能存儲nil的另一個原因,沒有辦法判斷nil是存儲在書組中的數值還是循環結束的標識。

while (id thingie = [enumerator nextObject]) {
       NSLog(
@"I found %@",thingie);
}

ps.這段代碼不知怎么的會提示unexpected type name ‘id’...

快速枚舉
快速枚舉的語法感覺和python差不多,例如

for (NSString *string in array) {
     
NSLog(@"I found %@ also",string);
}

這個循環體將會遍歷數組,并且用變量string來存儲數組變量的值,這種枚舉方法會更加簡潔快速。

在最新版的蘋果編譯器為純C語言添加了一個叫做代碼塊的特性,為了支持代碼塊蘋果公司添加了一個能在NSArray中通過代碼塊枚舉對象的方法

- (void) enumerateObjectsUsingBlock:(void (^) (id obj,NSUInteger idx,BOOL *stop))block;

這時,有四種方法來遍歷數組了:
1、通過索引
2、使用NSEnumerator
3、使用快速枚舉
4、代碼塊

NSDictionart

字典,在Python中有定義:

字典是另一種可變容器模型,且可存儲任意類型對象,如其他容器模型。

字典由鍵和對應值成對組成。字典也被稱作關聯數組或哈希表。基本語法如下:

dict = {
'Alice''2341''Beth''9102''Cecil''3258'}
也可如此創建字典:

dict1 = { 
'abc'456 };
dict2 = { 
'abc'12398.637 };
每個鍵與值用冒號隔開(:),每對用逗號,每對用逗號分割,整體放在花括號中({})。

鍵必須獨一無二,但值則不必。

值可以取任何數據類型,但必須是不可變的,如字符串,數或元組。

Objective- c中的字典也是關鍵字及其定義的集合。Cocoa中有一個實現這個功能的集合類NSDictionary.NSDictionary能夠在一個關鍵字(通常是一個NSString字符串)下面存儲一個數值(可以是任何的Objective-c對象),然后可以通過這個關鍵字來查找數值,例如電話簿,一個名字下面存儲一個電話號碼,我們可以通過好友的名字來查找好友電話,當然我們也可以存儲好友的郵箱或者家庭住址等等。
還有一件有趣的事情,那就是NSDictionary同NSArray一樣是不可變的對象,但是NSMutableDictionary可以允許隨意添加刪除字典中的關鍵字。
字典的最簡單的方法就是用字典的字面量語法,它與類方法dictionaryWithObjectsAndKey非常相似。字面量語法就是 @{key:value,…},使用花括號來定義字典。還要注意dictionaryWithObjectsAndKey后面的參數首先是要存儲的對象,然后才是關鍵字,數值在關鍵字后面,中間用冒號分開,每對鍵值用逗號分割開。以nil作為終止符,自然在字典中不能存儲nil值。

+ (id) dictionaryWithObjectsAndKey:(id) firstObject,…;

假設我們要存錢,可以這樣來寫代碼

Money *m1 = [Money new];
Money *m2 = [Money new];
Money *m3 = [Money new];
Money *m4 = [Money new];
NSDictionary *money = [NSDictionary dictionaryWithObjectsAndKeys:m1,@"first",m2,@"second",m3,@"third",m4,@"fourth",nil];
也可以這樣子:  
NSDictionary *money = @{@"first":m1,@"second":m2,@"third":m3,@"fourth":m4};

可以使用方法objectForKey來傳遞關鍵字來獲取對應的數值。

- (id) objectForKey:(id) aKey;

或者是

Money[key]

假設要查找第三次存錢的數目,可以這樣

Money *cash = [money objectForKey:@"third"];
或者是
Money *cash = money[
@"third"];

如果是字典中沒有的值則返回nil值。

向NSMutableDictionary發送dictionary消息可以創建一個新的NSMutableDictionary對象,還可以使用dictionaryWithCapacity來創建新的可遍字典來告訴Cocoa該字典的大小。

+ (id) dictionaryWithCapacity:(NSUInteger) numItems;

這個與之前的NSMutableArray和NSMutableString一樣,這里的容量也只是個建議而不是限制,可以使用setObject:forkey來為字典添加元素。

- (void) setObject:(id) anObject forkey:(id)aKey;

因此,有另一種方法來記錄存錢

Money *money = [NSMutableDictionary dictionary];
[money setObject:m1 forkey:
@"first"];
[money setObject:m2 forkey:
@"second"];
[money setObject:m3 forkey:
@"third"];
[money setObject:m4 forkey:
@"fourth"];

對字典中已經存在的關鍵字使用setObject:forkey可以替換原來的鍵值對,如果要刪除某些關鍵字,可以使用removeObjectForKey

- (void) removeObjectForKey:(id) aKey

假設去將第三次存的錢取出來了,那么就要從字典里面刪除

[money removeObjectForKey@"second"];
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!