文章目錄
- 4.1、NSNumber 類型
- 4.2、NSArray類型
今年WWDC 2012蘋果全球開發人員大會上,蘋果針對LLVM編譯器都做了重大改進,新版的Xcode 4.4中的LLVM編譯器升級到了4.0,給Objective-C帶來了很多令人驚喜的特性。
注意,下面的文法需要下載Xcode 4.4。
1、枚舉類型的改變
老寫法:
typedef enum Week{ Moday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }Week;
老方法的問題是枚舉值的資料範圍是模糊的,這個數值可能非常大,可能是負數,無法界定
新寫法:
typedef enum Week:NSUInteger{ Moday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }Week;
新方法在列出枚舉內容的同時綁定了列舉資料型別NSUInteger,這樣帶來的好處是增強類型檢查和更好的代碼可讀性。
2、使用的方法代碼放置的位置順序無關
沒在.h檔案中聲明的方法,在時候的時候如果方法不在前面,可能會有警告。
比如:
@interface MyClass : NSObject-(void)doSomething:(NSString *) print;@end
實現:
@implementation MyClass-(void)doSomething:(NSString *)print{ NSLog(@"%@", [print stringByAppendingFormat:[self getString]]);}-(NSString *)getString{ return@"string for something";}@end
早期編譯器編譯時間會出現:warning: instance method ‘-getString:’ not found…
新的編譯器會先掃描碼中的方法,然後再編譯,這樣就避免了找不到方法這種情況了
3、property屬性簡化
@property對於使用Objective-C的程式員來說是相當熟悉的,property方便自動產生變數的getter 和setter。在.h檔案中聲明之後,還要在.m檔案中加上@synthesize關鍵字,這樣才能完成自動getter 和setter的過程。
比如說,我在.h檔案中寫了
@property (strong, nonatomic) NSDictionary *order;
我還要去對於的.m檔案中寫上
@synthesize order;
是不是感覺很多餘啊?現在在文法新特性中不用寫這行代碼了,新版的編譯器幫你實現這行代碼,這叫幫人幫到底。
也是說,你在.h檔案中聲明order屬性後,就可以直接在實現檔案中使用該屬性的getter和setter方法,編譯器還會根據屬性的可讀和可寫自動判斷是否提供setter方法。智能多了。
4、文法的簡化
做過java 或C#開發的都知道,初始化或賦值一個變數一般用一個“=”號就搞定了,到了Objective-C後,每次都要用一個很長的函數才能賦值活初始化。現在簡化多了。
咱們看看各個資料類型簡化前後的對比。
4.1、NSNumber 類型
老寫法:
NSNumber *number; number = [NSNumber numberWithChar:'X']; number = [NSNumber numberWithInt:12345]; number = [NSNumber numberWithUnsignedLong:12345ul]; number = [NSNumber numberWithLongLong:12345ll]; number = [NSNumber numberWithFloat:123.45f]; number = [NSNumber numberWithDouble:123.45]; number = [NSNumber numberWithBool:YES];
新寫法:
NSNumber *number; number = @'X'; number = @12345; number = @12345ul; number = @12345ll; number = @123.45f; number = @123.45; number = @YES;
4.2、NSArray類型
老寫法:
NSArray *array; array = [NSArray arrayWithObjects:@"object1", @"object2", @"object3", nil];
新寫法:
NSArray *array = @[ @"object1", @"object2", @"object3" ];
新的寫法去掉了後面討厭的nil。
4.3、NSDictionary類型
老寫法
NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3"] forKeys:@[@"key1", @"key2", @"key3"]];
新寫法
NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" }; NSLog(@"%@", dict);
運行結果正常:
{
key1 = value1;
key2 = value2;
key3 = value3;
}
5、快速通過下標定位對象
他們說新的文法這樣是可以的,數組和字典都可以通過下標訪問,
NSArray *array =@[ @"object1", @"object2", @"object3" ]; id obj = array[0]; //通過下標方式擷取數組對象,替換原有寫法:array objectAtIndex:i]; NSString *obj1 = @"oooo"; array[0] = obj1; //也可以直接為數組對象賦值。替換原有寫法:[array replaceObjectAtIndex:i withObject:newObj]; NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" }; id obj2 = dict[@"key1"];//擷取o2對象,替換原有寫法:[dic objectForKey:k2]; dict[@"key2"] = obj; //重新為鍵為k2的對象賦值,替換原有寫法:[dic setObject:newObj forKey:k2]
可是事實是這樣的:
現實總是殘忍的。於是google 了一下,發現這個文法是針對iOS 6 or OS X 10.8 SDKs的,我沒有ios 6模擬器而已沒有10.8 SDKs。所以報錯了。可以參考這裡:http://stackoverflow.com/questions/11425976/compiler-error-expected-method-not-found-when-using-subscript-on-nsarray
下面是WWDC 2012視頻的一些關於新文法特性的:
可以給你解釋,新的文法特性編譯器是怎麼實現的。
著作權聲明:本文由http://blog.csdn.net/totogo2010/原創,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者部落格連結,謝謝!