第七章 Values and Collections

1.平台相关的数据类型

These types, like NSInteger and NSUInteger, are defined differently depending on the target architecture. When building for a 32-bit environment (such as for iOS), they are 32-bit signed and unsigned integers respectively; when building for a 64-bit environment (such as for the modern OS X runtime) they are 64-bit signed and unsigned integers respectively.

  尽量使用这种平台相关的数据类型,而不是写int,double,float等基本类型,防止在不同的系统平台上,基本数据类型溢出的问题

2.使用int还是NSInteger

For local variables, such as a counter in a loop, it’s fine to use the basic C types if you know that the value is within the standard limits.

  写for循环的时候,用int i = 0; i < n; i++ 吧,因为你知道i会不会溢出

3.NSNumber

  使用NSNumber来表示基本数据类型

NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42];

NSNumber *unsignedNumber = [[NSNumber alloc] initWithUnsignedInt:42u];

NSNumber *longNumber = [[NSNumber alloc] initWithLong:42l];

NSNumber *boolNumber = [[NSNumber alloc] initWithBOOL:YES];

NSNumber *simpleFloat = [NSNumber numberWithFloat:3.14f];

NSNumber *betterDouble = [NSNumber numberWithDouble:3.1415926535];

NSNumber *someChar = [NSNumber numberWithChar:‘T‘];

  使用NSNumber来表示基本数据类型之更简洁的方法

NSNumber *magicNumber = @42;

NSNumber *unsignedNumber = @42u;

NSNumber *longNumber = @42l;

NSNumber *boolNumber = @YES;

NSNumber *simpleFloat = @3.14f;

NSNumber *betterDouble = @3.1415926535;

NSNumber *someChar = @‘T‘;

  从NSNumber里面取出基本数据类型

int scalarMagic = [magicNumber intValue];

unsigned int scalarUnsigned = [unsignedNumber unsignedIntValue];

long scalarLong = [longNumber longValue];

BOOL scalarBool = [boolNumber boolValue];

float scalarSimpleFloat = [simpleFloat floatValue];

double scalarBetterDouble = [betterDouble doubleValue];

char scalarChar = [someChar charValue];

  NSNumber和NSInteger之间的转化

NSInteger anInteger = 64;

NSUInteger anUnsignedInteger = 100;

NSNumber *firstInteger = [[NSNumber alloc] initWithInteger:anInteger];

NSNumber *secondInteger = [NSNumber numberWithUnsignedInteger:anUnsignedInteger];

NSInteger integerCheck = [firstInteger integerValue];

NSUInteger unsignedCheck = [secondInteger unsignedIntegerValue];

4.集合类型的元素必须是OC对象

NSArray,NSSet and NSDictionary are used to manage groups of objects, which means any item you wish to add to a collection must be an instance of an Objective-C class.

If you need to add a scalar value, you must first create a suitable NSNumber or NSValue instance to represent it.

  集合类型的元素必须是OC对象,而不能是标量值

  所谓标量值,是指int,double等基本数据类型和NSInteger,NSUInteger,BOOL等平台相关数据类型。标量值,一般声明的时候不加星号,比如NSInteger a = 1;矢量值,一般声明的时候需要加星号,比如NSNumber *b = @1;

5.集合快速初始化的时候有个坑

If you do need to represent a nil value in one of the collection classes, you should use the NSNull singleton class

  Collection类,如NSArray,NSSet,NSDictionary等都是nil-terminated,所以使用类似下例的方式初始化的时候,注意一定要检查元素是否是nil啊

//事件上报 Norcy
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: _resultModel.keyWord?_resultModel.keyWord:@"", @"searchKeyword", nil];  //这里要检查是否是nil

[QLReportCtlMgr reportStrID:@"video_jce_show_search_result_page" params:dic];

  不然中间哪个元素是nil的时候,后面的元素就添加不上去了,那真的要表示nil的时候怎么办呢,除了上例的NSString使用了@""之外,还可以用NSNull这个类来代替nil

NSArray *array = @[ @"string", @42, [NSNull null], @YES];

  由于NSNull是一个单例,[NSNull null]返回的永远是同一个对象,所以可以使用以下方法判断Collection里面哪个是空的

for (id object in array)
{
    if (object == [NSNull null])
        NSLog(@"Found a null object");
}

6.快速枚举

数组之快速枚举

