NSDictionary細(xì)說(二)—— 字典的創(chuàng)建

版本記錄

版本號 時間
V1.0 2017.08.27

前言

NSDictionary是不可變字典,它的不可變性可以參考NSArray數(shù)組竿刁,但是它與數(shù)組還是有很大不同盒卸,盡管他們都屬于集合類,下面這幾篇我們繼續(xù)來將一下基礎(chǔ)類的知識结执。還是老規(guī)矩從整體到局部度陆,從淺入深進(jìn)行講解,謝謝大家献幔。感興趣的可以參考我上面幾篇懂傀。
1. NSDictionary細(xì)說(一)—— 整體了解

一、+ (instancetype)dictionary;

該方法的作用就是:創(chuàng)建并返回一個空的字典蜡感。該方法主要用于NSDictionary的可變子類蹬蚁。如果不想要臨時對象,還可以使用alloc ...和init創(chuàng)建一個空字典郑兴。

下面看示例代碼犀斋。

- (void)demoDictionary
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    NSLog(@"dict = %@", dict);
}

看輸出結(jié)果

2017-08-27 16:50:33.670 JJOC[6245:199913] dict = {
}

結(jié)論:空字典實例化。


二情连、+ (NSDictionary<KeyType,ObjectType> *)dictionaryWithContentsOfFile:(NSString *)path;

該方法的作用就是:使用由給定路徑指定的文件中找到的鍵和值創(chuàng)建并返回字典叽粹。

下面看一下參數(shù)和返回值:

  • path:一個完整的或相對的路徑名。 由路徑標(biāo)識的文件必須包含屬性列表的字符串表示却舀,其根對象是字典虫几。
  • return:一個新的字典,其中包含路徑中的字典挽拔,如果存在文件錯誤或文件的內(nèi)容是字典的無效表示辆脸,則為nil。

還要注意:

  • 由路徑標(biāo)識的文件中的字典表示只能包含屬性列表對象(NSString螃诅,NSData啡氢,NSDate,NSNumber术裸,NSArray或NSDictionary對象)倘是。 該字典包含的對象是不可變的,即使字典是可變的穗椅。

下面看示例代碼

- (void)demoDictionaryWithContentsOfFile
{
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lucy/Desktop/demo/JJOC/JJOC/Property List.plist"];
    NSLog(@"dict = %@", dict);
}

下面看輸出結(jié)果

2017-08-27 20:36:02.897 JJOC[7260:234979] dict = {
    One = 1;
    Three = 3;
    Two = 2;
}

下面看我建立的plist文件辨绊。

結(jié)論:根據(jù)文件生成字典。


三匹表、+ (NSDictionary<KeyType,ObjectType> *)dictionaryWithContentsOfURL:(NSURL *)url;

該方法的作用就是:使用由給定URL指定的資源中找到的鍵和值創(chuàng)建并返回字典门坷。

下面看參數(shù):

  • url:一個URL宣鄙,用于標(biāo)識包含其根對象是字典的屬性列表的字符串表示形式的資源。
  • return:一個包含aURL字典的新字典默蚌,如果有錯誤或資源的內(nèi)容是字典的無效表示冻晤,則為零。

還要注意:

  • 由路徑標(biāo)識的文件中的字典表示只能包含屬性列表對象(NSString绸吸,NSData鼻弧,NSDate,NSNumber锦茁,NSArray或NSDictionary對象)攘轩。 該字典包含的對象是不可變的,即使字典是可變的码俩。

結(jié)論:根據(jù)指定的URL生成字典度帮。


四、+ (instancetype)dictionaryWithDictionary:(NSDictionary<KeyType,ObjectType> *)dict;

該方法的作用就是:創(chuàng)建并返回一個包含來自另一個給定字典的鍵和值的字典稿存。

看示例代碼

- (void)demoDictionaryWithDictionary
{
    NSDictionary *givenDict = @{@"One" : @"1", @"Two" : @"2"};
    NSDictionary *dict = [NSDictionary dictionaryWithDictionary:givenDict];
    NSLog(@"dict = %@", dict);
}

