版本記錄
版本號 | 時(shí)間 |
---|---|
V1.0 | 2017.08.27 |
前言
NSDictionary
是不可變字典,它的不可變性可以參考NSArray
數(shù)組吊奢,但是它與數(shù)組還是有很大不同键耕,盡管他們都屬于集合類,下面這幾篇我們繼續(xù)來將一下基礎(chǔ)類的知識斑鼻。還是老規(guī)矩從整體到局部,從淺入深進(jìn)行講解猎荠,謝謝大家坚弱。感興趣的可以參考我上面幾篇蜀备。
1. NSDictionary細(xì)說(一)—— 整體了解
2. NSDictionary細(xì)說(二)—— 字典的創(chuàng)建
一、- (instancetype)init;
很常見的對象初始化荒叶,沒什么說的了琼掠。
結(jié)論:簡單到爆,但是還是列出來了停撞。
二瓷蛙、- (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)識的文件中的字典表示只能包含屬性列表對象
(NSString,NSData污茵,NSDate樱报,NSNumber,NSArray或NSDictionary對象)
泞当。
結(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è)給定字典中包含的對象初始化新分配的字典陋桂。
下面看一下參數(shù)和返回值:
-
otherDictionary
:包含用于初始化新詞典的鍵和值的字典逆趣。 -
flag
:如果是YES,otherDictionary
中的每個(gè)對象都會(huì)收到一個(gè)copyWithZone:
消息來創(chuàng)建對象的副本必須符合NSCopying協(xié)議嗜历。 在托管內(nèi)存環(huán)境中宣渗,這不是對象否則會(huì)接收到的保留消息。 然后將對象副本添加到返回的字典秸脱。如果否NO落包,則在受管內(nèi)存環(huán)境中部蛇,otherDictionary中的每個(gè)對象在添加到返回的字典時(shí)都會(huì)收到一條保留消息摊唇。 -
return
:一個(gè)初始化的對象 - 它可能與原始的接收器不同 - 包含在otherDictionary
中找到的鍵和值。
還要注意:
- 在這種不可變字典被初始化之后涯鲁,它不能被修改巷查。
copyWithZone:
方法執(zhí)行淺拷貝有序。 如果你有一個(gè)任意深度的集合,那么對于flag參數(shù)傳遞YES就可以執(zhí)行表面下面第一級的不可變拷貝岛请。 如果您通過NO旭寿,第一級的可變性不受影響。 在任何一種情況下崇败,所有更深層次的可變性都不受影響盅称。
下面看示例代碼
- (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í)例化新的字典疾层,這里只給出簡單示例代碼。
- (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è)鍵值對的新字典贡避。
七痛黎、- (instancetype)initWithObjects:(ObjectType _Nonnull const *)objects forKeys:(id<NSCopying> _Nonnull const *)keys count:(NSUInteger)cnt;
該方法和第二篇中的方法類似,都是根據(jù)C數(shù)組的鍵值和數(shù)目刮吧,實(shí)例化字典湖饱,這里只給出簡單的示例代碼。
- (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ù)組鍵值對和數(shù)目杀捻,實(shí)例化新的字典琉历。
八、- (instancetype)initWithObjectsAndKeys:(id)firstObject, ...;
該方法和第二篇所寫類似水醋,都是根據(jù)值和鍵對的排序旗笔,實(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ù)組。
后記
簡單的都感覺自己浪費(fèi)時(shí)間了惶桐,但是為了照顧初學(xué)者還是不厭其煩的寫了撮弧,希望對需要的人有所幫助,未完姚糊,待續(xù)~~