2014年12月7日 星期日

[Objective-C] NSMutableDictionary

Dictionary是一種相當常用的資料結構,在每種程式語言應該都有類似的東西。


以ObjectiveC為例,就是NSDictionary,在這邊稍微說明一下該怎麼用

透過Key來存取Object,有點像陣列,但是陣列是透過Index(NSUInteger)來存取,

Dictionary的Key可以用任意的形態,但是通常是用字串,此外要特別注意的一點,

陣列有順序(0~N),而Dictionary卻不保證有順序。

    NSMutableDictionary *dict = [NSMutableDictionary new];
   //宣告一個可變動的Dictionary

    NSString *strs = @"我是String";
    NSNumber *year = [NSNumber numberWithInt:2008];
    NSMutableArray *arrays = [NSMutableArray new];
    [arrays addObject:@"a"];
    [arrays addObject:@"b"];
    [arrays addObject:@"c"];
   //宣告字串 數字 陣列等等放入NSMutableDictionary

    [dict setObject:strs forKey:@"字串"];
    [dict setObject:year forKey:@"年份"];
    [dict setObject:arrays forKey:@"陣列"];
   //利用setObject將這三個物件存入NSMutableDictionary;Key"字串","年份","陣列"

    NSLog(@"%@",[dict objectForKey:@"字串"]);
    //利用objectForKey方法來取出物件
    NSLog(@"%@",dict[@"年份"]);
    //也能用[]來取出,有點像陣列
    NSLog(@"%@",[[dict objectForKey:@"陣列"]objectAtIndex:0]);
    //陣列取出來也能馬上利用
輸出結果:
2014-12-07 22:29:15.210 HelloNSDictionary[4261:109453] 我是String
2014-12-07 22:29:15.210 HelloNSDictionary[4261:109453] 2008
2014-12-07 22:29:15.210 HelloNSDictionary[4261:109453] a

    NSArray *array1 = [dict objectForKey:@"陣列"];
    //如果覺得直接用有點亂,可以考慮將物件取出來在使用


Dictionary有一些滿有用的方法,可以讓你更順利的處理一些事情

allKeys -> 回傳一個陣列,裡面包含Dictionary裡面所有的key

    NSString *str1 = @"我是str1";
    NSString *str2 = @"我是str2";
    NSString *str3 = @"我是str3";
    NSString *str4 = @"我是str4";
    //建立四個String物件
    
    [dict setObject:str1 forKey:@"字串1"];
    [dict setObject:str2 forKey:@"字串2"];
    [dict setObject:str3 forKey:@"字串3"];
    [dict setObject:str4 forKey:@"字串4"];
    //將四個String加入到NSMutableDictionary
    
    NSArray *keys = [dict allKeys];
    //allKeys方法->會回傳字典內所有的Key
    
    for (NSString* key in keys) {
        NSLog(@"%@",key);
    }
    //利用forin試著印出來

2014-12-07 22:59:17.642 HelloNSDictionary[4487:122128] 字串2
2014-12-07 22:59:17.643 HelloNSDictionary[4487:122128] 字串3
2014-12-07 22:59:17.643 HelloNSDictionary[4487:122128] 字串4
2014-12-07 22:59:17.643 HelloNSDictionary[4487:122128] 字串1

可以看到印出來的Key的確是我們加入的四個,但是特別注意的是順序卻跟當初加入的不太一樣,這就是Dictionary的特性,並不保證順序,但是如果透過這個Key陣列來存取的話,只要整理這個陣列,就能排序成自己要的樣子。

    NSLog(@"%@",[dict objectForKey:keys[0]]);
    //透過key Array來存取NSMutableDictionary

    NSLog(@"%@",[dict objectForKey:[dict allKeys][0]]);
    //如果對括號的掌握度夠好,也能直接利用allKeys方法來存取


2014-12-07 23:05:56.667 HelloNSDictionary[4540:124827] 我是str2
2014-12-07 23:05:56.668 HelloNSDictionary[4540:124827] 我是str2


還有一個allValues,印出字典內所有的值。
 NSArray *values = [dict allValues];
    //allValues方法->回傳字典內所有的Values
    
    for (NSString* value in values) {
        NSLog(@"%@",value);
    }
    //利用forin試著印出來

2014-12-07 23:09:41.950 HelloNSDictionary[4592:126604] 我是str2
2014-12-07 23:09:41.951 HelloNSDictionary[4592:126604] 我是str3
2014-12-07 23:09:41.951 HelloNSDictionary[4592:126604] 我是str4
2014-12-07 23:09:41.951 HelloNSDictionary[4592:126604] 我是str1


有些人可能會有疑問,有一個setValue forKeys又是啥,跟setObject forKey有點像

可以看一下這篇 Key-Value-Coding


沒有留言:

張貼留言