iOS Foundation框架 -2.常用集合类简单总结

iOS Foundation框架 -2.常用集合类简单总结

Foundation框架中常用的类有:NSStringNSArrayNSSetNSDictionary 以及它们对应的子类 NSMutableString、NSMutableArray、NSMutableSet、NSMutableDictionary父类统一为不可变而子类可变,还包括NSDate、NSObject

可变和不可变的区别是对象内容的可变和不可变,子类既然是继承父类那么子类可以使用父类中的任意方法

1.NSString类的操作

  • 使用NSString类的对象初始化方法创建字符串    
  // 创建无参数的字符串
NSString *str2 = [[NSString alloc] initWithString:@"Jack"]; // 创建带参数的字符串 NSString *str3 = [[NSString alloc] initWithFormat:@"age is %d",10]; // C字符串 转换为 OC字符串 NSString *str4 = [[NSString alloc] initWithUTF8String:"Rose"]; // OC字符串 转换为 C字符串 const char c = [str4 UTF8String]; // 读取文件内容第一种方式:读取桌面下 getWeather.xml 文件里的所有内容 NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/getWeather.xml"
                     encoding:NSUTF8StringEncoding error:nil];
// NSUTF8StringEncoding 适用于使用中文的编码格式 // 读取文件内容第二种方式 // URL:资源路径 格式为:协议头:// 比如本地文件的URL格式:file:// 网络文件的URL格式:http:// 服务器文件的URL格式:ftp://
  NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/getWeather.xml"];
  // 如果访问网络就可以定义:http://www.baidu.com

