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]);
}
NSLog(@"index %d has %@",i,[array objectAtIndex:i]);
}
當然也可以使用數字變量來循環
for (NSInteger i = 0; i < [array count]; i++) {
NSLog(@"index %d has %@",i,array[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];
}
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);
}
NSLog(@"I found %@",thingie);
}
ps.這段代碼不知怎么的會提示unexpected type name ‘id’...
快速枚舉
快速枚舉的語法感覺和python差不多,例如
for (NSString *string in array) {
NSLog(@"I found %@ also",string);
}
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': 123, 98.6: 37 };
每個鍵與值用冒號隔開(:),每對用逗號,每對用逗號分割,整體放在花括號中({})。
鍵必須獨一無二,但值則不必。
值可以取任何數據類型,但必須是不可變的,如字符串,數或元組。
字典由鍵和對應值成對組成。字典也被稱作關聯數組或哈希表。基本語法如下:
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
也可如此創建字典:
dict1 = { 'abc': 456 };
dict2 = { 'abc': 123, 98.6: 37 };
每個鍵與值用冒號隔開(:),每對用逗號,每對用逗號分割,整體放在花括號中({})。
鍵必須獨一無二,但值則不必。
值可以取任何數據類型,但必須是不可變的,如字符串,數或元組。
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};
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"];
或者是
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"];
[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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!