OC学习之旅------第十一天

NSArry的基本概念

OC学习之旅------第十一天_第1张图片
OC学习之旅------第十一天_第2张图片

创建一个OC的数组
#import 
int main(int argc,const char * argv[]) 
{
     
	//NSArray *arr = [ [NSArray alloc] init] ; 不会这样写,因为OC中的数组一旦创建好就是不可变的,所以创建这样的数组没有任何意义
	NSArray *arr = [NSArray arrayWith0bject:@"lnj"];  //它会自动根据你传入的参数判断数组中中应该放什么数据类型
	//OC中的数组打印出来的话是以"("")"圆括号包起来的
	//数组中的nil是结束符,要是提前出现nil打印的时候会提前结束
	NSArray *arr = [NSArray arrayWithobjects:@"lnj", @"Lmj" ,@"jjj", @"cp",nil] ;
	return 0;
}

虽然只能存 放OC对象,但是我们可以把其他类型的对象先转换成OC对象再进行存储

	Person *p = [Person new];
	NSObject *obj = [NSObject new] ;
	NSArray *arr = [NSArray arrayWithobjects:p, obj, @"Inj", nil];  //一个数组存放了三种不同的类型,但是都是OC的对象
	NSLog(@"arr = %@", arr);  //尝试打印上面的数组
	NSLog(@"count = %lu", [arr count]);   //打印数组元素个数
	NSLog(@"last = %@"[arr last0bject]);   //打印数组最后一个元素
	NSLog(@"first = %@"[arr firstObject]);  //打印数组第一个元素
	NSLog(@"arr[1] = %@"[arr objectAtIndex:1]);  //打印数组任意位置,根据索引打印

	NSArray *arr = [NSArray arrayWithobjects:@"lnj", @"Lmj", @"jjj", @"zs",nil];
	if([arr contains0bject:@"zs"])   //判断数组中是否包含某个元素,返回bool
	{
     
		NSLog(@"arr中包含zs");
	}else
	{
     
		NSLog(@"arr中不包含zs");
	}


	//创建数组简写
	NSString *str = @"Lnj"; 
	//NSArray *arr = [NSArray arrayWithobjects:@"lnj", @"lmj", @"jjj",nil];
	NSArray *arr = @[@"Inj", @"lmj", @"jj"];
	//获取数组元素的简写
	//NSLog(@"%@",[arr objectAtIndex:0]);
	NSLog(@"%@", arr[0]);

NSArray遍历

#import 
int main(int argc, const char * argv[]) 
{
     
	NSArray *arr = @[@"lnj", @"Lmj", @"jjj"];

	//常规遍历
	for (int i = 0; i < arr.count; ++i) 
	{
     
		NSLog(@"arr[%i] = %@", i, arr[i]);
	}
	//如果是0C数组可以使用0C中的增强for循环来遍历
	//逐个取出arr中的元素,将取出的元素赋值给obj
	//注意: obj的类型可以根据数组中元素的类型来写,不一定要写NSObject
	//for (NSObject *obj in arr) {
     
	for (NSString *obj in arr) 
	{
     
		NSLog(@"obj = %@", obj);
	}


	//使用0C数组的迭代器来遍历
	//每取出一个元素就会调用一次block
	//每次调用block都会将当前取出的元素和元素对应的索引传递给我们
	// obj就是当前取出的元素,idx就是 当前元素对应的索引
	// stop用于控制什么时候停止遍历,可以不使用,如果不使用,循环就一直到数组结束
	[arr enumerate0bjecitsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
     
		if(idx == 1)
		{
     
			*stop = YES;
		}
		NSLog(@"obj = %@,idx = %Lu", obj, idx);
	}];
	return 0;

NSArry中的所有对象都调用一个方法

	Person *p1 = [Person new] ;
	Person *p2 = [Person new] ;
	Person *p3 = [Person new] ;
	Person *p4 = [Person new] ;
	NSArray *arr = @[p1, p2, p3, p4, @"lnj"];
	/*
	[arr enumerate0bj ectsUs ingBlock: ^(Person *obj, NSUInteger idx, BOOL * stop) {
		[obj say];
	}];
	*/
	//如果使用0C数组存储对象,可以调用0C数组的方法让数组中所有的元素都执行指定的方法
	//注意点:如果数组中保存的不是相同类型的数据,并且没有相同的方法,那么会报错
	[arr make0bjectsPerformSelector :@selector(say)] ; //一行代码实现上面的for循环,这个方法给数组中的每个对象都发送消息,让他们调用say方法

	假如是集体调用一个有参数的方法,就像下面这样
	// withobject: 需要传递给调用方法的参数
	[arr makeObjectsPerformSelector :@selector(sayWithName:)withobject:@"Lnj"];


	SEL参数:
	@selector(functionName:)
	如果函数是没有参数的,那就是不要带冒号,@selector(functionName)
	用于传入函数名作为参数。

