编写Objective-C程序时,总会用到某几个类,它们属于Foundation框架。虽然从技术上来说,不用Foundation框架也能写出Objective-C代码,但实际上却经常要用到此框架。这几个类是NSString、NSNumber、NSArray、NSDictionary。从类名上即可看出各自所表示的数据结构。

Objective-C以语法繁杂而著称。事实上的确是这样。不过,从Objective-C 1.0起,有一种非常简单的方式能创建NSString对象。这就是“字符串字面量”(string literal),其语法如下:
NSString *someString = @”Effective Objective-C 2.0”;

如果不用这种语法的话,就要以常见的alloc及init方法来分配并初始化NSString对象了。在版本较新的编译器中,也能用这种字面量语法来声明NSNumber、NSArray、NSDictionary类的实例。使用字面量语法(literal syntax)可以缩减源代码长度,使其更为易读。

字面数值

有时需要把整数、浮点数、布尔值封入Objective-C对象中。这种情况下可以用NSNumber类,该类可处理多种类型的数值。若是不用字面量,那么就需要按下述方式创建实例:
NSNumber *someNumber = [NSNumber numberWithInt:1];

上面这行代码创建了一个数字,将其值设为整数1。然而使用字面量能令代码更为整洁:
NSNumber *someNumber = @1;

大家可以看到,字面量语法更为精简。不过它还有很多好处。能够以NSNumber实例表示的所有数据类型都可使用该语法。例如:
NSNumber intNumber = @1;
NSNumber 
floatNumber = @2.5f;
NSNumber doubleNumber = @3.14159;
NSNumber 
boolNumber = @YES;
NSNumber *charNumber = @’a’;

字面量语法也适用于下述表达式:

以字面量来表示数值十分有用。这样做可以令NSNumber对象变得整洁,因为声明中只包含数值,而没有多余的语法成分。

字面量数组

数组是常用的数据结构。如果不使用字面量语法,那么就要这样来创建数组:

而使用字面量语法来创建则是:

上面这种做法不仅简单,而且还利于操作数组。数组的常见操作就是取某个下标所对应的对象,这用字面量来做更为容易。如果不用字面量,那么通常会用“objectAtIndex:”方法:

若使用字面量,则是:

这也叫做“取下标”操作(subscripting),与使用字面量语法的其他情况一样,这种方式也更为简洁、更易理解,而且与其他语言中依下标来访问数组元素时所用的语法类似。

不过,用字面量语法创建数组时要注意,若数组元素对象中有nil,则会抛出异常,因为字面量语法实际上只是一种“语法糖”(syntactic sugar),其效果等于是先创建了一个数组,然后把方括号内的所有对象都加到这个数组中。抛出的异常会是这样:

1234
*** Terminating app due to uncaught exception'NSInvalidArgumentException', reason: '***-[__NSPlaceholderArray initWithObjects:count:]: attempt toinsert nil object from objects[0]'

在改用字面量语法来创建数组时就会遇到这个问题。下面这段代码分别以两种语法创建数组:

1234567
id object1 = /* ... */;id object2 = /* ... */;id object3 = /* ... */;

NSArray *arrayA = [NSArray array WithObjects:                       object1, object2, object3, nil];NSArray *arrayB = @[object1, object2, object3];

大家想想:如果object1与object3都指向了有效的Objective-C对象,而object2是nil,那么会出现什么情况呢?按字面量语法创建数组arrayB时会抛出异常。arrayA虽然能创建出来,但是其中却只含有object1一个对象。原因在于,“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束。

这个微妙的差别表明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后才发现元素个数少了要好。向数组中插入nil通常说明程序有错,而通过异常可以更快地发现这个错误。

字面量字典

“字典”(Dictionary)是一种映射型数据结构,可向其中添加键值对。与数组一样,Objective-C代码也经常用到字典。其创建方式如下:

这样写令人困惑,因为其顺序是<对象>,<键>,<对象>,<键>。这与通常理解的顺序相反,我们一般认为是把“键”映射到“对象”。因此,这种写法不容易读懂。如果改用字面量语法,就清晰多了:

上面这种写法更简明,而且键出现在对象之前,理解起来较顺畅。此范例代码还说明了使用字面量数值的好处。字典中的对象和键必须都是Objective-C对象,所以不能把整数28直接放进去,而要将其封装在NSNumber实例中才行。使用字面量语法很容易就能做到这一点,只需给数字前加一个@字符即可。

与数组一样,用字面量语法创建字典时也有个问题,那就是一旦有值为nil,便会抛出异常。不过基于同样的原因,这也是个好事。假如在创建字典时不小心用了空值对象,那么“dictionaryWithObjectsAndKeys:”方法就会在首个nil之前停下,并抛出异常,这有助于查错。

字典也可以像数组那样用字面量语法访问。按照特定键访问其值的传统做法是:

与之等效的字面量语法则是:

这样写也省去了冗赘的语法,令此行代码简单易读。

可变数组与字典

通过取下标操作,可以访问数组中某个下标或字典中某个键所对应的元素。如果数组与字典对象是可变的(mutable),那么也能通过下标修改其中的元素值。修改可变数组与字典内容的标准做法是:

若换用取下标操作来写,则是:

局限性

