文章目录
字典的结构
字典是无序集合,是由一系列key ,value键值对组成的。字典在查找数据的时候和数组不一样,数组查找数据是通过索引也就是下标,而且数组是有序的。而字典是无序的,所以要根据key去查找对应的value,而我们的Key必须确保是唯一的,也就是一个key只能对应一个value,但是value可以对应多个key。
在实际开发中,key一般是NSString类型的,写成字符串对象便于查找,如果改成自定义对象或者其他类型对象,就不便于我们查找了。
其实字典的内部实现是依据的hash表,根据hash函数映射,使我们的key能够快速得对应找到我们相应的value,所以字典的查找效率是非常高的。
不可变字典
创建
1.dictionaryWithObjectsAndKeys,value在前面
NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:@"one",@"1",@"two",@"2",nil];//value和key一定是成对出现的
NSLog(@"%@",dict);
输出结果,前面放的是Key后面是value:dict {
1=one;
2=two;
}
简便方法:key在前面,加冒号,接value,每一对key和value之间用逗号分开。用的花括号{},注意数组用的方括号[]
dict=@{@“name”:@"Tom",
@"nickname":@"tangmu",
@"age":@12,
@"sex":@"male"};//age是NSNumber类型
注意如果创建的时候有两个相同的key,会直接忽略掉第二个。
dict=@{@“name”:@"Tom",
@"name":@"tangmu",
@"age":@12,
@"sex":@"male"};
结果九只有age=12;name=Tom;sex=male
如何通过key查找相应的value
首先确定value是什么类型的。
如果取的key不是字典中存在的key,就会直接返回一个nil。
NSString *name=[dict objectForKey:@"name"];
NSLog(@"name=%@",name);
简便方法:编译的时候会自动转换成第一种形式。
NSNumber *age=dict[@"age"];
通过value查找相应的key
一个value可以对应多个Key
dict=@{@“name”:@"Tom",
@"nickname":@"Tom",
@"age":@12,
@"sex":@"male"};
NSArray *Keys=[dict allKeysForObject@"Tom"];//查找结果是NSArray
查找所有的key,所有的value
NSLog(@"allKeys:%@",dict.allKeys);
NSLog(@"allKeys:%@",dict.allValues);
字典的嵌套使用
所有的结构之间都能够嵌套使用,相互之间即使是不同类型的也可以嵌套。
dict=@{@"name": @"Tom",
@"infoArray":@[@"1",@"2"],
@"infoDict":@{@"array":@[@"1",@"2"]}
}
但是也不要随意嵌套,因为会导致语义不清晰,要根据实际的开发需要。
遍历字典
和数组类似.for in循环,遍历的是key,前面的对象是key的类型。然后根据key去查找value
NSDictionary *dict=@{@"name":@"Tom",
@"nickname":@"tangmu",
@"age":@20,
@"sex":@"male"
};
for (NSString *key in dict){
NSLog(@"%@:%@",key,dict[key]);
}
如果只遍历value,可以
for(id object in dict.allValues){
NSLog(@"%@",object);
}
可变字典
创建
NSMutableDictionary *mutableDict=[NSMutableDictionary dictionary];
添加
1.将不可变字典的内容,添加到可变字典当中
NSDictionary *dict=@{@"name":@"Tom",
@"nickname":@"tangmu",
@"age":@20,
@"sex":@"male"
};
NSMutableDictionary *mutableDict=[NSMutableDictionary dictionary];
[mutableDict addEntriesFormDictionary:dict];
2.只添加一对键值
字典中就会增加height 170的键值对
[mutableDict setObject:@170 forKey:@"height"];
修改字典中key对应的value值
确保key是字典中存在的key,setObject就会执行修改操作,如果key不存在,setObject就会执行添加操作。
[mutableDict setObject:@30 forKey:@"age"];
删除
删除制定的key和value
[mutableDict removeObjectForKey:@"height"];
移除所有key value,结果是字典变成空的。
[mutableDict removeAllObjects];
setValue forKey的value值传nil时,对应key和value会被删掉。即如果发现value为nil,就会调用字典的removeObjectForKey方法。
[mutableDict setValue:nil forKey:@"name"];
当value不为nil,执行的是修改操作。相当于调用了setObject forKey的方法
[mutableDict setValue:@"Tim" forKey:@"name"];
所以setValue forKey是对removeObjectForKey和setObject forKey方法的一个封装。以后经常后推荐使用。
因为setObject forKey的object不小心传入了nil,程序会直接崩溃。
[mutableDict setObject:@170 forKey:@“height”];//崩溃