NSString *str6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSLog(@"/n%@",str6);

  • 使用NSString类方法创建字符串
    // 创建无参数的字符串
    NSString *str2 = [NSString stringWithString:@"Jack"];
    
    // 创建带参数的字符串
    NSString *str3 = [NSString stringWithFormat:@"age is %d",10];
    
    // C字符串 转换为 OC字符串
    NSString *str4 = [NSString stringWithUTF8String:"Rose"];
    
    // 读取文件内容第一种方式:读取桌面下getWeather.xml文件里的所有内容
    NSString *str5 = [NSString stringWithContentsOfFile:@"file:///Users/apple/Desktop/getWeather.xml" encoding:NSUTF8StringEncoding error:nil];

    // NSUTF8StringEncoding 适用于使用中文的编码格式
    
    // 读取文件内容第二种方式:读取桌面下getWeather.xml文件里的所有内容
    NSURL *url = [NSURL URLWithString:@"file:///Users/apple/Desktop/getWeather.xml"];
    NSString *str6 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

  可以看出实现同一个功能NSString提供了对象方法和类方法两种解决方式而类方法快捷方便,因此在实际开发中推荐使用类方法来操作字符串

 

  • 将字符串写入到一个文件里
    // 给目标文件中写入字符串,两种写入方式在写入之前都会将文件中的内容全部清空后再写入
    
    // 第一种写入方式
    // atomically参数指写入不成功时要不要停止
    [@"Java,iOS" writeToFile:@"/Users/apple/Desktop/getWeather.xml" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    // 第二种写入方式
    NSString *content = @"iOS,Java";
    // NSURL提供了直接定义本地URL的类方法
    NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/getWeather.xml"];
    [content writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

 

2.NSMutableString类的操作

  • NSMutableString继承自NSString那么NSMutableString可以使用NSString类中的任意方法
  • NSMutableString提供了自己独有的方法
    NSString *str = [NSString stringWithFormat:@"My age is 10 "];
    NSString *str2 = [str stringByAppendingString:@"11 12"];
    NSLog(@"%@",str2);      // 打印:My age is 10 11 12
    
    NSMutableString *mutalbeStr = [NSMutableString stringWithFormat:@"My age is 10 "];
    [mutalbeStr appendString:@"11 12"]; // appendString方法没有返回值,说明是直接str字符串后面进行拼接
    NSLog(@"%@",mutalbeStr); // 打印:My age is 10 11 12
    
// 可以看出:NSString一旦定义了str字符串它本身就不可变了,虽然NSString类方法也提供了拼接的方法如stringByAppendString方法但是它返回的是一个新的字符串。而NSMutableString提供的拼接方法appendString方法是在原有的字符串上直接拼接它没有返回值。这就是可变和不可变字符串的本质

    // NSMutableString 提供了删除方法,比如说要删掉上面可变字符串中的11有两种方式:
    
    // 第一种 必须要清楚要删除内容的location和length,11在整个字符串中的loc = 11 length = 2  (不推荐使用)
    //[mutalbeStr deleteCharactersInRange:NSMakeRange(13, 2)];
    
    // 第二种:先获取要删除内容的范围,然后删除范围内的字符串
    NSRange range = [mutalbeStr rangeOfString:@"11"];
    [mutalbeStr deleteCharactersInRange:range];
    
    NSLog(@"%@",mutalbeStr); // 打印:My age is 10  12


 

2.OC集合类的操作

(1) OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以    存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等

(2) OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加*

(3) NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变

(4) NSArray数组和子类NSMutableArray的基本操作

    // 使用NSArray的类方法arry创建个数组
    // 创建时定义为空数组,那么array数组将永远是空数组
    NSArray *array = [NSArray array];

  •  NSArray的常见操作:
    // 创建数组对象有两种方式 
    // 第一种方式:
    NSArray *array = [NSArray arrayWithObjects:@"Jack",nil];
    // 数组中包含了两个NSString对象 nil是用来标识数组元素结束的标识
    // 因此OC数组中不能存放空对象
    NSArray *array1 = [NSArray arrayWithObjects:@"Jack",@"Rose", nil];

    // 第二种方式:(推荐使用)
    NSArray *array2 = @[@"Jack",@"Rose"];

    // 获取数组的长度 array1.count;
    NSUInteger count = [array1 count];
    NSLog(@"%ld",count);

    // 访问数组中的对象的两种方式
    NSString *str1 = [array1 objectAtIndex:0]; // 数组中索引为1的对象,OC中提供的方法 返回:Jack
    NSString *str2 = array1[0];                // 编译器特性其实还是转为上面的形式来访问 返回:Jack

 // 遍历数组的三种方式 // 第一种:
    for (int i = 0; i<array1.count; i++) {
        NSLog(@"%@",array1[i]); // 数组中存放的是对象可以用%@输出
        if (i ==0) {
            break;
        }
    }
    
// 第二种:将array1数组中的每个对象拿出来赋给obj然后依次打印 for (id obj in array1) { // id obj 代表数组中的对象 // 获取obj对象在数组中的索引 NSUInteger index = [array1 indexOfObject:obj]; NSLog(@"%ld-->%@",index,obj); }
// 第三种:使用Block 每次从数组中遍历一个元素后就传递给block,block也相应的执行一次 // block中的id obj对应数组中的元素,NSUInteger idx对应数组中元素的索引 BOOL用来停止遍历 [array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%ld-->%@",idx,obj); // 如果索引为0 立即停止遍历 if (idx ==0) { *stop = YES; } }];

  •  NSMutableArray的基本操作:
  // 创建可变数组
NSMutableArray *mutableArray = [NSMutableArray array];
   // NSMutableArray
*mutalbeArray2 = @[@"张三",@"李斯"]; 注意:@[]返回的是不可变NSArray数组 这样会报错

  // 为可变数组增加任意对象
Person *person = [[Person alloc] init]; [mutableArray addObject:person]; [mutableArray addObject:@"Jack"]; [mutableArray addObject:@"John"]; // [mutableArray addObject:10]; 数组中不可以存放基本数据类型

    // 从数组中删除指定的元素
    [mutableArray removeObject:@"John"];
    [mutableArray removeObjectAtIndex:0];
    // 将数组中的元素全部删除
    [mutableArray removeAllObjects];

(5) NSSet数组和子类NSMutableSet的基本操作

  • NSSet和NSArray都是不可变数组,一旦创建就无法改变。NSSet是无序的集合简单操作:
    // 创建NSSet集合
    NSSet *set = [NSSet set]; // 一旦创建为空永远为空
    NSSet *set2 = [NSSet setWithObjects:@"Jack",@"Rose",@"Jim",nil];
    
    // 随机获取NSSet集合中的元素
    NSString *str = [set2 anyObject];
    NSLog(@"%@",str);

  • NSMutableSet的简单操作:
    // 创建可变set集合
    NSMutableSet *mutableSet = [NSMutableSet set];
    
    // 为set添加集合
    [mutableSet addObject:@"Jack"];
    [mutableSet addObject:@"Rose"];
    
    // 删除元素
    [mutableSet removeObject:@"Jack"];

 

(6) NSArray和NSSet数组的对比

  • 都是可以存放任意类型的OC对象的集合,都不能存放基本数据类型
  • 本身都是不可变的,但是子类都是可变的
  • NSArray是有序的集合,NSSet是无序的集合

(7) NSDictionary和NSMutableDictionary

  • NSDictionary和它的子类NSMutableDictionary都是以key/value的形式存在,NSDictionary本身为不可变集合
  • NSDictionary也是无序集合
  • 字典集合中存储的值是以键值对的形式存在,如果存在相同的key那么后面key的值会被覆盖。但是允许vaule的重复
  • NSDictionary的基本操作
    // 常见创建Dictionary集合的四种方式
    
    // 1.创建一个空的字典集合类型
    NSDictionary *dic = [NSDictionary dictionary]; // 一旦为空 永久为空
    
    // 2.创建只有一组值的字典集合
    NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"Jack" forKey:@"name"];
    
    // 3.创建多个值的字典集合
    NSArray *keys = @[@"name",@"address",@"e-mail"];
    NSArray *values = @[@"Jack",@"北京",@"jack@163.com"];
    NSDictionary *dic3 = [NSDictionary dictionaryWithObjects:values forKeys:keys];
    
    // 4.通过值/键的方式来创建
    NSDictionary *dic4 = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"Jack",@"name",
                          @"北京",@"address",
                          @"jack@163.com",@"e-mail",nil];
    
    // 5.类似于数组的创建方式 (推荐使用)
    NSDictionary *dic5 = @{
    @"name":@"Jack",
                           @"address":@"北京",
                           @"e-mail":@"jack@163.com"};

    // 取值:根据相应的Key取出对应的值
    NSString *name = [dic1 objectForKey:@"name"]; // 返回 Jack

    // 返回键值对的个数
    NSUInteger count = dic5.count; // 返回 4

    // 遍历NSDictionary数组用两种方式:
    // 第一种方式:
    // 获取字典中所有的键
    NSArray *allKeys = [dic5 allKeys]; // 获取的键在数组中是无序的
    
    for (int i = 0; i < dic5.count; i++) {
        NSString *key = allKeys[i];
        NSString *value = dic5[key];
        NSLog(@"%@-->%@",key,value);
    }
    
    // 第二种方式:将字典中的键值对传递给Block中的key和obj
    [dic5 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-->%@",key,obj);
     // 遍历一次立即停止 *stop = YES; }];

 

  • NSMutableDictionary的基本操作
    // 创建可变字典
    NSMutableDictionary *mutableDic = [NSMutableDictionary dictionary];
    // NSMutableDictionary *mutableDic2 = @{@"name",@"Rose",@"address",@"北京"}; 错误的写法因为右边返回的是不可变的字典

    // 为可变字典添加元素
    [mutableDic setObject:@"Rose" forKey:@"name"];
    [mutableDic setObject:@"北京" forKey:@"address"];

    // 移除
    [mutableDic removeAllObjects];
    [mutableDic removeObjectForKey:@"name"];

    // 打印
    NSLog(@"%@",mutableDic); // 输出:address = "\U5317\U4eac"; name = Rose;     \U5317\U4eac 就是北京存储的形式

 

(8) 设计一个通讯录里面包含了四个人的姓名、电话、地址

    NSArray *friends = @[
         @{
    @"name":@"张三",@"phone":@"13993214321",@"address":@"北京"},
         @{
    @"name":@"李斯",@"phone":@"13498766789",@"address":@"上海"},
         @{
    @"name":@"王武",@"phone":@"15898766789",@"address":@"天津"},
         @{
    @"name":@"赵柳",@"phone":@"18798766789",@"address":@"南京"}];
    
    // 获取‘李斯’的通讯录信息
    NSDictionary *dic = friends[1];
    NSLog(@"%@",dic);

转载于:https://www.cnblogs.com/QM80/p/3616537.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109877.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 力争群雄:2012年度IT博客大赛100强脱颖而出[通俗易懂]

    力争群雄:2012年度IT博客大赛100强脱颖而出[通俗易懂]2012年度IT博客大赛于11月20日圆满结束。这一所谓的“海选”阶段为期33天,引无数网友和博主翘首以待,来源包括51CTO、独立个人博客、其他博客服务托管商,以及今年评选新增加的分类如独立博客、学生博客和团队博客等众多博主共同参加了这一角逐,其中100位实力雄厚和人气充盈的博主获得了前100强的殊荣。他们占据了25万张票选中的8成以上份量,并将为2012年度IT博客50…

    2022年7月21日
    10
  • C#开发微信公众平台-就这么简单(转载)(附原文链接)

    C#开发微信公众平台-就这么简单(转载)(附原文链接)

    2021年11月17日
    44
  • MySQL常用SQL语句大全

    MySQL常用SQL语句大全MySQL数据库是一个十分轻便的数据库管理系统,相比大型的数据库管理系统如Oracle、MS-SQL,MySQL更拥有轻便、灵活、开发速度快的特色,更适用于中小型数据的存储与架构。MySQL之所以能够被数以万计的网站采用,也是由此而来。

    2022年6月13日
    22
  • GB50174-2017机房标准_机房建设标准规范 2018

    GB50174-2017机房标准_机房建设标准规范 2018中华人民共和国国家标准电子计算机机房设计规范GB50174-93中华人民共和国国家标准电子计算机机房设计规范GB50174-93DesignCodeforElectronicComputerRo批准部门:中华人民共和国建设部1993年2月17日1993年9月1日实施第一章总则第1.0.1条为了使电子计算机机房设计确保电子计算机系统稳定可靠运行及保障机房工作人员有良好的工作环境,做到…

    2022年10月2日
    1
  • java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

    java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

    2021年12月3日
    44
  • Java开发谈:2021Java高级面试题及答案

    Java开发谈:2021Java高级面试题及答案前言最近一段时间发现经常看到很多人,对Spring源码比较感兴趣,日常开发中,无论你做什么什么项目,大部分都离不开Spring生态的那一套东西,所以很多人对Spring底层源码实现很感兴趣,但是有些从来没有接触过源码的开发者,在看Spring源码的过程中确实及其难受的,为什么,大部分人看源码基本都是debug一点一点去看的,最后发现,越追越离谱,越追越深,到最后都追到JDK源码了,也没有明白是什么意思!对于学习源码,我的看法是,先去完全的熟悉它的用法,想一下如果让你来实现,你会怎么实现!有了这些想法之后

    2022年7月18日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号