看輸出結(jié)果

2017-08-27 20:44:18.039 JJOC[7584:243640] dict = {
    One = 1;
    Two = 2;
}

結(jié)論:根據(jù)給定字典實例化新的字典笨篷。


五、+ (instancetype)dictionaryWithObject:(ObjectType)object forKey:(id<NSCopying>)key;

該方法的作用是:創(chuàng)建并返回包含給定鍵和值的字典瓣履。

看一下參數(shù):

  • object:與aKey相對應(yīng)的值率翅。如果此值為nil,則會引發(fā)NSInvalidArgumentException袖迎。
  • key:對象的鍵冕臭。如果此值為nil,則會引發(fā)NSInvalidArgumentException瓢棒。
  • return:一個包含單個對象的新字典浴韭,anObject丘喻,用于單個鍵脯宿,aKey。

下面看示例代碼

- (void)demoDictionaryWithObject
{
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"1" forKey:@"One"];
    NSLog(@"dict = %@", dict);
}

看輸出結(jié)果

2017-08-27 20:50:40.159 JJOC[7838:250574] dict = {
    One = 1;
}

結(jié)論:實例化具有單個鍵值對的字典泉粉。


六连霉、+ (instancetype)dictionaryWithObjects:(NSArray<ObjectType> *)objects forKeys:(NSArray<id<NSCopying>> *)keys;

該方法的作用就是:創(chuàng)建并返回一個字典,其中包含從數(shù)組的內(nèi)容生成的鍵和值嗡靡。

下面看輸出結(jié)果:

  • objects:包含新字典值的數(shù)組跺撼。
  • keys:包含新字典鍵的數(shù)組。 每個密鑰被復(fù)制(使用copyWithZone:;密鑰必須符合NSCopying協(xié)議)讨彼,并且該副本被添加到字典中歉井。
  • return:一個新的字典,根據(jù)內(nèi)容獲取的鍵和值哈误。

還要注意:

  • 該方法會遍歷對象和鍵數(shù)組哩至,并根據(jù)其創(chuàng)建字典躏嚎。 如果對象和鍵不具有相同數(shù)量的元素,則會引發(fā)NSInvalidArgumentException異常菩貌。

下面看示例代碼

- (void)demoDictionaryWithObjects
{
    NSArray *keys = @[@"One", @"Two"];
    NSArray *values = @[@1 , @2];
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];
    NSLog(@"dict = %@", dict);
}

看輸出結(jié)果

2017-08-27 20:58:55.582 JJOC[8099:258476] dict = {
    One = 1;
    Two = 2;
}

結(jié)論:根據(jù)鍵值數(shù)組和值數(shù)組創(chuàng)建多鍵值對的字典卢佣。


七、+ (instancetype)dictionaryWithObjects:(const ObjectType _Nonnull [])objects forKeys:(const id<NSCopying> _Nonnull [])keys count:(NSUInteger)cnt;

該方法的作用是:返回具有固定鍵值對數(shù)組的字典箭阶。

下面看一下參數(shù)和返回值:

  • objects:新字典的C數(shù)組值虚茶。
  • keys:用于新字典的C數(shù)組鍵。 每個鍵被復(fù)制(使用copyWithZone:仇参,鍵必須符合NSCopying協(xié)議)嘹叫,并且該副本被添加到新的字典中。
  • cnt:從鍵和對象數(shù)組中使用的元素數(shù)诈乒。 計數(shù)不得超過對象或鍵中元素的數(shù)量待笑。

還要注意:

  • 他的方法遍歷對象和鍵數(shù)組,在新字典中創(chuàng)建條目抓谴。 如果key或value對象為nil暮蹂,則會引發(fā)NSInvalidArgumentException異常。
  • 以下代碼片段說明了如何創(chuàng)建將字母字符與其ASCII值相關(guān)聯(lián)的字典:
