【说明】
1、字典是OC中特有的类型,用于存放OC的对象
2、字典中的对象是没有顺序的
3、字典中的对象是以【键(key)值(value)对】的形式出现
4、键是为了查找值而存在的,是为了快速的查找到值
5、任何对象都可作为键,但是常用字符串作为键
一、不可变字典(NSDictionary)
1、创建
NSDictionary *dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3", nil];
//其中:@"one",@"1"、@"two",@"2"、@"three",@"3"是三个不同的键值对 @"1",@"2",@"3"是键,@"one",@"two",@"three"是值
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"I",@"1",@"II",@"2",@"III",@"3", nil];
NSDictionary *dic3 = @{@"1":@"Mon",@"2":@"Tue",@"3":@"Wed"};
//通过所有的键和所有的值创建字典
NSDictionary *dic4 = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
//通过一个字典创建另一个字典
NSDictionary *dic5 = [NSDictionary dictionaryWithDictionary:dic4];
2、返回键值对个数
NSUInteger count = [dic3 count];
3、通过键返回值
NSString *str = [dic2 objectForKey:@"2"];
4、返回所有的键或值
//返回所有的键
NSArray *keys = [dic1 allKeys];
//返回所有的值
NSArray *values = [dic1 allValues];
5、快速枚举遍历字典
for (id obj in dic3) {
//遍历字典只能遍历键,可以通过键找到值
NSLog(@"%@", [dic3 objectForKey:obj]);
}
二、可变字典(NSMutableDictionary)
1、设置字典
[mDic setDictionary:@{@"1":@"A",@"2":@"B"}];
2、添加或设置键值对
[mDic setValue:@"C" forKey:@"3"];
//若添加的键值对的键不存在,则会直接添加
[mDic setValue:@"D" forKey:@"3"];
//若添加的键值对的键已存在,则会修改该键对应的值
3、删除键值对
//根据键删除对应的键值对
[mDic removeObjectForKey:@"2"];
//删除某个数组中包含的键对应的键值对
[mDic removeObjectsForKeys:@[@"1",@"2"]];
//删除所有的键值对
[mDic removeAllObjects];
三、点语法
【说明】
大多数的成员变量都有两个方法setter和getter,
凡是满足特定格式的都可使用点语法的形式。
int _age;
- (void) setAge:(int)age;
- (int)age;
若一个类中有大量的成员变量,每个成员变量都需要这两个方法;
这样势必会造成书写繁琐,鉴于此OC提供了专门的标准的格式
【@property和@synthesize】
【使用说明】
@property int age;
//这句话相当于声明了_age的setter和getter方法
//同时也实现了_age的setter和getter方法
//若成员变量_age没有定义,会自动定义个_age成员变量
@synthesize age = _age;
//这个式子相当于实现了_age的setter和getter方法
【属性修饰符】
//设置为只读,只有getter方法
@property (readonly) int age;
//readwrite同时实现setter和getter方法,默认属性
@property (readwrite) int weight;
//原子操作,不可被打断
@property (atomic) int height;
//非原子操作,可以提高效率,多个用逗号隔开
@property (readonly,nonatomic) NSString *name;
//直接赋值,不做内存管理
@property (assign) NSString *color;
//关联非标准的setter和getter方法
@property (setter=setDogKind:) NSString *kind;
四、选择器(selector)
【特点】
1、是一种数据类型SEL
2、SEL类型的变量用于存放方法的
【使用】
1、创建SEL类型的变量
//定义SEL类型的变量(编译时)
SEL sel = @selector(eat);
//动态的创建SEL变量(运行时)
SEL sel2 = NSSelectorFromString(@"eat");
//在执行时直接创建SEL变量没有警告
[cat performSelector:@selector(eat)];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
//这样使用会有警告,加上外面语句可以忽略
[cat performSelector:sel2];
#pragma clang diagnostic push
//通过selector调用方法时,若方法没有实现会导致崩溃
2、判断某个类是否实现了selector中的方法
//判断对象所属的类是否实现了selector中的方法
[cat respondsToSelector:sel2]
练习题:
1、创建学生类,成员变量有姓名,年龄和成绩。用学生类,
创建三个学生对象,将三个学生添加到字典中,
以学生的名字作为key。输入一个学生的名字,
打印出该学生的完整信息
(学生对象是值,学生名字的字符串是key)
2、昨天第4题
给可变数组添加一个方法 -(void)sortWithSelector:(SEL)sel;
- (BOOL)isOlderAgeThan:(JYStudent *)aStu;
要求:先完善代码,然后不做参考自己实现一遍
3、英汉字典