博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第3条:多用字面量语法,少用与之等价的方法
阅读量:5257 次
发布时间:2019-06-14

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

第3条:多用字面量语法,少用与之等价的方法(1)

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

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

 

 
  1. NSString *someString = @"Effective Objective-C 2.0"; 

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

字面数值

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

 

 
  1. NSNumber *someNumber = [NSNumber numberWithInt:1]; 

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

 

 
  1. NSNumber *someNumber = @1; 

大家可以看到,字面量语法更为精简。不过它还有很多好处。能够以NSNumber实例表示的所有数据类型都可使用该语法。例如:

 

 
  1. NSNumber *intNumber = @1;  

  2. NSNumber *floatNumber = @2.5f;  

  3. NSNumber *doubleNumber = @3.14159;  

  4. NSNumber *boolNumber = @YES;  

  5. NSNumber *charNumber = @'a'; 

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

 

 
  1. int x = 5;  

  2. float y = 6.32f;  

  3. NSNumber *expressionNumber = @(x * y); 

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

字面量数组

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

 

 
  1. NSArray *animals =  

  2.     [NSArray arrayWithObjects:@"cat", @"dog",  

  3.                              @"mouse", @"badger", nil]; 

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

 

 
  1. NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"]; 

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

 

 
  1. NSString *dog = [animals objectAtIndex:1]; 

若使用字面量,则是:

 

 
  1. NSString *dog = animals[1]; 

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

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

 

 
  1. *** Terminating app due to uncaught exception  

  2. 'NSInvalidArgumentException', reason: '***  

  3. -[__NSPlaceholderArray initWithObjects:count:]: attempt to  

  4. insert nil object from objects[0]' 

转载于:https://www.cnblogs.com/lkjson/p/4337740.html

你可能感兴趣的文章
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
Redmine
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>
编程算法 - 左旋转字符串 代码(C)
查看>>
IOS解析XML
查看>>
Python3多线程爬取meizitu的图片
查看>>
树状数组及其他特别简单的扩展
查看>>
zookeeper适用场景:分布式锁实现
查看>>
110104_LC-Display(液晶显示屏)
查看>>
httpd_Vhosts文件的配置
查看>>
php学习笔记
查看>>
普通求素数和线性筛素数
查看>>
PHP截取中英文混合字符
查看>>
【洛谷P1816 忠诚】线段树
查看>>
电子眼抓拍大解密
查看>>
poj 1331 Multiply
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>