字面量语法有个小小的限制,就是除了字符串以外,所创建出来的对象必须属于Foundation框架才行。如果自定义了这些类的子类,则无法用字面量语法创建其对象。要想创建自定义子类的实例,必须采用“非字面量语法”(nonliteral syntax)。然而,由于NSArray、NSDictionary、NSNumber都是业已定型的“子族”(class cluster,参见第9条),因此很少有人会从其中自定义子类,真要那样做也比较麻烦。而且一般来说,标准的实现已经很好了,无须再改动。创建字符串时可以使用自定义的子类,然而必须要修改编译器的选项才行。除非你明白这样做的后果,否则不鼓励使用此选项,用NSString就足够了。

使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。若想要可变版本的对象,则需复制一份:

这么做会多调用一个方法,而且还要再创建一个对象,不过使用字面量语法所带来的好处还是多于上述缺点的。

要点

应该使用字面量语法来创建字符串、数值、数组、字典。与创建此类对象的常规方法相比,这么做更加简明扼要。

应该通过取下标操作来访问数组下标或字典中的键所对应的元素。

 
用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。因此,务必确保值里不含nil。

转载于:https://www.cnblogs.com/496668219long/p/4421985.html

浅析Objective-C字面量相关推荐

  1. 前端自学之路 Javascript 行话浅析(一)——字面量 包装对象 作用域

    文章目录 直接量(literal) Undefine NULL 包装对象 变量作用域 函数作用域 块级作用域 作用域链 变量解析 引用错误 本篇主要涉及较为基础的, 变量, 作用域方面的名词. 为啥要 ...

  2. c语言字面量的作用是为变量,C语言 字面量

    在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...

  3. c语言相邻字符串字面量,C语言预处理#运算符的细节

    #运算符将宏的一个参数转换为字符串字面量,它仅允许出现在带参数的宏的替换列表中. 例如:使用PRINT_INT宏作为一个快捷的方法来整形变量或者表达式的值,#运算符可以使PRINT_INT为每个输出的 ...

  4. Swift 字面量表达

    字面量是一个很强大的特性,对于缩短代码很有帮助 // // 1 字面量就是 简洁明了指出自己的类型并且为变量赋值的的值 // tom false 称之为字面量 let dog:String = &qu ...

  5. ECMAScript 6 模板字面量的常见用法

    模板字面量可以理解成是字符串的一种,形式上用反引号 `` 将内容括起来. 目录 特点一:模板字面量会保留反引号内部的空格.回车.tab,会将\n,\t翻译. 特点二:支持字符串插值 特点三:和标签函数 ...

  6. 学习新对象字面量语法

    目标 使用简写属性名称 使用简写方法名称 使用计算属性名称 问题 哪些部分是冗余的? const person={name:name,address:address,sayHello:function ...

  7. C++——新类型与原始字面量(原始字符串)

    1.1新类型 C++11新增类型long long和unsigned long long,以支持64位(或者更宽)整型:新增了char16_t和char32_t以支持16位和32为字符表示:还新增了原 ...

  8. [译]ES6新特性:八进制和二进制整数字面量

    原文:http://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binar ...

  9. JavaScript如何比较两个对象字面量是否一样(key 和 value都对比)

    在写一个物流模版编辑的时候,遇到这样一个需求:如果用户编辑一个已经存在的物流模版,如果数据没有发生变化,就阻止用户提交.这样后台就不用重新写入数据库.当时觉得这不是什么大问题,就放开了. 后面在写一个 ...

最新文章

  1. Java内部类的一些总结
  2. Vue调用后端接口http ajax请求组件封装及proxyTable跨域问题解决超详细案例
  3. 过来人经验!聊聊前端工程师的职业规划
  4. 0 win10重装partition_教你在安装WIN10系统中所遇到问题处理方法
  5. [react] 使用Hooks要遵守哪些原则?
  6. link引入html5,CSS引入方式 | link和@import的区别 — 生僻的前端考点
  7. 查看Linux版本系统信息方法汇总
  8. 如何装系统,如何装kali linux系统
  9. .net安装_如何安装GWAS分析软件R包:GAPIT
  10. form请求导出表格_程序员:java导出Excel,附带依赖、后端代码和前端JS
  11. 迅雷11抢先体验版,免费2T空间可离线不限速取回
  12. 《东周列国志》第九十一回 学让国燕哙召兵 伪献地张仪欺楚
  13. mooc-人工智能与信息社会-人工智能发展简史
  14. 福特FORD EDI需求分析
  15. 解决C语言编译undefined reference to ‘pow’问题
  16. 第2章 C语言的数值数据与非数值数据 (二)
  17. toi,atol,strtod,strtol,strtoul实现类型转换
  18. windows7英文版变成中文版教程
  19. 通过静态LSP、LDP LSP、MPLS TE三种方式实现总部与分支的互通
  20. 1455 Oulipo

热门文章

  1. struts2类型转换器
  2. bootstrap-自适应导航
  3. python 实现分治法的几个例子
  4. dicom文件_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)
  5. 5G 承载网 — 基于 SDN 的 5G 承载网
  6. 互联网协议 — VRRP 虚拟路由器冗余协议
  7. CentOS7 通过 YUM 升级 VIM8
  8. PyQt GUI--信号与槽
  9. SecureCRT自动化脚本
  10. 药师帮完成1.33亿美元D轮融资,投资方为老虎环球基金、H Capital和DCM