博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSArray & NSDictionary
阅读量:5024 次
发布时间:2019-06-12

本文共 8488 字,大约阅读时间需要 28 分钟。

一、NSArray

1.1 简单创建方法由难到简

NSArray *arr = [[NSArray alloc] init];    NSArray *arr = [NSArray arrayWithObject:@"zcc"];//    数组中的nil是结束符    NSArray *arr = [NSArray arrayWithObjects:@"zcc", @"zgc" ,@"jjj", @"cp", nil]    NSArray *arr = @[@"xcc", @"zcc", @"zgc"];    // 但是注意 @[@"xcc", @"zcc", @"zgc"]; 这种方法创建出来的是immutable类型的,不能赋值给mutable,也就是说如下代码是不对的    NSMutableArray *arrM =  @[@"xcc", @"zcc", @"zgc"];  //错误X

1.2 NSArray 只能用来存放OC的对象类型,对于int double 等这种基本数据类型是不支持的,需要将他们转为相应的OC对象才行。

错误:

int age = 10;    double number= 5.1;    int value =  6;    NSArray *arr =  @[age, number, value];

正确:将基本数据类型转换为对象类型

 

// 1.将基本数据类型转换为对象类型    NSNumber *ageN = [NSNumber numberWithInt:age];    NSNumber *numberN = [NSNumber numberWithDouble:number];    NSNumber *valueN = [NSNumber numberWithInt:value];        NSArray *arr = @[ageN, numberN, valueN];    NSLog(@"arr = %@", arr);        // 2.将对象类型转换为基本数据类型//    int temp = [ageN intValue];//    double temp = [numberN doubleValue];//    NSLog(@"%f", temp);        // 3.基本数据类型转换对象类型简写    // 注意: 如果传入的是变量那么必须在@后面写上(), 如果传入的常量, 那么@后面的()可以省略//   NSNumber *temp = @(number);      NSNumber *temp  =@10.10;

 

1.3 数组的遍历

除了常规的for循环外  还可以使用block来遍历

// 使用OC数组的迭代器来遍历    // 每取出一个元素就会调用一次block    // 每次调用block都会将当前取出的元素和元素对应的索引传递给我们    // obj就是当前取出的元素, idx就是当前元素对应的索引    // stop用于控制什么时候停止遍历    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {        if (idx == 1) {            *stop = YES;        }        NSLog(@"obj = %@, idx = %lu", obj, idx);    }];

如果该数组中存放的自定义的Person对象,并且该类中又 - (void)say; - (void)sayWithName:(NSString *)name;两个方法(一个有参数,一个无参数),可以用该block方法来使对象执行方法

Person *p1 = [Person new];    Person *p2 = [Person new];    Person *p3 = [Person new];    Person *p4 = [Person new];        NSArray *arr = @[p1, p2, p3, p4];    /*    [arr enumerateObjectsUsingBlock:^(Person *obj, NSUInteger idx, BOOL *stop) {        [obj say];    }];    */        // 如果使用OC数组存储对象, 可以调用OC数组的方法让数组中所有的元素都执行指定的方法    // 注意点: 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 那么会报错//    [arr makeObjectsPerformSelector:@selector(say)];        // withObject: 需要传递给调用方法的参数,但是好像只能传一个参数    [arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"zcc"];

 1.4 排序

上代码:

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

 

