Objective-C新特性

1. 成员方法无需前置声明

之前,我们调用一个定义在后面(未声明)的成员方法,比如[self callSomeMethod],会得到警告说没有找到该函数。

通常,这种情况下,为了消除这个警告,我们会很郁闷地(为了代码整洁)跑到前面声明下,使用旧版本Xcode往往还要临时写一个匿名扩展(新版本Xcode自动生成);或者(无所谓地)直接把后面的函数定义放到前面。

现在,编译器会先扫描@implementation内的方法,如果存在函数定义,则不出现该警告。

让程序员心情更好,提高生产力有木有!

2. 枚举类型改进

这点对我这种开发者意义不大,不过也更清晰了。

我个人习惯用如下风格定义枚举类型:

清晰地知道起始值和边界值,方便做安全检查。

不过我不清楚枚举值的边界能有多大,当然,一般开发活动中不会有什么问题。

现在,我们可以清楚地知道枚举值的范围,且跨平台:

typedef enum _someEnumType : NSUInteger {

    kOriginalType = 0,

    kYellowType,

    kRedType,

    kTotalTypeCount

} SomeEnumType;

如果没有听错的话,这个特性是从C++ 11引进的。

3. 自动合成属性

在之前的Xcode版本,我们在.h文件里声明属性@property后,还需要在.m文件中合成@synthesize,很是麻烦。

现在,我们只需要声明@property name即可,Xcode会自动合成@synthesize name = _name。

这完全符合基本编码风格!所以不需要管其它细节了,照常使用就行。

4. 新增语法特性

通过神奇的@符号,直接简化语法,变身脚本语言!LOL

以前字符串可以这么写:NSString *str = @"Hello";。

现在NSNumber这么写:

NSNumber *number = @'H';

    number = @1.2;

    number = @YES;

    number = @(60 * 60 * 24);

最后一句是表达式封装特性,@( expression ),比如NSString *name = @([self getMyName]);。

数组可以这么写:

NSArray *array = @[@"1", @"2"];

NSString *str = array[0];

NSMutable *mutableArray = [@[@"1"] mutableCopy];

字典可以这么写:

NSDictionary *dict = @{@"name" : @"Jason", @"password" : @"Hello,world"};

NSString *name = dict[@"name"];

上述写法多简洁啊!让coder从冗长的语法中脱离出来。

编译器为我们做了些事情(代码片段摘自WWDC 2012 Session 405):

// when you write this:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

// compiler generates:

id objects[] = { o1, o2, o3 };

id keys[] = { k1, k2, k3 };

NSUInteger count = sizeof(objects) / sizeof(id);

dict = [NSDictionarydictionaryWithObjects:objects

                                   forKeys:keys

                                     count:count];

我们也可以在自定义对象中添加如下方法来支持下标取值特性:

- (id)objectAtIndexedSubscript:(NSUInteger)idx {

    return container[idx];

}

- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx {

    container[idx] = obj;

}

不过,这种语法仍然不支持常量容器。关于compile-time constant,这里有一份讨论。

对此,我们可以采用类方法initialize(代码片段摘自WWDC 2012 Session 405):

@implementation MyClass

static NSArray *thePlanets;

+ (void)initialize {

    if (self == [MyClass class]) {

        thePlanets = @[

        @"Mercury", @"Venus", @"Earth",

        @"Mars", @"Jupiter", @"Saturn",

        @"Uranus", @"Neptune"

        ];

    }

}

关于initialize类方法,这里有一份讨论,这里有一份说明,包括为何要判断self类型——因为子类没有实现该方法的话,子类收到消息会转发给父类。

为什么放在initialize类方法中就可以呢?

而字典是没有常量一说的,即不存在常量字典。

为什么?

5. End

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值