版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.08.27 |
前言
NSDictionary
是不可变字典,它的不可变性可以参考NSArray
数组,但是它与数组还是有很大不同,尽管他们都属于集合类,下面这几篇我们继续来将一下基础类的知识。还是老规矩从整体到局部,从浅入深进行讲解,谢谢大家。感兴趣的可以参考我上面几篇。
1. NSDictionary细说(一)—— 整体了解
2. NSDictionary细说(二)—— 字典的创建
一、- (instancetype)init;
很常见的对象初始化,没什么说的了。
结论:简单到爆,但是还是列出来了。
二、- (NSDictionary<KeyType,ObjectType> *)initWithContentsOfFile:(NSString *)path;
这个和第二篇方法差不多,不多说了,直接给示例代码。
- (void)demoInitWithContentsOfFile
{
NSDictionary *dict = [[NSDictionary alloc ] initWithContentsOfFile:@"/Users/lucy/Desktop/demo/JJOC/JJOC/Property List.plist"];
NSLog(@"dict = %@", dict);
}
下面看输出结果
2017-08-27 21:29:48.311 JJOC[9040:284512] dict = {
One = 1;
Three = 3;
Two = 2;
}
结论:从文件路径初始化字典。
三、- (NSDictionary<KeyType,ObjectType> *)initWithContentsOfURL:(NSURL *)url;
该方法的作用:从指定的URL实例化字典。
还要注意:
- 初始化的字典 - 可能与原始接收器不同 - 包含aURL中的字典,或者如果存在错误或资源的内容是字典的无效表示,则为nil。
- 由路径标识的文件中的字典表示只能包含属性列表对象
(NSString,NSData,NSDate,NSNumber,NSArray或NSDictionary对象)
。
结论:根据指定URL实例化字典。
四、- (instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType> *)otherDictionary;
该方法的作用:根据给定的字典实例化新的字典。
下面看一下示例代码
- (void)demoInitWithDictionary
{
NSDictionary *givenDict = @{@"One" : @"1", @"Two" : @"2"};
NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:givenDict];
NSLog(@"dict = %@", dict);
}
看输出结果
2017-08-27 21:36:17.024 JJOC[9310:291355] dict = {
One = 1;
Two = 2;
}
结论:根据给定字典实例化字典。
五、- (instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType> *)otherDictionary copyItems:(BOOL)flag;
该方法的作用是:使用另一个给定字典中包含的对象初始化新分配的字典。
下面看一下参数和返回值:
-
otherDictionary
:包含用于初始化新词典的键和值的字典。 -
flag
:如果是YES,otherDictionary
中的每个对象都会收到一个copyWithZone:
消息来创建对象的副本必须符合NSCopying协议。 在托管内存环境中,这不是对象否则会接收到的保留消息。 然后将对象副本添加到返回的字典。如果否NO,则在受管内存环境中,otherDictionary中的每个对象在添加到返回的字典时都会收到一条保留消息。 -
return
:一个初始化的对象 - 它可能与原始的接收器不同 - 包含在otherDictionary
中找到的键和值。
还要注意:
- 在这种不可变字典被初始化之后,它不能被修改。
copyWithZone:
方法执行浅拷贝。 如果你有一个任意深度的集合,那么对于flag参数传递YES就可以执行表面下面第一级的不可变拷贝。 如果您通过NO,第一级的可变性不受影响。 在任何一种情况下,所有更深层次的可变性都不受影响。
下面看示例代码
- (void)demoInitWithDictionaryCopyItems
{
NSDictionary *givenDict = @{@"One" : @"1", @"Two" : @"2"};
NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:givenDict copyItems:NO];
NSLog(@"dict = %@", dict);
}
下面看输出结果
2017-08-27 21:44:45.139 JJOC[9577:299298] dict = {
One = 1;
Two = 2;
}
结论:根据给定的字典,实例化新的字典,这里带flag标志位。
六、- (instancetype)initWithObjects:(NSArray<ObjectType> *)objects forKeys:(NSArray<id<NSCopying>> *)keys;
该方法和第二篇中的方法类似,都是根据指定的key和value数组实例化新的字典,这里只给出简单示例代码。
- (void)demoInitWithObjectsKeys
{
NSArray *keys = @[@"One", @"Two"];
NSArray *values = @[@1 , @2];
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
NSLog(@"dict = %@", dict);
}
看输出结果
2017-08-27 21:48:26.338 JJOC[9717:301860] dict = {
One = 1;
Two = 2;
}
结论:根据键值数组实例化多个键值对的新字典。
七、- (instancetype)initWithObjects:(ObjectType _Nonnull const *)objects forKeys:(id<NSCopying> _Nonnull const *)keys count:(NSUInteger)cnt;
该方法和第二篇中的方法类似,都是根据C数组的键值和数目,实例化字典,这里只给出简单的示例代码。
- (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);
}
下面看结果
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;
}
结论:根据C数组键值对和数目,实例化新的字典。
八、- (instancetype)initWithObjectsAndKeys:(id)firstObject, ...;
该方法和第二篇所写类似,都是根据值和键对的排序,实例化新的字典,下面我们看示例代码。
- (void)demoInitWithObjectsAndKeys
{
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSLog(@"dict = %@", dict);
}
看输出结果
2017-08-27 21:56:37.045 JJOC[10083:308134] dict = {
key1 = value1;
key2 = value2;
}
结论:根据有序的值键排序,实例化新的数组。
后记
简单的都感觉自己浪费时间了,但是为了照顾初学者还是不厌其烦的写了,希望对需要的人有所帮助,未完,待续~~