数组和类别
【说明】
OC中使用两种数组,使用C的数组存放基本数据类型的数据或地址;
使用OC的数组存放OC的对象地址。
一、不可变数组(NSArray)
1、创建
NSArray *ary1 = [[NSArray alloc]
initWithObjects:@"one",@"two",@"three",nil];
NSArray *ary2 = [NSArray
arrayWithObjects:@"123",@"456",@"789",nil];
NSArray *ary3 = [[NSArray alloc] initWithArray:ary1];
NSArray *ary4 = [NSArray arrayWithArray:ary2];
//结尾不需要nil
NSArray *ary5 = @[@"abc",@"def",@"hij"];
2、字符串分割
//按照指定的字符串进行切割
NSArray *ary = [str componentsSeparatedByString:@"an"];
//按照指定的字符集合
NSCharacterSet *charSet = [NSCharacterSet
characterSetWithCharactersInString:@"oa"];
NSArray *ary2 = [str
componentsSeparatedByCharactersInSet:charSet];
3、字符串的拼接
//按照指定的字符串进行拼接
NSString *str2 = [ary componentsJoinedByString:@"*"];
4、获取元素个数
NSUInteger count = [ary count];
5、获取单个元素
//返回指定的元素
id obj = [ary objectAtIndex:1];
NSLog(@"%@", ary[0]);
6、数组的遍历
//遍历数组
for (int i=0; i<[ary count]; i++) {
NSLog(@"%@", ary[i]);
}
//快速遍历
for (id obj in ary) {
//obj每次循环指向数组中的一个元素,依次向后
NSLog(@"%@",obj);
}
说明:
1、在for-in中,break和continue同样可以使用
2、在遍历过程中,不能修改数组
7、获取指定对象的索引
//查看对象在数组中的索引,找不到返回NSNotFound
NSUInteger index = [ary indexOfObject:@"too"];
8、判断是否包含指定对象
BOOL ret = [ary containsObject:@"too"];
二、可变数组(NSMutableArray)
1、设置(set)
[mAry setArray:@[@"one",@"two",@"three"]];
2、增加(add)
[mAry addObject:@"four"];
[mAry addObjectsFromArray:@[@"250",@"3"]];
3、插入(insert)
//在指定位置插入元素
[mAry insertObject:@"2" atIndex:2];
4、删除(remove)
//删除最后一个元素
[mAry removeLastObject];
//删除指定元素
[mAry removeObject:@"250"];
//删除指定位置的元素
[mAry removeObjectAtIndex:2];
//删除指定范围内的指定元素
[mAry removeObject:@"250" inRange:NSMakeRange(3, 3)];
//删除指定范围内的所有元素
[mAry removeObjectsInRange:NSMakeRange(2, 3)];
//删除某个数组指定的元素
[mAry removeObjectsInArray:@[@"250",@"2"]];
//删除所有元素
[mAry removeAllObjects];
5、替换(replace)
[mAry replaceObjectAtIndex:0 withObject:@"one"];
6、交换(exchange)
[mAry exchangeObjectAtIndex:0 withObjectAtIndex:2];
三、类别(Category)
【认识类别】
给某个类打补丁的一个工具,也可分类管理成员方法
@interface NSString (Print)
- (void)print;
@end
@implementation NSString (Print)
- (void)print
{
NSLog(@"%@", self);
}
@end
【使用说明】
1、只能添加成员方法,不能添加成员变量,可以使用原类的成员变量
2、给某个类添加一个类别相当于直接添加到原类中,
但是并不会修改原类,其子类也可使用类别中的方法
3、如只需在一个源文件中使用类别,可以将类别的接口
和实现放在同一文件(当前源文件)中
4、形如(3)的情况,可以省略类别的接口部分
【匿名类别】—— 类别的仕途不顺的远亲
形式上省略名字的类别,也叫扩展,但是其作用于类别完全不同
【作用】
1、成员方法的相互调用,以前只能下调上
==> 编译器已经支持相互调用
2、添加不公开的成员变量
==> 可以放在实现部分的最上面
3、声明不公开的成员方法
==> 方法只需实现不声明即可
四、零碎知识
【类(Class)】
说明:
1、Class是一种数据类型
2、Class类型的变量用于存放类的类型
使用:
1、创建Class类型的变量
//创建Class类型的变量(编译时)
Class cls = [NSString class];
//动态的创建(运行时)
Class cls2 = NSClassFromString(@"NSString");
2、可以创建特定类型的对象
NSString *str = [cls stringWithString:@"hello"];
3、可以判断某个对象是否属于某个类
【description方法】
%@可以打印对象,其实打印的是description方法的返回;
若不实现,默认打印对象的【类名+地址】
【数字类(NSNumber)】
1、创建
NSNumber *num1 = [[NSNumber alloc] initWithInt:250];
NSNumber *num2 = [NSNumber numberWithFloat:3.14];
2、转化为数值
int value = [newNum intValue];
3、转化为字符串
NSString *str = [num2 stringValue];
4、判断数字对象是否相等
BOOL ret = [num1 isEqualToNumber:num2];
5、比较数字对象的大小关系
NSComparisonResult ret2 = [num1 compare:num2];
练习题:
1、创建一个数组,元素是@“One”,@“Two”,@“Three”,
使用多种方法遍历打印数组的元素。
2、创建一个数组,元素是5个Dog类的对象地址,遍历数组,
使每个元素执行bark函数。
3、创建一个数组,元素是两个字符串对象地址和三个Dog类的对象地址,
遍历数组;如果是字符串那么输出"I am a string!"
如果是 Dog 类的对象那么执行 bark 方法。
4、设计⼀个学生类,成员有姓名,年龄,学号,成绩。 要求,以上述
每⼀成员,分别进行排序(学号按升序,成绩按降序,年龄升序,
名字降序)。
5、将一个字符串 @"我 爱 总 复 习" 按单词逆序,
已知字符串中单词只通过空格分隔
- (void)reverseWordsInString:(NSMutableString *)str;
6、有两个字符串@"This is a boy";@"really fucking bad";
将这两个字符串单词,交叠,形成新的字符串
@"This really is fucking a bad boy"。