Xcode 4.4中LLVM compiler 4.0帶來的Objective-C新文法特性

來源:互聯網
上載者:User

注意,下面的文法需要下載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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.