数组排序

OC里面只要哪个方法的参数没有带*,那么就是枚举的参数。

#import 
#import "Person. h"
int main(int argc, const char * argv[]) 
{
     
	NSArray *arr = @[@10, @20, @5, @7, @15];
	NSLog (@"排序前: %@", arr);
	//注意:想使用compare方法对数组中的元素进行排序,那么数组中的元素必须是Foundation框架中的对象,也就是说不能是自定义对象。默认是升序
	NSArray *newArr = [arr sortedArrayUsingSelector : @selector(compare:)]; 
	NSLog (@"排序后: %@",newArr);




	Person *p1 = [Person new] ;
	p1.age = 10;
	Person *p2 = [Person new] ;
	p2.age = 20;
	Person *p3 = [Person new] ;
	p3.age = 5;
	Person *p4 = [Person new] ;
	p4.age = 7;
	NSArray *arr = @[p1, p2, p3, p4];
	NSLog (@"排序前: %@", arr);
	//按照人的年龄进行排序
	//不能使用compare:方法对自定义对象进行排序
	//NSArray *newArr = [arr sortedArrayUsingSelector :@selector(compare:)];
	NSArray *newArr = [arr sortedArrayWithOptions :NSSortStable usingComparator: ^NSComparisonResult(Person *0bj1, Person *0bj2) {
     
		//每次调用该block都会取出数组中的两个元素给我们
		//NSLog(@"obj1 = %@,obj2 = %@", obj1, obj2);
		return obj1.age > obj2.age;   //自己在函数内部对我们自定义类型的参数进行判断方式的定义
		//这里和C++里面的适配器有点像
	}];
	NSLog(@"排序后: %@", newArr);
	return 0 :
}

NSString和NSArray的相互转化

	NSArray *arr = @[@"lnj", @"Lmj", @"jj"];						

	//将数组中的字符串用**连接成一个完整的字符串
	NSString *str = [arr componentsJoinedByString:@"**"];
	NSLog(@"str = %@", str);

	//通过一个字符串生成一个数组
	//字符串切割
	NSString *str = @"Lnj**lmj**jj";
	NSArray *air = [str componentsSeparatedByString :@"**"] ;  //将字符串以**为代表,分割成数组里面的元素
	NSLog(@"arr = %@", arr);

NSArray文件读写

#import 
int main(int argc,const char * argv[]) 
{
     
	NSArray *arr = @[@"lnj", @"Lmj", @"jjj"];
	// 1.将数组写入到文件中
	//其实如果将一个数组写入到文件中之后,本质是写入了一个XML文件
	//在i0S开发中一般情况下我们会将XML文件的扩展名保存为plist
	BOOL flag = [arr writeToFile:@"/Users/ xiaomage/Desktop/abc. plist" atomically:YES];
	NSLog(@"flag = %i", flag);
//注意:writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象,如果保存的是自定义对象那么不能写入



	// 2.从文件中读取一个数组
	NSArray *newArray = [NSArray arrayWithContents0fFile:@"/Users/xiaomage/Desktop/abc. plist"];
	NSLog (@"%@", newArray) ;




	return 0;
}

当拓展名是.plist时的文件,打开就是这个样子
OC学习之旅------第十一天_第3张图片

NSMutableArray基本概念:

OC学习之旅------第十一天_第4张图片

