容器类中只能存储对象,而在OC中属于容器类的有:数组、字典、集合
数组(数组是有序的、只能存储对象,但对象类型不限,可以是任意类型的对象。数组分为可变数组和不可变数组)
#不可变数组 (数组的元素不可改变)
创建不可变数组,以多个对象初始化不可变数组,多个对象之间用逗号隔开,以空对象结束
nil 《===》空对象 (相当于数组中的\0,代表结束,如果中间写nil数组后面的元素就不会显示)
//(初始化方法)
NSArray *initArray = [[NSArray alloc]initWithObjects:@"student",@"teacher",@"worker",nil];
NSLog(@"initArray = %@",initArray);
//不可变数组的遍历构造器方法
NSArray *initArray2 = [NSArray arrayWithObjects:@"xiaohua",@"xiaoming",@"xiaohong",nil];
NSLog(@"initArray2 = %@",initArray2);
//以一个数组,初始化一个新的数组,输出的内容是一样的(初始化)
NSArray *initArray3 = [[NSArray alloc]initWithArray:initArray2];
NSLog(@"initArray3 = %@",initArray3);
//字面量(初始化)
NSArray *initArray4 = @[@"tangseng",@"wukong",@"bajie"];
NSLog(@"initArray4 = %@",initArray4);
//功能方法
//获取元素个数
NSInteger count = [initArray4 count];
NSLog(@"count = %ld",count); //输出结果为3 ,因为上面定义initArray的元素个数为3个
//获取指定元素
NSString *str = [initArray4 objectAtIndex:1];
NSLog(@"str = %@",str); //输出结果为wukong因为上面定义的第二个元素为wukong,1代表第二个元素
//字面量 (利用数组的下标获取)
NSLog(@"2 = %@",initArray4[2]); //输出为bajie
//是否包含某个元素
BOOL flag = [initArray4 containsObject:@"shaseng"];
NSLog(@"flag = %d",flag); //输出结果为0,因为上面定义的元素里没有shaseng
//创建一个数组对象,遍历数组中所有元素
NSArray *testArray = @[@"wukong",@18,@"M",@170]; //("M"是合法的)
for (int i =0; i < testArray.count; i++) {
//id是万能指针,这里不需要加*,他可以接受任意类型的对象,使用id叫做多态,数组中经常会使用
id object = [testArray objectAtIndex:i];
NSLog(@"object = %@",object);
}
#可变数组(数组的元素可以改变)
//创建一个空的可变数组,并预留2个元素的空间
NSMutableArray *mInitArray =[[NSMutableArray alloc]initWithCapacity:2];
NSMutableArray *mInitArray1 = [@[@"校长",@"教授",@"老师"]mutableCopy];
NSLog(@"mInitArray1 = %@",mInitArray1); //输出的会是\U开头的加数字("\U6821\U957f"),不是乱码,所以最好数字里面写英文
//功能方法
//增
//添加元素
[mInitArray1 addObject:@"专家"];
NSLog(@"mInitArray1 = %@",mInitArray1);
NSMutableArray *mInitArray2 = [@[@"tangseng",@"wukong",@"bajie",@"shaseng"]mutableCopy];
NSLog(@"mInitArray2 = %@",mInitArray2);
//插入元素
//在指定下标处插入对象
[mInitArray2 insertObject:@"bailongma" atIndex:1];
NSLog(@"mInitArray = %@",mInitArray2);
//改
//交换 (根据下标来交换,不能根据对象,因为一个数组中可能有很多一样的对象)
//交换两个指定下标对应的对象 (在同一个数组内进行交换)
//count-1是代表下标-1
[mInitArray2 exchangeObjectAtIndex:0 withObjectAtIndex:mInitArray2.count-1];
NSLog(@"交换后:%@",mInitArray2);
//替换
//利用新对象替换指定下标处的对象 (数组以外的新对象替换数组以内的对象)
[mInitArray2 replaceObjectAtIndex:3 withObject:@"baigujing"];
NSLog(@"替换后的:%@",mInitArray2);
//删除
//删除指定对象
//注意:删除数组中所有指定对象(数组中包括的所有“baigujing”都会被删除)
// [mInitArray2 insertObject:@"baigujing" atIndex:0];
// NSLog(@" mInitArray2 = %@",mInitArray2);
[mInitArray2 removeObject:@"baigujing"];
NSLog(@"删除后:%@",mInitArray2);
//删除最后一个对象
[mInitArray2 removeLastObject];
NSLog(@"删除最后一个对象后:%@",mInitArray2);
//删除指定下标处的对象
[mInitArray2 removeObjectAtIndex:1];
NSLog(@"mInitArray2 = %@",mInitArray2);
//删除所有的对象 (删除对象后输出数组里的括号还是有的)
[mInitArray2 removeAllObjects];
NSLog(@"删除所有对象后:%@",mInitArray2);
//分割 (返回时是一个不可变的字符串)
NSString *str = @"www.lanou3g.com";
//按照指定的字符串,将原有字符串进行分割
//分割后的结果存在数组中
NSArray *resultArray = [str componentsSeparatedByString:@"."];
NSLog(@"分割后的结果为:%@",resultArray);
//拼接(返回时是一个不可变的字符串)
//将数组中的所有元素拼接,各元素之间用指定字符串隔开
//结果保存在新的字符串中
NSString *resultStr = [testArray componentsJoinedByString:@"--"];
NSLog(@"拼接后的结果为:%@",resultStr);
#字典 (字典也分为可变字典和不可变字典)
不可变字典
//创建对象
//以多个健值对(条目)创建一个新的字典
//键值对不能落单,且以nil结束
//每一对条目中,值在前,键在后(输出后键——值方式,且是以大括号括起来)
NSDictionary *initDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"sunwukong",@"name",@18,@"age",@"F",@"sex", nil];
NSLog(@"initDict = %@",initDict);
//字面量
//多个键值对之间用逗号隔开
//键与值之间用冒号隔开 键在前 ,值在后
NSDictionary *initDict2 = @{@"name":@"xiaowang",@"age":@10,@"sex":@"M"};
NSLog(@"initDict2 = %@",initDict2);
//功能方法
//获取条目个数
NSInteger count = [initDict2 count];
NSLog(@"count = %ld",count);
//字典中只能通过键去获取对应的值
//字典中键必须是唯一的
//获取所有的键-key
NSArray *allKay = [initDict2 allKeys];
NSLog(@"allKay = %@",allKay);
//获取所有的值-value
NSArray *allValue = [initDict2 allValues];
NSLog(@"allValue= %@",allValue);
//通过key获取对应的value
NSString *name = [initDict2 objectForKey:@"name"];
NSLog(@"name =%@",name);
//字面量
NSLog(@"%@",initDict2[@"age"]);
//创建一个字典
//遍历字典中的条目
NSDictionary *testDict = @{@"name":@"wukong",@"age":@1000,@"sex":@"M"};
//获取所有Key值 testKey
NSArray *testKay =[testDict allKeys];
//通过Key访问Value
for (int i =0; i<testKay.count; i++) {
id key = testKay[i];
id value= [testDict objectForKey:key];
NSLog(@"object = %@",value);
}
可变字典
//创建一个空的可变字典,预留两个条目的空间
NSMutableDictionary *mInitDict = [[NSMutableDictionary alloc]initWithCapacity:2];
//创建一个空的可变字典
NSMutableDictionary *mInitDict1 =[[NSMutableDictionary alloc]init];
//字面量
NSMutableDictionary*mInitDict2=[@{@"name":@"sunwukong",@"age":@18,@"sex":@"F"}mutableCopy];
NSLog(@"mInitDict2 = %@",mInitDict2);
//功能方法
//添加条目
//前面是值(value),后面是键(key)
//注意:值和键不能为nil
[mInitDict2 setObject:@0.01 forKey:@"salary"];
NSLog(@"添加后: = %@",mInitDict2);
//修改方法
[mInitDict2 setObject:@0.1 forKey:@"salary"];
NSLog(@"修改后: =%@",mInitDict2);
//当字典中。没有对应的key值时,将会添加相应的键值对
//如果有对应的key值,则对key对应的value进行修改
//字典中无法修改key值
//字面量的添加和修改
//当key值存在,则修改
//当key不存在,则添加
mInitDict2[@"height"] = @167;
NSLog(@"字面量添加后:%@",mInitDict2);
mInitDict2[@"height"]=@666;
NSLog(@"字面量修改后:%@",mInitDict2);
//不是字典类的方法,但是可以对字典操作
//和setObject:forKey的功能相似
//值可以为nil,删除key值对应的条目
[mInitDict2 setValue:@64 forKey:@"weight"];
NSLog(@"添加后:%@",mInitDict2);
[mInitDict2 setValue:nil forKey:@"weight"];
NSLog(@"设置nil:%@",mInitDict2);
//删除
//删除key值对应的条目
[mInitDict2 removeObjectForKey:@"height"];
NSLog(@"删除后 = %@",mInitDict2);
//删除所有条目
[mInitDict2 removeAllObjects];
NSLog(@"删除所有后:%@",mInitDict2);
#集合(集合也分为可变集合和不可变集合)
集合具有互斥性、无序性,集合中不可有相同的对象,对象之间没有顺序,可变集合和不可变集合里面是元素的可变与不可变
不可变集合
//创建对象
//用多个对象来创建集合
//注意:当有多个相同对象时,只添加一个
NSSet *initSet =[[NSSet alloc]initWithObjects:@"teacher",@"student",@"worker", nil];
NSLog(@"initStr = %@",initSet);
NSSet *initStr1 = [NSSet setWithObjects:@"Teacher",@"Student",nil];
NSLog(@"initSet1 = %@",initStr1);
//获取元素个数功能方法
NSInteger count = [initStr1 count];
NSLog(@"count = %ld",count);
//获取任意元素
//没有任何规律,不是随机
NSString *str =[initStr1 anyObject];
NSLog(@"str = %@",str);
//是否包含
BOOL flag = [initStr1 containsObject:@"Person"];
NSLog(@"flag =%d",flag);
//获取所有元素
NSArray *array = [initStr1 allObjects];
NSLog(@"array = %@",array);
可变集合
NSMutableSet *mInitSet = [[NSMutableSet alloc]initWithCapacity:2];
//添加 (再次添加后输出时还是只有一个,但是不会报错)
[mInitSet addObject:@"xiaohong"];
NSLog(@"mInitSet = %@",mInitSet);
//重复添加是无效的,但是不会报错
[mInitSet addObject:@"xiaohuang"];
NSLog(@"mInitSet = %@",mInitSet);
//删除
[mInitSet removeObject:@"xiaohong"];
NSLog(@"mInitSet = %@",mInitSet);
//删除所有
[mInitSet removeAllObjects];
NSLog(@"mInitSet = %@",mInitSet);