#import <Foundation/Foundation.h>
#import "XWJPerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// NSRange是开发中一个非常常用的类,那么他的本质是什么呢?
typedef struct _NSRange{
NSUInteger location;
NSUInteger length;
}NSRange;
// 2.定义NSRange结构体变量的方式
NSRange range;
range.location = 2;
range.location = 3;
// 方式2
NSRange range2 = {2,3};
// 方式三
NSRange range3 = {.location = 2,.length = 3};
// 上面的定义是不是觉得很烦躁?麻烦吧...那么看下面的终极写法
// NSRange range4 = NSMakeRange(2, 3);
// 记得在上面两篇写过一些NSString常用的方法,在这还得花点笔墨来谈谈..
// 字符串的截取,非常重要
NSString *xwj = @"道可道,非常道,名可名,非常名.无名天下之始,无名天下之母";
// 从指定的下标开始一直截取到最后一个字符串(包括标点符号也算一个下标);
NSString *xwj1 = [xwj substringFromIndex:2];
// 从头开始截取到指定个数的文字
NSString *xwj2 = [xwj substringToIndex:3];
// 截取从指定范围的文字,从下标2开始截取3个
NSString *xwj3 = [xwj substringWithRange:NSMakeRange(2, 3)];
// 在接着替换字符串
NSString *xwj4 = @"爱她就要呵护她,就要包容她";
// 把指定的字符 替换成""也就是什么都没有
[xwj4 stringByReplacingOccurrencesOfString:@"荣她" withString:@""];
NSLog(@"%@",xwj4);
// 把首尾两端的空格去掉.
NSString *xwj5 = @" 爱无 止境 ";
// NSString *xwj5 = [xwj5 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// 各位看官,是不是颠覆了你们的认知?
// 这个只会报一个警告是因为,OC是一门弱语法的语言,任意指针指向任意对象
// NSMutableArray *Mxwj = [NSMutableArray string];
// Mxwj = @"我最帅";
// [Mxwj addObject:@"我爱你"];// 奇葩了,这样居然也不报错. 原因是因为编译检查,编译器认为Mxwj是NSMutableString类型的,而这个类型有appendString这个方法.
// 运行的崩溃的原因:运行检查,检查的是Mxwj这个指针是指向的真实类型是NSString 而NSString没有这个方法所以报错
/*~~~~~~~~~~~~~NSMutableString和NSString相比之下最大的优势~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// NSMutableString创建的对象是可变的,当需要反复拼接/修改的时候,每次操作都在当前对象上进行的,不需要从新向内存申请空间来存储,这样效率更高.
// 前面有总结,现在来复习一下NSArray的使用以及常用的知识点
// 创建并且初始化一个对象
// XWJPerson *xwj1 = [[XWJPerson alloc]init];
// XWJPerson *xwj2 = [[XWJPerson alloc]init];
// XWJPerson *xwj3 = [[XWJPerson alloc]init];
XWJPerson *xwj01 = [[XWJPerson alloc]init];
XWJPerson *xwj02 = [[XWJPerson alloc]init];
XWJPerson *xwj03 = [[XWJPerson alloc]init];
// 创建一个数组来 把对象存到数组里面去 后面添加niu以为这存储结束.如果在中途增加nil的话,编译器会把nil NULL看成是基本数据类型0,而数组是无法存储非OC对象的.这点需小心.
NSArray *xwjArray = [NSArray arrayWithObjects:xwj01,xwj02,xwj03,@"你最帅", nil];
NSLog(@"%@",xwjArray); // 可以使用%@来打印数组因为,数组里面存储的是OC对象
// 如果数组里面包含了中文,会打印出unicode编码.
// 这时候我们可以用一个第三方编写的分类来实现中文的效果.
// 然而如果对象自定义重写description方法的话.如果方法中包含中文,单独打印数组中的元素可以打印出中文.
[xwjArray objectAtIndex:1]; // 根据下标来找出元素
// 判断数组内是否包含某一个对象
// - (BOOL)containsObject:(ObjectType)anObject;
BOOL result = [xwjArray componentsJoinedByString:@"你最帅"];
switch (result) {
case 0: // 由于BOOL值只返回两个结果,要么0要么非0
NSLog(@"没有!");
break;
default:
NSLog(@"没有");
break;
}
[xwjArray lastObject]; // 获取数组中最后一个元素
[xwjArray objectAtIndex:xwjArray.count-1];// 这样也能获取不安全.
[xwjArray firstObject];// 回去数组元素中第一个元素
[xwjArray objectAtIndex:0];// 如果下标更改过很可能取到的值不是我们想要的
// 好了谈了这么多,该说下,如何遍历数组中的元素了
for(int i = 0; i < xwjArray.count; i++)
{ // 这个是我们最熟悉的普通遍历法
NSLog(@"%@",xwjArray[i]);
}
// 增加for循环
for(id obj in xwjArray)
{
NSLog(@"%@",obj); // 为什么非要用ID呢?因为数组可以存储任何OC对象,用ID不是更加安全吗?
}
// 利用Block来遍历系统自带的方法
[xwjArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@",obj);
// obj是对象,idx是下标 stop是停止条件.
// 下一张的篇幅我准备重点给大伙分析分析Block 不喜勿喷..
}];
// 现在来谈下总结吧:NSMutableArray是NSArray的子类,NSArray拥有的所有方法.NSMutableArray,而且还拥有扩展的属性和方法
// NSArray是不可变数组,所以NSArray创建的对象内部存储的元素不能进行增/删/改/但是NSMutableArray可以
NSMutableArray *xwj1Array = [NSMutableArray arrayWithObjects:@"xie",@"wen",@"jian", nil];
[xwj1Array addObject:@"iloveyou"]; // 新增
[xwj1Array objectAtIndex:0];// 取出第零个下标
[xwj1Array removeObjectAtIndex:1]; // 根据下标删除
// 用数组存储对象的缺点
// NSArray/NSMutableArray存储元素.如果需要存/取对象,都需要依赖下标
// 当数组内元素有变动的时候,之前通过下标缺点的一个元素,现在就确定了.
NSMutableArray *xwj2Array = [NSMutableArray arrayWithObjects:@"明",@"天",@"会",@"更",@"好", nil];
[xwj2Array removeObject:0]; // 删除第零个
[xwj2Array addObject:0]; // 取到零个.
// 这时候下标已经发生变化了.
}
return 0;
}