对自定义对象的排序

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 *obj1, Person *obj2) {        // 每次调用该block都会取出数组中的两个元素给我们        // 二分//        NSLog(@"obj1 = %@, obj2 = %@", obj1, obj2);        return obj1.age > obj2.age;//        return obj1.age < obj2.age;        /*        if (obj1.age > obj2.age) {            // 5 4            return NSOrderedDescending;        }else if(obj1.age < obj2.age)        {            // 4 5            return NSOrderedAscending;        }else        {            return NSOrderedSame;        }         */    }];    NSLog(@"排序后: %@", newArr);  // age = 5, age = 7, age = 10, age = 20

 

1.5 写入文件

NSArray *arr = @[@"lnj", @"lmj", @"jjj"];    // 其实如果将一个数组写入到文件中之后, 本质是写入了一个XML文件    // 在iOS开发中一般情况下我们会将XML文件的扩展名保存为plist    BOOL flag = [arr writeToFile:@"/Users/xiaomage/Desktop/abc.plist" atomically:YES];    NSLog(@"flag = %i", flag);    // 如果想要将自定义对象写入的话不能用这个方法,得用NSKeyedArchiver, 并且对象得遵守NSCoding协议,并且相应的实现协议中的两个方法。- (void)encodeWithCoder:(NSCoder *)aCoder;- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

 

1.6 NSMutableArray 

可变的Array,可以不在初始化的时候赋值。

// 创建一个空的数组    NSMutableArray *arrM = [NSMutableArray array];    NSLog(@"%@", arrM);    // 如何添加    [arrM addObject:@"lnj"];    // 将指定数组中的元素都取出来, 放到arrM中    // 并不是将整个数组作为一个元素添加到arrM中    [arrM addObjectsFromArray:@[@"lmj", @"jjj"]];    // 注意: 以下是将整个数组作为一个元素添加//    [arrM addObject:@[@"lmj", @"jjj"]];    NSLog(@"%@", arrM);    // 如何插入    [arrM insertObject:@"xcq" atIndex:1];    NSLog(@"%@", arrM);        NSRange range = NSMakeRange(2, 2);    NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];    // 插入一组数据, 指定数组需要插入的位置, 和插入多少个    [arrM insertObjects:@[@"A", @"B"] atIndexes:set];     NSLog(@"%@", arrM);        // 如何删除    [arrM removeObjectAtIndex:0];     NSLog(@"%@", arrM);        [arrM removeLastObject];    NSLog(@"%@", arrM);        [arrM removeObject:@"A"];     NSLog(@"%@", arrM);        // 如何替换    [arrM replaceObjectAtIndex:1 withObject:@"M"];    NSLog(@"%@", arrM);        // 如何获取    NSLog(@"%@", [arrM objectAtIndex:0]);    NSLog(@"%@", arrM[0]);        // 替换    arrM[0] = @"ZS";    NSLog(@"%@", arrM);            // 注意: 不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组    // 如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误    NSMutableArray *arrM = @[@"lnj", @"lmj"];    [arrM addObject:@"JJJ"];

 2.NSDictionary

总结的大体思路和NSArray类似就全部都写出来了

// 1.如何创建    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"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"}; NSLog(@"%@ %@ %@", dict[@"name"], dict[@"age"], dict[@"height"]); // 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) { NSString *value = dict[key]; NSLog(@"key = %@, value = %@", key, value); } */ /* [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"key = %@, value = %@", key, obj); }]; */ // 3.字典文件读写 NSDictionary *dict = @{
@"name":@"lnj", @"age":@"30", @"height":@"1.75"}; // XML 扩展名plist [dict writeToFile:@"/Users/xianren/Desktop/info.plist" atomically:YES]; // 注意: 字典和数组不同, 字典中保存的数据是无序的 NSDictionary *newDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/xianren/Desktop/info.plist"]; NSLog(@"%@", newDict); NSArray *arr = @[@10, @20, @30, @5]; [arr writeToFile:@"/Users/xianren/Desktop/abc.plist" atomically:YES];

 NSMutableDictionary

// 1.创建一个空的字典    NSMutableDictionary *dictM = [NSMutableDictionary  dictionary];    NSLog(@"%@", dictM);    // 2.如何添加    [dictM setObject:@"lnj" forKey:@"name"];    NSLog(@"%@", dictM);    // 会将传入字典中所有的键值对取出来添加到dictM中    [dictM setValuesForKeysWithDictionary:@{
@"age":@"30", @"height":@"1.75"}]; NSLog(@"%@", dictM); // 3.如何获取 NSLog(@"name = %@", dictM[@"name"]); // 4.如何删除 [dictM removeObjectForKey:@"name"]; NSLog(@"%@", dictM);// [dictM removeObjectsForKeys:@[@"age", @"height"]];// NSLog(@"%@", dictM); // 5.如何修改 // 如果利用setObject方法给同名的key赋值, 那么新值会覆盖旧值// [dictM setObject:@"88" forKey:@"age"]; dictM[@"age"] = @"88"; NSLog(@"%@", dictM); // 1.不能使用@{}来创建一个可变的字典 NSMutableDictionary *dictM = @{
@"name":@"lnj"}; [dictM setObject:@"30" forKey:@"age"]; // 2.如果是不可变数组, 那么key不能相同 // 如果是不可变字典出现了同名的key, 那么后面的key对应的值不会被保存 // 如果是在可变数组中, 后面的会覆盖前面的 NSDictionary *dict = @{
@"name":@"lmj", @"name":@"lnj"}; NSLog(@"dict = %@", dict); NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithObjects:@[@"lmj", @"lnj"] forKeys:@[@"name", @"name"]]; NSLog(@"dict = %@", dictM);

 

转载于:https://www.cnblogs.com/XXxiaotaiyang/p/5038744.html

你可能感兴趣的文章
Python:GUI之tkinter学习笔记3事件绑定(转载自https://www.cnblogs.com/progor/p/8505599.html)...
查看>>
jquery基本选择器
查看>>
hdu 1010 dfs搜索
查看>>
搭建wamp环境,数据库基础知识
查看>>
android中DatePicker和TimePicker的使用
查看>>
SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
查看>>
Android中获取应用程序(包)的大小-----PackageManager的使用(二)
查看>>
Codeforces Gym 100513M M. Variable Shadowing 暴力
查看>>
浅谈 Mybatis中的 ${ } 和 #{ }的区别
查看>>
CNN 笔记
查看>>
版本更新
查看>>
SQL 单引号转义
查看>>
start
查看>>
实现手机扫描二维码页面登录,类似web微信-第三篇,手机客户端
查看>>
PHP socket客户端长连接
查看>>
7、shell函数
查看>>
【转】Apache Jmeter发送post请求
查看>>
Nginx 基本 安装..
查看>>
【凸优化】保留凸性的几个方式(交集、仿射变换、投影、线性分式变换)
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>