#import 
int main(int argc, const char * argv[]) 
{
     
	//创建一个空得数组
	NSMutableArray *arrM = [NSMutableArray array] ;
	NSLog (@"%@",arrM);
	//如何添加
	[arrM add0bject:@"lnj"];
	//将指定数组中的元素都取出来,放到arrM中
	//并不是将整个数组作为一个元素添加到arrM中
	[arrM addobjectsFromArray:@[@"lmj", @"jj"]];
	//注意:以下是将整个数组作为一个元素添加
	//[arrM add0bject:@[@"Lmj", @"jj"l];
	NSLog (@"%@", arrM) ;
	

	//如何插入
	[arrM insert0bject:@"xcq" atIndex:1];
	NSLog(@"%@",arrM);
	NSRange range = NSMakeRange(2, 2);
	NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange: range];
	//插入- -组数据,指定数组需要插入的位置,和插入多少个
	[arrM insert0bjects:@[@"A", @"B"] atIndexes:set] ;
	NSLog(@"%@",arrM) ;

	//如何删除
	[arrM remove0bjectAtIndex:0];
	NSLog(@"%@",arrM) ;
	[arrM removeLast0bject];
	NSLog(@"%@",arrM);
	[arrM remove0bject:@"A"];
	NSLog(@"%@",arrM);

	//如何替换
	[arrM replace0bj ectAtIndex:1 withobject:@"M"];
	NSLog (@"%@", arrM);
	arrM[0] = @"ZS";
	NSLog(@"%@", arrM);


	//如何获取
	NSLog (@"%@", [arrM objectAtIndex:0]);
	NSLog(@"%@", arrM[0] );
	

//注意:不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
//如果把一个不可变数组当做一个可变数组来使用,会引发一个运行时的错误
NSMutableArray *arrM = @[@"Lnj", @"Lmj"]; //此时右边创建的时一个不可变的,而你左边再用可变的接收
	return 0;
}

NSDictionary

OC学习之旅------第十一天_第5张图片

#import 
int main(int argc, const char * argv[])
{
     
	// 1.如何创建
	NSDictionary *dict = [NSDictionary dict ionaryWithobject:@"lnj" forKey:@"name"];
	NSString *name = [dict objectForKey :@"name"];
	NSLog(@"name = %@", name);
	//注意: key和value 是一对应
	NSDictionary *dict = [NSDictionary dictionaryWithobjects:@[@"lnj", @"30", @"1.75"] forKeys:@ [@"name", @"age", @"height"]]; .
	NSLog(@"%@ %@ %@"[dict objectForKey:@"name"], [dict objectForKey:@"age*"], [dict objectForKey:@"height"]); 

	//NSDictionary *dict = @{key:value};
	//快速创建字典
	NSDictionary *dict = @{
     @"name": @"lnj"};
	//快速拿字典内容
	NSLog(@"%@",dict [@"name"]); 
	//快速创建多个
	NSDictionary *dict = @{
     @"name":@"lnj", @"age" :@"30", @"height" :@"1.75"};
	
	return 0;
}

NSDictionary的遍历

OC学习之旅------第十一天_第6张图片

// 2. 字典的遍历
	NSDictionary *dict = @{
     @"name" :@"lnj", @"age":@"30", @"height" :@"1.75"};
	// 2. 1如何获取字典中key和value的个数,在字典中key称之为键,value称之为值
	NSLog (@"count = %lu",[dict count]) ;

	//第一种
	for(int i = 0; i< dict.count; ++i)
	{
     
		//获取字典中所有的key
		NSArray *keys = [dict allKeys];
		//取出当前位置对应的key
		NSLog (@"%@",keys[i]);
		NSString *key = keys [i];
		NSString *value = dict [key] ;
		NSLog(@"key = %@,value = %@", key, value);
	}


	//第二种
	//如何通过forin遍历字典,会将所有的key赋值给前面的obj
	for (NSString *key in dict) 
	{
     
		NSLog (@"%@",key);
		NSString *value = dict [key];
		NSLog(@"key = %@, value = %@", key, value);
	}

	//第三种
	[dict enumerateKeysAnd0bj ectsUs ingBlock:^(id key,id obj,BOOL *stop) {
       //参数就是Key,Val
		NSLog(@"key = %@,value = %@", key, obi);
	}];

}

字典文件读写

	// 3.字典文件读写
	//往文件中写
	NSDictionary *dict = @{
     @!"name" :@"Lnj", @"age" :@"30", @"height" :@"1.75"};
	// XML扩展名plist
	[dict writeToFile:@""/Users/xiaomage/Desktop/info.plist" atomically:YES];
	//注意:字典和数组不同,字典中保存的数据是无序的
	
	//从文件中读
	NSDictionary *newDict = [NSDictionarydictionaryWithContents0fFile:@"/Users/xiaomage/Desktop/info. plist"];
	NSLog(@"%@",newDict);

你可能感兴趣的:(OC学习)