注意,下面的文法需要下載Xcode 4.4。
1、枚舉類型的改變
老寫法:
[cpp] view plaincopy
typedef enum Week{
Moday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}Week;
老方法的問題是枚舉值的資料範圍是模糊的,這個數值可能非常大,可能是負數,無法界定
新寫法:
[cpp] view plaincopy
typedef enum Week:NSUInteger{
Moday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}Week;
新方法在列出枚舉內容的同時綁定了列舉資料型別NSUInteger,這樣帶來的好處是增強類型檢查和更好的代碼可讀性。
2、使用的方法代碼放置的位置順序無關
沒在.h檔案中聲明的方法,在時候的時候如果方法不在前面,可能會有警告。
比如:
[cpp] view plaincopy
@interface MyClass : NSObject
-(void)doSomething:(NSString *) print;
@end
實現:
[cpp] view plaincopy
@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 類型
老寫法:
[cpp] view plaincopy
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];
新寫法:
[cpp] view plaincopy
NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;
4.2、NSArray類型
老寫法:
[cpp] view plaincopy
NSArray *array;
array = [NSArray arrayWithObjects:@"object1", @"object2", @"object3", nil];
新寫法:
[cpp] view plaincopy
NSArray *array = @[ @"object1", @"object2", @"object3" ];
新的寫法去掉了後面討厭的nil。
4.3、NSDictionary類型
老寫法
[cpp] view plaincopy
NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3"]
forKeys:@[@"key1", @"key2", @"key3"]];
新寫法
[cpp] view plaincopy
NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };
NSLog(@"%@", dict);
運行結果正常:
{
key1 = value1;
key2 = value2;
key3 = value3;
}
5、快速通過下標定位對象
他們說新的文法這樣是可以的,數組和字典都可以通過下標訪問,
[cpp] view plaincopy
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