請注意,這只是一個學術問題。更方便NSArray和NSDictionary訪問
在Ruby中,你可以方便地訪問數組和字典(哈希)內容:
value = myHash['myKey']
在Objective C,你需要一個方法調用:
value = [myDict objectForKey:@"myKey"];
一個人怎麼可能會覆蓋一些類型的括號或定義一個宏來使Objective C語法更接近Ruby的?
請注意,這只是一個學術問題。更方便NSArray和NSDictionary訪問
在Ruby中,你可以方便地訪問數組和字典(哈希)內容:
value = myHash['myKey']
在Objective C,你需要一個方法調用:
value = [myDict objectForKey:@"myKey"];
一個人怎麼可能會覆蓋一些類型的括號或定義一個宏來使Objective C語法更接近Ruby的?
只是一個更新:
與iOS 6我想開始,您可以使用這樣的語法:
value = dictionary[@"key"];
這相當於
value = [dictionary objectForKey:@"key"];
而且,如果我們談論NSMutableDictionary,你可以添加新的對象到這樣的字典中:
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init];
dictionary[@"a"] = @"A";
NSLog(@"%@",dictionary[@"a"]);
切換到Objective-C++,爲NSDictionary和NSMutableDictionary定義C++包裝類,並覆蓋數組下標運算符。
謝謝!我會試一試。 –
在C++中包裝一個目標c類的任何提示?我發現了很多相反的資源。 –
嘿!你說這是「僅僅是一個學術問題」,所以我給出了一個學術答案。僅僅因爲你*可以*這樣做並不意味着你*應該*。如果你更喜歡Ruby,那爲什麼不使用Ruby(http://sourceforge.net/projects/rubycocoa/)? – Caleb
你要做的事情需要一個稱爲「操作符重載」的語言特徵。 Objective-C不允許操作符重載,因爲該語言的設計者認爲操作符重載有害,而不是有用。
C++確實允許運算符重載,因此獲得所需語法的一種方法是將您的集合包裝在C++類中,然後使用它們。要切換到Objective-C++,只需將實現文件的擴展名從.m更改爲.mm即可。我個人建議不要在集合中使用C++包裝,因爲它會讓你的代碼更難以讓其他Objective-C程序員閱讀,並且會破壞Xcode的一些更高級的功能。例如,你將不能再使用重構工具,因爲Xcode將無法正確解析你的代碼。
其他的答案告訴你爲什麼你不能做到這一點 - 或如何解決它,但的Objective-C是一種冗長的語言 - 並使用描述性名稱是語言的樂趣的一部分。當然,你還在輸入更多的字母,但是隨着代碼的完成,它的寫作幾乎沒有任何變化,你可以清楚地看到你在做什麼。
就我個人而言,我發現它的冗長性 - 尤其是支架湯 - 使它整體上不易讀。 –
這當然是現在正確的答案。作爲一個方面說明,你可以通過實現下標方法使任何東西(如索引路徑的NSFetchedResults)都是可以腳本化的。 –
其實,如果我理解正確,它應該等同於'objectForKeyedSubscript:',它等同於'valueForKey:'。一個小的差異,但有時很重要。 [源(https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html) –