先上一个连接:Yak Shaving,2012年的一片博客,题目是:
Objective-C’s New NSNumber, NSArray and NSDictionary Syntaxes Mean Less “Yak Shaving” for iOS and OS X Developers
大概就是关于NSNumber、NSArray、NSDictionary,能够简化初始化操作的新的语法,当然,在两年前是新的……
很多编程语言中都有一些繁琐的操作,oc也不例外,在xcode4.5以后,这种情况得到了改善。(至于yak shaving什么意思,由于英语水平有限,实在是找不到合适的词来解释)。
一般iOS开发或mac开发中经常见到@的地方就是NSString *str = @"hello";这样的语句了,这种初始化方法让我们少些很多东西,如果没有@的话,我们应该这样写
NSString *str = [NSString stringWithString:@"hello"];
甚至是这样:
NSString *str = [NSString alloc] initWithString:@"hello"];
对于数字类型的变量,在xcode4.5之前我们需要这样来封装,才能将其保存在数组、字典中(因为oc中数组和字典只能存放对象):
NSNumber *meaningOfLife = [NSNumber numberWithInt:42];
NSNumber *ussReliantPrefixCode = [NSNumber numberWithUnsignedInt:16309];
NSNumber *floatPi = [NSNumber numberWithFloat:3.14159];
NSNumber *doublePi = [NSNumber numberWithFloat:3.14159265358979];
NSNumber *avogadrosNumber = [NSNumber numberWithDouble:6.02214129E+23];
但是,在xcode4.5之后,就可以这样写了:
NSNumber *meaningOfLife = @42;
NSNumber *ussReliantPrefixCode = @16309U;
NSNumber *floatPi = @3.14159F;
NSNumber *doublePi = @3.14159265358979;
NSNumber *avogadrosNumber = @6.02214129E+23;
其实对于数字类型的封装还不算太麻烦,如果需要封装数组或者词典,就会挺繁琐的,在js、python、ruby中,我们可以这样写一个数组:
starkFamily = [
"Eddard",
"Catelin",
"Robb",
"Sansa",
"Arya",
"Bran",
"Rickon"
]
在oc中初始化一个数组需要这样写:
NSArray *starkFamily = [NSArray arrayWithObjects:
@"Eddard",
@"Catelin",
@"Robb",
@"Sansa",
@"Arya",
@"Bran",
@"Rickon",
nil
];
取某个元素需要这样:
[starkFamily objectAtIndex:2]
事实上,在xcode4.5之后我们可以简写成这样
NSArray *starkFamily = @[
@"Eddard",
@"Catelin",
@"Robb",
@"Sansa",
@"Arya",
@"Bran",
@"Rickon"
];
以及
starkFamily[2];
至于字典,我们可以简写成这样:
NSDictionary *importantNumbers = @{
@"Meaning of life" : @42,
@"USS Reliant prefix code" : @16309U,
@"Single-precision pi" : @3.14159F,
@"Double-precision pi" : @3.14159265358979,
@"Avogadro's Number" : @6.0221415E+23
};
当然,如果需要可变的字典,就得改成这样了:
NSMutableDictionary *importantNumbers = [@{
@"Meaning of life" : @42,
@"USS Reliant prefix code" : @16309U,
@"Single-precision pi" : @3.14159F,
@"Double-precision pi" : @3.14159265358979,
@"Avogadro's Number" : @6.0221415E+23
} mutableCopy];
取值和设值可以这样写:
importantNumbers[@"Meaning of life"];
importantNumbers[@"Meaning of life"] = @43;
好吧……偷懒了……实在不想按照原文逐字翻译,就把实例都给照搬过来了……