深入浅出Objective-C笔记(九)

Foundation Framework(2)


集合类

用来存储和管理一组对象的类

  • 三种常用的集合类

NSArray:强调顺序,但是里面的元素可以相同

NSDictionary:键值对的形式,键不讲究顺序

NSSet:不强调顺序,元素是互不相同的

三种集合类的示意图.png
创建NSArray对象

方法一:

NSArray *array = [NSArray arrayWithObjects:@"str1", @"str2", @"str3", nil];
//调用了NSArray的工厂方法
//用nill标记序列的结束

方法二:

NSArray *array = [[NSArray alloc] initWithObjects:@"str1", @"str2", @"str3", nil];

方法三:
就像NSString创建字符串对象很常见一样,创建数组也太常用了,所以,OC为创建数组提供了一种简单的语法:

NSArray *array = @[@"str1", @"str2", @"str3"];

数组里的nil是结束标志,如果在中间出现nil,就会被认为这是末尾。但如果我们确实想在中间元素中有个空值,那这么办?

NSNull *null = [NSNull null];
//使用NSNull类(单例类)创建一个 null对象

//注意null 与nil的区别,null是有对象的,只是这个对象是空的,它只是用来占位的。而nil是真的没有一个对象。

注意:NSArray只能存储对象!

基本数据类型,比如C语言里的int,float,double, 结构体等,以及Foundation Framework里的NSInteger 都不能存储在NSArray里,因为它们都不是对象。

但如果确实想存储这些类型,怎么办?

Foundation Framework 提供了基本数据类型的包装对象。也就是说我们可以把这些基本数据类型包装在一个对象里面,这样就可以把这些数据作为对象来处理了。


包装类
  • NSNumber

NSNumber 提供的把基本数据类型转换为对象的方法

NSNumber *intNum = [NSNumber numberWithInt:20];
NSNumber *doubleNum = [NSNumber numberWithDouble:20.5];
NSNumber *floatNum = [NSNumber numberWithFloat:98.98787f];
NSNumber *boolNum = [NSNumber numberWithBool:YES];

//使用NSNumber类方法,把基本数据类型当作参数传进去,这个方法就会返回一个NSNumber对象

如何把NSNumber对象里的数值取出来用?

int a = [intNum intValue];
double b = [doubleNum doubleValue];
float c = [floatNum floatValue];
BOOL d = [boolNum boolValue];

//每个对象都有特定的方法,可以返回特定类型的数据

每次要创建NSNumber对象的时候,都要调用NSNumber的类方法,很麻烦,有没有方便的办法?

ObjC2.0后,提供了更方便的字面量的写法。

NSNumber *intNum = @20;
NSNumber *doubleNum = @20.5;
NSNumber *floatNum = @98.98787f;
NSNumber *boolNum = @YES;

NSNumber可以对C语言的基本数据类型进行封装(成为对象),但是对于更复杂的,比如结构体,字节序列等,就得用另外一种方式进行封装,用NSNumber的父类,NSValue来处理。

  • NSValue

如何把一个结构体包装进NSValue并生产一个NSValue对象?

  typedef struct {
      int a;
      float b;
  }DataType;
  //这是个结构体,是无法包装进一个NSNumber里的

  使用NSValue来包装结构体

  DataType data;//定义一个结构体变量
  NSValue *value = [NSValue valueWithBytes:&data objCType:@encode(Data Type)];

  //调用NSValue的类方法,传入data的指针,
  //第二个参数是data的数据类型(这个例子data的数据类型是结构体)
  //如此这般便创建出一个NSValue对象

  //注意`encode`是OC的关键字,可以得到数据类型的C的字符串表示。
  //也就是说,`@encode(DataType)`返回的是`DataType`这么一个字符串

如何把包装在NSValue对象(Value)里的数据取出来?

[value getValue:&data];
//传入data变量的地址,getValue方法就会把包装起来的数据重新写回到我们传入的这个地址里,
//然后就可以直接使用里面的数据了。

现在我们有了NSNumber 和NSValue,我们就可以把各种数据类型写进NSArray数组里了。


读取NSArray某个下标位置的对象
  - (id)objectAtIndex:(NSUInteger)index;

一个例子

NSArray *arrayOfString = @[@"str1", @"str2", @"str3", @"str4"];
NSString *str = [arrayOfString objectAtIndex:2];//返回第三个字符串的指针
//这个方法还是麻烦

更简洁的写法

NSString *str = arrayOfString[2];//跟C语言数组用法一样

另一个常用的集合类,NSDictionary

在字典里我们可以很方便的根据一个键来找到对应的数值。

对于字典的键,需要注意两点:

字典的键,必须是不可变对象
字典的键,必须两两不相同

  • 如何创建一个字典
  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          @64, @"intValue";
                          @19.8, @"doubleValue";
                          @YES, @"boolValue", nil];
  //调用NSDictionary的一个工厂方法dictionaryWithObjectsAndKeys:

  //注意先写值对象,再写键对象

  //最后的nil也是用来判断传入参数序列的结束
  • 字面量的创建方式
  NSDictionary *dict = @{@"intValue":@64,
                       @"double":@19.8,
                       @"boolValue":@YES};
   //键写在前面,后面是值
  • 如何根据字典的键查找对应的值?

第一种方式
- (id)objectForKey:(id)aKey;

e.g.

NSObject *obj = [dict objectForKey:@"intValue"];

精简版

NSObject *obj = dict[@"intValue"];
//看着有点像数组的用法,只是数组下标变成了字典键

集合类NSSet

NSSet使用频率较低,当使用它是一般是考虑到效率问题。
当我们要判断一个集合里是不是有一个对象的时候,一个方法是使用NSArray数组扫一遍。而使用NSSet不需要遍历,效率高了很多。

  • 如何创建一个NSSet对象?
  NSSet *set = [NSSet setWithObjects:@"A", @"B", @"C", @"D", nil];

  //跟NSArray类似,这也是运用类里的工厂方法来生成对象
  • 如何判断一个集合里是否包含某个对象?
  BOOL isContained = [set containsObject:@"A"];

  //如果包含,则返回YES,否则返回NO.

因为NSSet使用频率不高,所以OC没提高更简便的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容