for (id eachObject in array)
{
    NSLog(@"Object: %@", eachObject);
}

字典之快速枚举(注意是key哦)

for (NSString *eachKey in dictionary)
{
    id object = dictionary[eachKey];
    NSLog(@"Object: %@ for key: %@", object, eachKey);
}

高大上的NSEnumerator

for (id obj in [array objectEnumerator])  //正向
{
    NSLog(@"%@", obj);
}

for (id obj in [array reverseObjectEnumerator]) //反向
{
    NSLog(@"%@", obj);
}

while (id obj = [enumerator nextObject])    //nextObject+while
{
    NSLog(@"%@", obj);
}

如果,你离不开for循环的下标

int index = 0;
for (id obj in [array objectEnumerator])  //正向
{
    NSLog(@"%@", obj);
    index++;
}

  

时间: 2024-10-05 01:51:24

第七章 Values and Collections的相关文章

第七章 集合

1 /***************** 2 ***第七章 集合 3 *******知识点: 4 **************1.Collection和Iterator接口 5 ******************1.1 Collection接口简介 6 ******************1.2 Iterator接口简介 7 ******************1.3 Map接口简介 8 **************2.Set接口 9 ******************2.1 HashSet

[Effective Java]第七章 方法

第七章      方法 38.      检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有某些限制.例如,索引值必须是非负的,对象引用不能为null等,这些都是常见的.你应该在文档中清楚地指明所有这些限制,并且在方法体的开头处检查参数,以强制施加这些限制. 应该在方法和构造器体前进行了参数的有效性检查,并且及时向外抛出适当的异常.如果方法没有检查它的参数,就有可能发生几种情形.该方法可能在处理过程中失败,并且产生令人费解的异常,更有可能,该方法可以正常返回,但是会悄悄地计算出错

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

第七章 F# 库(三)

序列(Microsoft.FSharp.Collections.Seq)模块 Microsoft.FSharp.Collections.Seq 模块包含所有处理集合的模块,只要它支持 IEnumerable 接口, .NET 框架的 BCL 中的大多数集合都是的.这个模块之所以称为序列(Seq),是因为序列是IEnumerable 接口的别名,是对其简称,为了读.写更方便.给定类型定义时使用这个别名. 注意 FSLib 包含几个模块,用于处理不同类型的集合,包括Array(数组).Array2(

c++ primer plus(第6版)中文版 第七章编程练习答案

第七章编程练习答案 7.1编写一个程序,用户不停输入两数,直到有0出现为止,计算调和平均数 //7.1编写一个程序,用户不停输入两数,直到有0出现为止,计算调和平均数 #include <iostream> using namespace std; double average (unsigned x, unsigned y) { return (2.0 * x * y / (x + y)); } int main () { while (true) { unsigned x, y; cout

第七章 F# 库(五)

事件(Microsoft.FSharp.Control.Event)模块 可以把 F# 中的事件看做是函数的集合,能够通过函数调用来触发.其思想是,函数本身注册成事件,即函数的集合,等待事件发生的通知:然后,触发函数发出事件已经发生的通知,引发所有添加到事件中的函数被执行. 我们将讨论事件模块中的下列功能: 创建和处理事件:使用 create 和 add 函数来创建和处理事件的基础: 筛选(filter)函数:筛选进入事件中数据的函数: 分区(partition)函数:把进入事件中数据拆分成两部

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动画

《Python核心编程》 第七章 映射和集合类型 - 习题

课后习题 7–1. 字典方法.哪个字典方法可以用来把两个字典合并到一起? 答: dict1 = {'1' :' python' } dict2 = {'2' :"hello" } dict1.update(dict2) dictAll = dict1 print dictAll Result: {'1': ' python', '2': 'hello'} 7–2. 字典的键.我们知道字典的值可以是任意的 Python 对象,那字典的键又如何呢?请试 着将除数字和字符串以外的其他不同类型

[书籍翻译] 《JavaScript并发编程》第七章 抽取并发逻辑

本文是我翻译<JavaScript Concurrency>书籍的第七章 抽取并发逻辑,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript并发编程方面的实践. 完整书籍翻译地址:https://github.com/yzsunlei/javascript_concurrency_translation .由于能力有限,肯定存在翻译不清楚甚至翻译错误的地方,欢迎朋友们提issue指出,感谢. 到本书这里,我们已经在代码中明确地模拟了并发问题.使