valueforkey和objectforkey区别
1.objectforkey 是NSDictionary的方法,valueforkey 是KVC的方法
2.两者都是键值对应
3.区别是valueforkey只允许使用NSString类型,objectforkey可以是任意类型.
定义数组和定义字典的区别
1.定义字典
NSDictionary *dict3=@{@"key":@"value",@"key":@"value"};
2.定义数组的形式一(注:指针对象必须得创建出来)
NSArray *array3=@[指针对象,NSNumber,@整形,@"字符串",nil];
3.定义数组的形式二
NSArray *array3=[NSArray arrayWithObjects:指针对象,NSNumber,@整形,@"字符串",nil];的
4.总结:从123可以得治字典中的对象都是字符串类型;数组中可以存放任意类型,只要OC支持的类型
关于字典、数组书写格式的相关简写(超重点)
1.数组的简写、全写
NSArray *str6=@[@"zhangbin",@"zb",@"ls",@"mz"];//简写形式
NSArray *arr4=[NSArray arrayWithObjects:@"zhangbin",@"zb",@"ls",@"mz",nil];//全写形式
2.NSDictionary获取元素的简写(可变字典也同样适用)
dict[@"name"];//简写 精华:根据key获取value元素
[dict objectForKey:@"name"];//全写
3.修改字典中的数据
dicM[@"age"]=@"100"; //简写 相当于赋值
[dicM setObject:@"100" forKey:@"age"];// 全写
4.基本数据类型转换为对象类型的简写 判断对象类型:对象前面有*
int age=10;
NSNumber *temp3=@(age);//简写
NSLog(@"%@",temp3);
等价于
int age=10;
NSNumber *ageN=[NSNumber numberWithInt:age];//全写
NSLog(@"%@",ageN);
创建字典(简写繁写)
1.利用字典创建一个key value
NSDictionary *dict3=@{@"name":@"zb"};//创建字典
NSLog(@"%@",dict3[@"name"]);//获取字典中key对应的value
等价于
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"zb" forKey:@"name"];//key是为了方便找到Object。类似于提供偏旁部首是为了快速找到汉字
NSString *name1 = [dict1 objectForKey:@"name"];
NSLog(@"name是%@",name1);
2.利用字典创建多个key value
NSDictionary *dict4=@{@"name":@"zb",@"age":@"23",@"height":@"1.70"};
NSLog(@"%@ %@ %@",dict4[@"name"],dict4[@"age"],dict4[@"height"]);
等价于
NSDictionary *dict2=[NSDictionary dictionaryWithObjects:@[@"zb",@"23",@"1.70"] forKeys:@[@"name",@"age",@"height"]];
NSLog(@"%@,%@,%@",[dict2 objectForKey:@"name"],[dict2 objectForKey:@"age"],[dict2 objectForKey:@"height"]);
字典应用举例
NSDictionary *dict3=@{@"Age":@"100",@"Name":@"CoderZb"};
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:dict3];
NSLog(@"修改之前的字典中的数据: %@",dictionary);
[dictionary setValue:@"18" forKey:@"Age"];
NSLog(@"修改之后的字典中的数据: %@",dictionary);
字典的遍历(三种方法)
1.普通遍历NSDictionary
NSDictionary *dict5 = @{@"name":@"zb",@"age":@"18",@"height":@"170"};
for (int i=0; i<dict5.count; ++i) {
//取出字典中所有的key放到数组中keys中
NSArray *keys=[dict5 allKeys];
//根据数组中的下标i,取出数组中相应位置的key
NSString *key=keys[i];
//根据字典中的key取出唯一与之对应的value
NSString *value=dict5[key];
//打印数组中的每个key,以及每个key对应的value
NSLog(@"key = %@,value = %@",key,value);
}
2.快速遍历NSDictionary
NSDictionary *dict = @{@"name":@"zb",@"age":@"18",@"height":@"170"};
for (NSString *key in dict) {
NSLog(@"key = %@ ,value = %@",key,dict[key]);
}
3.利用block遍历NSDictionary(迭代器的方法)
NSDictionary *dict = @{@"name":@"zb",@"age":@"18",@"height":@"170"};
[dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj,BOOL *stop){//obj换成value,输出也必须换成value
NSLog(@" key = %@, value = %@",key,obj);
}];
将字典写入到plist文件,并且读取plist文件
// 写入到plist文件
NSDictionary *dict6=@{@"name":@"zb",@"age":@"23",@"height":@"1.70"};
[dict6 writeToFile:@"/Users/zhangbin/Documents/heihei.plist" atomically:YES];
// 读取plist文件
NSDictionary *newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/zhangbin/Documents/heihei.plist"];
NSLog(@"%@",newDict);
数组NSArray
1.传送一个字符串
NSArray *arr1=[NSArray arrayWithObject:@"zb"];
NSLog(@"%@",arr1);
输出结果
20160420 17:19:02.897 NSArray基本概念[22397:1156539] (
zb
)
2.传送多个字符串 数组中的nil是结束符.所以数组中的zb5,zb6不打印
NSArray *arr2=[NSArray arrayWithObjects:@"zb",@"zb2",@"zb3",@"zb4",nil,@"zb5",@"zb6",nil];
NSLog(@"%@",arr2);
输出结果
20160420 17:19:02.898 NSArray基本概念[22397:1156539] (
zb,
zb2,
zb3,
zb4
)
3.OC中的数组NSArray可以存储不同类型的数据
Person *p=[[Person alloc]init];
NSObject *obj=[[NSObject alloc]init];
NSArray *arr3=[NSArray arrayWithObjects:p,obj,@"zb",nil];
NSLog(@"arr3=%@",arr3);
输出结果
2016-04-20 17:19:02.899 NSArray基本概念[22397:1156539] arr3=(
"<Person: 0x1004000e0>",
"<NSObject: 0x100400130>",
zb
)
5.获取数组中元素的个数
NSLog(@"count=%lu",[arr3 count]);
输出结果
20160420 17:19:02.899 NSArray基本概念[22397:1156539] count=3
6.获取数组中第零个元素
NSLog(@"数组中的第零个元素是%@",[arr3 firstObject]);
输出结果
2016-04-20 17:19:02.899 NSArray基本概念[22397:1156539] 数组中的第零个元素是<Person: 0x1004000e0>
7.获取数组中第一个元素
NSLog(@"数组中第一个元素是%@",[arr3 objectAtIndex:1]);
输出结果
2016-04-20 17:19:02.899 NSArray基本概念[22397:1156539] 数组中第一个元素是<NSObject: 0x100400130>
8.获取数组中最后一个元素
NSLog(@"数组中最后一个元素是%@",[arr3 lastObject]);
输出结果
2016-04-20 17:19:02.899 NSArray基本概念[22397:1156539] 数组中最后一个元素是zb
9.OC中的数组包含字符串的方法
NSArray *arr4=[NSArray arrayWithObjects:@"zhangbin",@"zb",@"ls",@"mz",nil];
if ([arr4 containsObject:@"zb"]) {
NSLog(@"arr4中包含zb");
}else{
NSLog(@"arr4中不包含zb");
}
输出结果
2016-04-20 17:19:02.899 NSArray基本概念[22397:1156539] arr4中包含zb
10.获取数组元素的常规写法与简写
10.1常规写法:
NSArray *arr6=@[@"zhangbin",@"zb",@"ls",@"mz"];
NSLog(@"%@",[arr6 objectAtIndex:0]);// 方法1
输出结果
20160420 17:19:02.899 NSArray基本概念[22397:1156539] zhangbin
10.2简写:
NSArray *arr6=@[@"zhangbin",@"zb",@"ls",@"mz"];
NSLog(@"%@",arr6[0]);// 方法2
输出结果
20160420 17:19:02.899 NSArray基本概念[22397:1156539] zhangbin
replaceObjectAtIndex:withObject:用法
NSMutableArray *array = @[@"ZZZ",@"BBB",@NO];
[array replaceObjectAtIndex:2 withObject:@YES];// 将下标为2的那个元素@NO替换成了@YES.
数组的遍历(四种方法)
1.第一种方法
NSArray *arr1=@[@"zhangbin",@"zb",@"ls",@"mz"];
//常规的遍历
for (int i=0; i<arr1.count;++i) {
NSLog(@"arr1[%i]=%@",i,arr1[i]);
}
输出结果
2016-04-20 16:15:51.024 NSArray遍历[21205:1111570] arr1[0]=zhangbin
2016-04-20 16:15:51.025 NSArray遍历[21205:1111570] arr1[1]=zb
2016-04-20 16:15:51.025 NSArray遍历[21205:1111570] arr1[2]=ls
2016-04-20 16:15:51.026 NSArray遍历[21205:1111570] arr1[3]=mz
2.第二种方法
NSArray *arr2=@[@"zhangbin",@"zb",@"ls",@"mz"];
//for循环增强,实现遍历 敲入forin(中间无空格),按住回车,可自动显示for in的格式
//OC的数组可以增强for循环来遍历。逐个取出arr2中的元素,将取出的元素赋值给obj2.
//注意:obj2的类型不一定是NSObject,类型是由数组中元素的类型决定的。所以obj2的类型换成NSString类型也可以。
for (NSObject *obj2 in arr2) {
NSLog(@"obj2=%@",obj2);
}
输出结果
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj2=zhangbin
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj2=zb
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj2=ls
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj2=mz
3.第三种方法
NSArray *arr3=@[@"zhangbin",@"zb",@"ls",@"mz"];
//使用OC数组的迭代器来遍历
//每取出一个元素就会调用一次block,每次调用block都会将当前取出的元素和元素对应的所以传递给我们
//obj3就是当前取出的元素,idx就是当前元素对应的索引.
//stop用于控制什么时候停止遍历
[arr3 enumerateObjectsUsingBlock:^(id obj3,NSUInteger idx,BOOL *stop){
NSLog(@"obj3=%@,idx=%lu",obj3,idx);
}];
输出结果
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj3=zhangbin,idx=0
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj3=zb,idx=1
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj3=ls,idx=2
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj3=mz,idx=3
4.第四种方法
NSArray *arr4=@[@"zhangbin",@"zb",@"ls",@"mz"];
[arr4 enumerateObjectsUsingBlock:^(id obj4,NSUInteger idx,BOOL *stop){
if (idx==1) {//索引遍历到1时,就把YES赋值给stop,即停止遍历.后面的idx==2,idx==3不再遍历了。
*stop=YES;
}
NSLog(@"obj4=%@,idx=%lu",obj4,idx);
}];
输出结果
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj4=zhangbin,idx=0
20160420 16:15:51.026 NSArray遍历[21205:1111570] obj4=zb,idx=1
数组+字典综合运用
NSArray *BookData = @[ //6个字典
@{@"icon": @"HistoryBooks", @"name": @"历史书"},
@{@"icon": @"ChineseBooks", @"name": @"语文书"},
@{@"icon": @"MathBooks", @"name": @"数学书"},
@{@"icon": @"GeographyBooks", @"name": @"地理书"},
@{@"icon": @"BiologyBooks", @"name": @"生物书"},
@{@"icon": @"ChemistryBooks", @"name": @"化学书"}
];
// 将数组中的对象(字典)写入到plist文件
[shopData writeToFile:@"/Users/zhangbin/Desktop/未命名文件夹 2/zb.plist" atomically:YES];
// 读取plist文件中的对象(字典)
NSArray *newArray=[NSArray arrayWithContentsOfFile:@"/Users/zhangbin/Desktop/未命名文件夹 2/zb.plist"];
NSLog(@"%@",newArray);
}
@end
字符串和数组的相互转化
/****************************字符串转成数组*************************************/
NSString *Str = [NSString stringWithFormat:@"My,Hobby,Is,Running"];
// 字符串转数组(以逗号分隔)
NSArray *StrToArray = [Str componentsSeparatedByString:@","];
NSLog(@"字符串转成数组: %@",StrToArray);
/*****************************数组转成字符串案例1************************************/
NSMutableArray *arrayM = [NSMutableArray arrayWithObjects:@"Coder",@"Zb",nil];
// 移除@"Coder",这样可变数组中只有@[@"Zb",nil];
[arrayM removeObject:[NSString stringWithFormat:@"Coder"]];
// 数组转成字符串(以逗号分隔).arrayM只有一个@"Zb"对象,正是因为nil的出现,才能以逗号分隔,可见nil的重要性
NSString *ArrayToStr = [arrayM componentsJoinedByString:@","];
NSLog(@"数组转成字符串案例1: %@",ArrayToStr);
/*****************************数组转成字符串案例2************************************/
NSMutableArray *ArrM = [NSMutableArray arrayWithObjects:@"Coder",@"Zb",@"Add",nil];
// 数组转成字符串(以逗号分隔)
NSString *ArrMyToStr = [ArrM componentsJoinedByString:@","];
// 注意:打印的字符串之间是有逗号的。这就是案例2的目的。
NSLog(@"数组转成字符串案例2: %@",ArrMyToStr);
集合和数组的相互转化
区别:集合比数组多了一层{ }
// 数组
NSArray *array = [NSArray arrayWithObjects:@"CoderZb",@"fuqiang",@"minzhu",nil];
NSLog(@"数组: %@",array);
// 数组转成集合
NSSet *set = [NSSet setWithArray:array];
NSLog(@"集合: %@",set);