static const NSInteger N_ENTRIES = 26;
NSDictionary *asciiDict;
NSString *keyArray[N_ENTRIES];
NSNumber *valueArray[N_ENTRIES];
NSInteger i;
 
for (i = 0; i < N_ENTRIES; i++) {
 
    char charValue = 'a' + i;
    keyArray[i] = [NSString stringWithFormat:@"%c", charValue];
    valueArray[i] = [NSNumber numberWithChar:charValue];
}
 
asciiDict = [NSDictionary dictionaryWithObjects:(id *)valueArray
                          forKeys:(id *)keyArray count:N_ENTRIES];

看一下這個示例的輸出結(jié)果

2017-08-27 21:08:34.600 JJOC[8380:266866] asciiDict = {
    a = 97;
    b = 98;
    c = 99;
    d = 100;
    e = 101;
    f = 102;
    g = 103;
    h = 104;
    i = 105;
    j = 106;
    k = 107;
    l = 108;
    m = 109;
    n = 110;
    o = 111;
    p = 112;
    q = 113;
    r = 114;
    s = 115;
    t = 116;
    u = 117;
    v = 118;
    w = 119;
    x = 120;
    y = 121;
    z = 122;
}

結(jié)論:根據(jù)C數(shù)組包含的鍵值創(chuàng)建指定數(shù)目鍵值對的字典癌压。


八仰泻、+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;

該方法的作用是:創(chuàng)建并返回一個字典,其中包含從指定的值和鍵集合構(gòu)造的條目滩届。

下面看一下參數(shù):

  • firstObject:添加到新字典的第一個值集侯。
  • ...:首先是firstObj的關(guān)鍵字,然后是一個空值終止的交替值和鍵列表帜消。 如果任何鍵為nil棠枉,則會引發(fā)NSInvalidArgumentException異常。

下面還要注意:

  • 該方法類似于dictionaryWithObjects:forKeys:泡挺,僅在鍵值對中指定的方式不同辈讶。

看一下下面示例代碼

- (void)demoDictionaryWithObjectsAndKeysOC
{
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"value1", @"key1", @"value2", @"key2", nil];
    NSLog(@"dict = %@", dict);
}

看輸出結(jié)果

2017-08-27 21:13:48.833 JJOC[8664:273512] dict = {
    key1 = value1;
    key2 = value2;
}

結(jié)論:根據(jù)有序的值鍵排序創(chuàng)建字典。

后記

未完娄猫,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贱除,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子媳溺,更是在濱河造成了極大的恐慌月幌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬蔽,死亡現(xiàn)場離奇詭異扯躺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門录语,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轴术,“玉大人,你說我怎么就攤上這事钦无《涸裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵失暂,是天一觀的道長彼宠。 經(jīng)常有香客問我,道長弟塞,這世上最難降的妖魔是什么凭峡? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮决记,結(jié)果婚禮上摧冀,老公的妹妹穿的比我還像新娘。我一直安慰自己系宫,他們只是感情好索昂,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扩借,像睡著了一般椒惨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潮罪,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天康谆,我揣著相機(jī)與錄音,去河邊找鬼嫉到。 笑死沃暗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的何恶。 我是一名探鬼主播孽锥,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼导而!你這毒婦竟也來了忱叭?” 一聲冷哼從身側(cè)響起隔崎,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤今艺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后爵卒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虚缎,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了实牡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陌僵。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖创坞,靈堂內(nèi)的尸體忽然破棺而出碗短,到底是詐尸還是另有隱情,我是刑警寧澤题涨,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布偎谁,位于F島的核電站,受9級特大地震影響纲堵,放射性物質(zhì)發(fā)生泄漏巡雨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一席函、第九天 我趴在偏房一處隱蔽的房頂上張望铐望。 院中可真熱鬧,春花似錦茂附、人聲如沸正蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跟畅。三九已至,卻和暖如春溶推,著一層夾襖步出監(jiān)牢的瞬間徊件,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工蒜危, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留虱痕,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓辐赞,卻偏偏與公主長得像部翘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子响委,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容