NSDictionary細(xì)說(三)—— 字典的初始化

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.08.27

前言

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

一、- (instancetype)init;

很常見的對(duì)象初始化,沒什么說的了。

結(jié)論:簡(jiǎn)單到爆,但是還是列出來了。


二、- (NSDictionary<KeyType,ObjectType> *)initWithContentsOfFile:(NSString *)path;

這個(gè)和第二篇方法差不多,不多說了,直接給示例代碼。

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

下面看輸出結(jié)果

2017-08-27 21:29:48.311 JJOC[9040:284512] dict = {
    One = 1;
    Three = 3;
    Two = 2;
}

結(jié)論:從文件路徑初始化字典。


三、- (NSDictionary<KeyType,ObjectType> *)initWithContentsOfURL:(NSURL *)url;

該方法的作用:從指定的URL實(shí)例化字典。

還要注意:

  • 初始化的字典 - 可能與原始接收器不同 - 包含aURL中的字典,或者如果存在錯(cuò)誤或資源的內(nèi)容是字典的無效表示,則為nil。
  • 由路徑標(biāo)識(shí)的文件中的字典表示只能包含屬性列表對(duì)象(NSString,NSData,NSDate,NSNumber,NSArray或NSDictionary對(duì)象)。

結(jié)論:根據(jù)指定URL實(shí)例化字典。


四、- (instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType> *)otherDictionary;

該方法的作用:根據(jù)給定的字典實(shí)例化新的字典。

下面看一下示例代碼

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

看輸出結(jié)果

2017-08-27 21:36:17.024 JJOC[9310:291355] dict = {
    One = 1;
    Two = 2;
}

結(jié)論:根據(jù)給定字典實(shí)例化字典。


五、- (instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType> *)otherDictionary copyItems:(BOOL)flag;

該方法的作用是:使用另一個(gè)給定字典中包含的對(duì)象初始化新分配的字典。

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

  • otherDictionary:包含用于初始化新詞典的鍵和值的字典。
  • flag:如果是YES,otherDictionary中的每個(gè)對(duì)象都會(huì)收到一個(gè)copyWithZone:消息來創(chuàng)建對(duì)象的副本必須符合NSCopying協(xié)議。 在托管內(nèi)存環(huán)境中,這不是對(duì)象否則會(huì)接收到的保留消息。 然后將對(duì)象副本添加到返回的字典。如果否NO,則在受管內(nèi)存環(huán)境中,otherDictionary中的每個(gè)對(duì)象在添加到返回的字典時(shí)都會(huì)收到一條保留消息。
  • return:一個(gè)初始化的對(duì)象 - 它可能與原始的接收器不同 - 包含在otherDictionary中找到的鍵和值。

還要注意:

  • 在這種不可變字典被初始化之后,它不能被修改。
    copyWithZone:方法執(zhí)行淺拷貝。 如果你有一個(gè)任意深度的集合,那么對(duì)于flag參數(shù)傳遞YES就可以執(zhí)行表面下面第一級(jí)的不可變拷貝。 如果您通過NO,第一級(jí)的可變性不受影響。 在任何一種情況下,所有更深層次的可變性都不受影響。

下面看示例代碼

- (void)demoInitWithDictionaryCopyItems
{
    NSDictionary *givenDict = @{@"One" : @"1", @"Two" : @"2"};
    NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:givenDict copyItems:NO];
    NSLog(@"dict = %@", dict);
}

下面看輸出結(jié)果

2017-08-27 21:44:45.139 JJOC[9577:299298] dict = {
    One = 1;
    Two = 2;
}

結(jié)論:根據(jù)給定的字典,實(shí)例化新的字典,這里帶flag標(biāo)志位。


六、- (instancetype)initWithObjects:(NSArray<ObjectType> *)objects forKeys:(NSArray<id<NSCopying>> *)keys;

該方法和第二篇中的方法類似,都是根據(jù)指定的key和value數(shù)組實(shí)例化新的字典,這里只給出簡(jiǎn)單示例代碼。

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

看輸出結(jié)果

2017-08-27 21:48:26.338 JJOC[9717:301860] dict = {
    One = 1;
    Two = 2;
}

結(jié)論:根據(jù)鍵值數(shù)組實(shí)例化多個(gè)鍵值對(duì)的新字典。


七、- (instancetype)initWithObjects:(ObjectType _Nonnull const *)objects forKeys:(id<NSCopying> _Nonnull const *)keys count:(NSUInteger)cnt;

該方法和第二篇中的方法類似,都是根據(jù)C數(shù)組的鍵值和數(shù)目,實(shí)例化字典,這里只給出簡(jiǎn)單的示例代碼。

- (void)demoInitWithObjectsCount
{
    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 alloc] initWithObjects:valueArray forKeys:keyArray count:N_ENTRIES];
    NSLog(@"asciiDict = %@", asciiDict);
}

下面看結(jié)果

2017-08-27 21:52:02.744 JJOC[9859:304372] 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ù)組鍵值對(duì)和數(shù)目,實(shí)例化新的字典。


八、- (instancetype)initWithObjectsAndKeys:(id)firstObject, ...;

該方法和第二篇所寫類似,都是根據(jù)值和鍵對(duì)的排序,實(shí)例化新的字典,下面我們看示例代碼。

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

看輸出結(jié)果

2017-08-27 21:56:37.045 JJOC[10083:308134] dict = {
    key1 = value1;
    key2 = value2;
}

結(jié)論:根據(jù)有序的值鍵排序,實(shí)例化新的數(shù)組。

后記

簡(jiǎn)單的都感覺自己浪費(fèi)時(shí)間了,但是為了照顧初學(xué)者還是不厭其煩的寫了,希望對(duì)需要的人有所幫助,未完,待續(xù)~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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