一、NSArray /NSMutableArray
1、NSArray :不可变数组
(1)NSArray的创建
NSArray *array = [NSArray array]; // 永远是空数组
NSArray *array2 = [NSArray arrayWithObject:@"jack"]; // 只有一个元素
//其中nil是数组元素结束的标记
NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", @"4324324", nil];
// 快速创建一个NSArray对象
NSArray *array4 = @[@"jack", @"rose", @"4324324"];
(2)NSArray的元素个数
[array2 count]
array3.count
(3)NSArray中元素的访问
NSLog(@"%@", [array3 objectAtIndex:1]);
NSLog(@"%@", array3[0]);
2、NSMutableArray : 可变数组
(1)NSMutableArray创建
NSMutableArray *array = [NSMutableArray array];
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
(2)添加元素
[array addObject:[[Person alloc] init]]; // 添加了对象
[array addObject:@"jack"]; // 添加了字符串
(3)删除元素
[array removeAllObjects]; // 删除所以对象
[array removeLastObject ]; // 删除最后一个对象
[array removeObject:@"jack"]; // 删除指定的对象
[array removeObjectAtIndex:0]; // 删除指定位置的对象
(4)注意事项
- OC数组不能存放nil值
- OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等
- @[] 只创建不可变数组NSArray
错误示例:
[array addObject:nil];
NSMutableArray *array = @[@"jack", @"rose"];
3、遍历数组
方法一:
<span style="white-space:pre"> </span>for (int i = 0; i<array.count; i++)
{
NSLog(@"%@", array[i]);
}
方法二:
<span style="white-space:pre"> </span>for (id obj in array)
{
NSLog(@"%@", obj);
}
id obj代表着数组中的每一个元素,这种方法不知道是第几次输出
方法三:
因为方法二不知道是第几次输出,所以可以定义变量i,作i++;也可做如下改进
<span style="white-space:pre"> </span>int i = 0;
for (id obj in array)
{
// 找出obj元素在数组中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%ld - %@", i, obj);
}
可以再循环内写if语句判断条件,用break终止循环
方法四:
[array enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 1)
{
// 停止遍历
*stop = YES;
}
}];
- 每遍历到一个元素,就会调用一次block
- 当前元素和索引位置当做参数传给block
- *stop用来结束循环
二、NSSet/ NSMutableSet
1、NSSet
(1)、NSSet创建
NSSet *s = [NSSet set];
NSSet *s2 = [NSSet setWithObject:@"jack"]; // 只有一个元素
NSSet *s3 = [NSSet setWithObjects:@"jack",@"rose", @"ming",@"jcke",nil];
(2)元素个数
NSLog(@"%ld", s2.count);
(3)NSSet中元素访问
NSString *str = [s3 anyObject]; // 随机拿出一个元素
2、NSMutableSet
(1)创建
NSMutableSet *s = [NSMutableSet set];
(2)添加元素
[s addObject:@"haha"];
(3)删除元素
[s3 removeObject: @"jack"];
[s3 removeAllObjects]
3、NSSet和NSArray的对比
(1) 共同点
都是集合,都能存放多个OC对象
只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
本身都不可变,都有一个可变的子类
(2)不同点
NSArray有顺序,NSSet没有顺序
三、NSDictionary/ NSMutableDictionary
1、NSDictionary
(1)NSDictionary创建
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"北京", @"address",
@"12345 ", @"qq", nil];
// 快速创建
NSDictionary *dict4 = @{@"name" : @"jack", @"address" : @"北京"};
(2)返回的是键值对的个数
NSLog(@"%ld", dict.count);
(3)元素访问
id obj = [dict objectForKey:@"name"];
id obj = dict[@"name"];
- 里面存储的东西都是键值对
- 字典不允许有相同的key,但允许有相同的value(Object)
- 字典是无序的
2、NSMutableDictionary
(1)NSMutableDictionary创建
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
(2)添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
[dict setObject:@"rose" forKey:@"name"]; // 再次赋值,会覆盖上次的值
(3)移除键值对
[dict removeObjectForKey:(id)];
(4)打印字典
NSLog(@"%@", dict);
会输出键值对,格式为:key = value
3、字典遍历
方法一:
NSArray *keys = [dict allKeys];
for (int i = 0; i<dict.count; i++)
{
NSString *key = keys[i];
NSString *object = dict[key];
}
方法二:
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
NSLog(@"%@ - %@", key, obj);
}];
同数组一样,可以利用*stop和if控制输出次数
四、NSNumber和NSValue
只有将基本数据类型进行包装才能存进集合类中
1、NSNumber
(1)将各种基本数据类型包装成NSNumber对象
NSNumber *num = [NSNumber numberWithInt:10];
NSNumber *n = [NSNumber numberWithDouble:10.5];
类似也有其他类型
也可以再转换为基本数据类型
int a = [num2 intValue];
double b = [n doubleValue];
(2)快速包装
@20 将 20包装成一个NSNumber对像
@10.5;
@YES;
@'A'; // NSNumber对象
注:@"A"是NSString对象
(3)将变量包装成NSNumber对象
[NSNumber numberWithInt:age];
或
int age = 100;
@(age); // 注意()
2、NSValue
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue
(1)将结构体转为Value对象
CGPoint p = CGPointMake(10, 10);
NSValue *value = [NSValue valueWithPoint:p];
(2)将value转为对应的结构体
[value pointValue];
NSArray *array = @[value ];
五、NSDate
(1)创建
//创建了一个时间对象,并代表执行该行代码时间(0时区的时间)
NSDate *date = [NSDate date];
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
// 从1970开始走过的秒数
NSTimeInterval seconds = [date2 timeIntervalSince1970];
[date2 timeIntervalSinceNow];
(2)转换为字符串
// 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// y 年 M 月 d 日
// m 分 s 秒 H (24)时 h(12)时
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 转换为字符串
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@", str);