代码简洁化——Objective-C中的Literals
2014-01-27 17:31
288 查看
转载地址:http://beyondvincent.com/blog/2014/01/23/guided-tour-through-objective-c-literals/
本文译自Guided tour through Objective-C Literals。大家要是有什么问题,可以直接在twitter上联系原作者,当然也可以在最后的评论中回复我。
苹果在2012年就已经把Literals加入到LLVM中,利用Literals,不仅可以方便快捷的创建某些特定数据类型,还可以简化代码量,加强代码的可读性。
下面先来看看目录:
NSNumber
NSArray
NSDictionary
Expressions
下面我们就让代码来说话吧。
曾经你是否一直这样来实例化
是不是感觉比较麻烦,现在好了,通过Literal,只需要如下一行简洁的代码即可:
在上面的代码中,使用了
不仅如此,我们还可以利用C语言中的后缀风格来定义NSNumber,如下代码所示:
有些编程语言创建数组是非常简单的,例如PHP。但是在引入Literal之前,Objective-C中创建数组的语法确不简单。如下代码所示:
上面代码中不仅初始化对象复杂,还需要额外添加一个nil。但是要用Literal,看起来完全不一样了:
如上所示,利用Literal,可以通过
在Literal之前,访问数组中的对象需要使用一个类似这样的方法
而来到Literal的世界中,可以使用一对方括弧
通过上面的语法,我们可以按照下面的方法来修改可变数组中的值:
在Literal引入之前,NSDictionary对象的实例化跟NSArray类似,看起来也很长,并且在最后需要
上面的代码看起来着实有点过头了。如果要用Literal的话,就简洁明了多了:
在上面NSDictionary实例化过程中,通过Literal,除了可以定义NSNumber和NSArray之外,还可以以可读的方式一一放置key和对应的值。相信这种方法大家都会喜欢。
从上面的介绍,你应该会喜欢上Literal,它确实可以让我们的代码更加容易读懂,并且不容易出错!!!
另外,我们还可以通过下面这样的方式访问字典中key对应的内容:(感谢@谌启亮在评论中的提醒)
// 注意:下面这一点内容我摘自Objective-C-Literals-Boxed Expressions
Objective-C提供了一种新的语法对C表达式进行包装:
它支持标量表达式(numeric, enumerated, BOOL),以及C字符串指针类型:
关于Literals的更多详细内容可以参考:Objective-C-Literals
本文译自Guided tour through Objective-C Literals。大家要是有什么问题,可以直接在twitter上联系原作者,当然也可以在最后的评论中回复我。
苹果在2012年就已经把Literals加入到LLVM中,利用Literals,不仅可以方便快捷的创建某些特定数据类型,还可以简化代码量,加强代码的可读性。
下面先来看看目录:
NSNumber
NSArray
NSDictionary
Expressions
下面我们就让代码来说话吧。
1. NSNumber
曾经你是否一直这样来实例化NSNumber:
1 | NSNumber *integer = [NSNumber numberWithInt:19]; |
1 | NSNumber *integer = @19 |
@符号,这跟创建NSString一样(只是不用双引号吧了),这样一来,就非常容易记住和使用啦。
不仅如此,我们还可以利用C语言中的后缀风格来定义NSNumber,如下代码所示:
12 | NSNumber *unsignedInteger = @19U; //Unsigned Integer NSNumber *longInteger = @19L; //Long Integer NSNumber *floatNumber = @19.5493F; //Float NSNumber *boolean = @YES; // //BOOL |
2. NSArray
有些编程语言创建数组是非常简单的,例如PHP。但是在引入Literal之前,Objective-C中创建数组的语法确不简单。如下代码所示:12 | NSArray *array = [NSArray arrayWithObjects: [NSNumber numberWithInt:10], @"A String!", [NSNumber numberWithFloat:10.654F], nil]; |
1 | NSArray *array_l = @[@10, @"A string", @10.645F]; |
@[]轻松的搞定数组初始化,并且省掉最后的
nil。实际上编译器会把上面的代码替换为
[NSArray arrayWithObjects:count:]。
在Literal之前,访问数组中的对象需要使用一个类似这样的方法
objectAtIndex:
1 | id obj = [array objectAtIndex:0]; |
[]加对象对应的索引就可以访问到了:
1 | id obj = array[0]; |
12 | NSMutableArray *mutableArray = [NSMutableArray arrayWithObject:@[@11,@76]]; mutableArray[0] = @51; |
3. NSDictionary
在Literal引入之前,NSDictionary对象的实例化跟NSArray类似,看起来也很长,并且在最后需要nil,如下代码所示:
12 | NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects: [NSNumber numberWithInt:10], [NSNumber numberWithInt:20], [NSNumber numberWithInt:30], nil] forKeys:[NSArray arrayWithObjects: @"first", @"second", @"third", nil]]; |
1 | NSDictionary *dicts = @{@"first":@10, @"second":@20, @"third":@30}; |
从上面的介绍,你应该会喜欢上Literal,它确实可以让我们的代码更加容易读懂,并且不容易出错!!!
另外,我们还可以通过下面这样的方式访问字典中key对应的内容:(感谢@谌启亮在评论中的提醒)
1 | NSString *firstValue = dicts[@"first"] |
4. Expressions
Objective-C提供了一种新的语法对C表达式进行包装:@( <expression> )
它支持标量表达式(numeric, enumerated, BOOL),以及C字符串指针类型:
12 | // numbers. NSNumber *smallestInt = @(-INT_MAX - 1); // [NSNumber numberWithInt:(-INT_MAX - 1)] NSNumber *piOverTwo = @(M_PI / 2); // [NSNumber numberWithDouble:(M_PI / 2)] // enumerated types. typedef enum { Red, Green, Blue } Color; NSNumber *favoriteColor = @(Green); // [NSNumber numberWithInt:((int)Green)] // strings. NSString *path = @(getenv("PATH")); // [NSString stringWithUTF8String:(getenv("PATH"))] NSArray *pathComponents = [path componentsSeparatedByString:@":"]; |
相关文章推荐
- Objc中Block的原理、实现及注意事项
- JSONObject与JSONArray的使用
- 【学习笔记之ios开发】1.Object-C语法概述
- objective c关于下划线和双下划线的用法
- ObjectiveC基础-ivar是什么意思
- springMVC中restful利用@RequestBody注解进行json 与object的转换
- eXpress Persistent Objects (XPO)入门教程三:创建Persistent Class
- “上帝”-Object中常用的方法
- C#比较两个由基本数据类型构成的object类型
- (译)Objective-C的动态特性
- objective-c 关键字和概念
- Object
- ProtocolBuffer for Objective-C 运行环境配置
- Export data into Excel using OLE OBJECTS vs. GUI_DOWNLOAD
- save Objects to Files
- Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage
- ios学习笔记之Object-C—字符串
- Object C学习笔记5-ARC forbids explicit message* 编译错误
- ActiveXObject 代理设置&nbsp…
- eXpress Persistent Objects (XPO)入门:数据查询