NSDictionary細說(二)—— 字典的創建

版本記錄

版本號 時間
V1.0 2017.08.27

前言

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

一、+ (instancetype)dictionary;

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

下面看示例代碼。

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

看輸出結果

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

結論:空字典實例化。


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

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

下面看一下參數和返回值:

  • path:一個完整的或相對的路徑名。 由路徑標識的文件必須包含屬性列表的字符串表示,其根對象是字典。
  • return:一個新的字典,其中包含路徑中的字典,如果存在文件錯誤或文件的內容是字典的無效表示,則為nil。

還要注意:

  • 由路徑標識的文件中的字典表示只能包含屬性列表對象(NSString,NSData,NSDate,NSNumber,NSArray或NSDictionary對象)。 該字典包含的對象是不可變的,即使字典是可變的。

下面看示例代碼

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

下面看輸出結果

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

下面看我建立的plist文件。

結論:根據文件生成字典。


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

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

下面看參數:

  • url:一個URL,用于標識包含其根對象是字典的屬性列表的字符串表示形式的資源。
  • return:一個包含aURL字典的新字典,如果有錯誤或資源的內容是字典的無效表示,則為零。

還要注意:

  • 由路徑標識的文件中的字典表示只能包含屬性列表對象(NSString,NSData,NSDate,NSNumber,NSArray或NSDictionary對象)。 該字典包含的對象是不可變的,即使字典是可變的。

結論:根據指定的URL生成字典。


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

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

看示例代碼

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

看輸出結果

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

結論:根據給定字典實例化新的字典。


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

該方法的作用是:創建并返回包含給定鍵和值的字典。

看一下參數:

  • object:與aKey相對應的值。如果此值為nil,則會引發NSInvalidArgumentException
  • key:對象的鍵。如果此值為nil,則會引發NSInvalidArgumentException
  • return:一個包含單個對象的新字典,anObject,用于單個鍵,aKey。

下面看示例代碼

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

看輸出結果

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

結論:實例化具有單個鍵值對的字典。


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

該方法的作用就是:創建并返回一個字典,其中包含從數組的內容生成的鍵和值。

下面看輸出結果:

  • objects:包含新字典值的數組。
  • keys:包含新字典鍵的數組。 每個密鑰被復制(使用copyWithZone:;密鑰必須符合NSCopying協議),并且該副本被添加到字典中。
  • return:一個新的字典,根據內容獲取的鍵和值。

還要注意:

  • 該方法會遍歷對象和鍵數組,并根據其創建字典。 如果對象和鍵不具有相同數量的元素,則會引發NSInvalidArgumentException異常。

下面看示例代碼

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

看輸出結果

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

結論:根據鍵值數組和值數組創建多鍵值對的字典。


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

該方法的作用是:返回具有固定鍵值對數組的字典。

下面看一下參數和返回值:

  • objects:新字典的C數組值。
  • keys:用于新字典的C數組鍵。 每個鍵被復制(使用copyWithZone:,鍵必須符合NSCopying協議),并且該副本被添加到新的字典中。
  • cnt:從鍵和對象數組中使用的元素數。 計數不得超過對象或鍵中元素的數量。

還要注意:

  • 他的方法遍歷對象和鍵數組,在新字典中創建條目。 如果key或value對象為nil,則會引發NSInvalidArgumentException異常。
  • 以下代碼片段說明了如何創建將字母字符與其ASCII值相關聯的字典:
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];

看一下這個示例的輸出結果

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;
}

結論:根據C數組包含的鍵值創建指定數目鍵值對的字典。


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

該方法的作用是:創建并返回一個字典,其中包含從指定的值和鍵集合構造的條目。

下面看一下參數:

  • firstObject:添加到新字典的第一個值。
  • ...:首先是firstObj的關鍵字,然后是一個空值終止的交替值和鍵列表。 如果任何鍵為nil,則會引發NSInvalidArgumentException異常。

下面還要注意:

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

看一下下面示例代碼

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

看輸出結果

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

結論:根據有序的值鍵排序創建字典。

后記

未完,待續~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容