2011-09-08 66 views
2

請注意,這只是一個學術問題。更方便NSArray和NSDictionary訪問

在Ruby中,你可以方便地訪問數組和字典(哈希)內容:

value = myHash['myKey'] 

在Objective C,你需要一個方法調用:

value = [myDict objectForKey:@"myKey"]; 

一個人怎麼可能會覆蓋一些類型的括號或定義一個宏來使Objective C語法更接近Ruby的?

回答

4

只是一個更新:

與iOS 6我想開始,您可以使用這樣的語法:

value = dictionary[@"key"]; 

這相當於

value = [dictionary objectForKey:@"key"]; 

而且,如果我們談論NSMutableDictionary,你可以添加新的對象到這樣的字典中:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init]; 
dictionary[@"a"] = @"A"; 
NSLog(@"%@",dictionary[@"a"]); 
+1

這當然是現在正確的答案。作爲一個方面說明,你可以通過實現下標方法使任何東西(如索引路徑的NSFetchedResults)都是可以腳本化的。 –

+1

其實,如果我理解正確,它應該等同於'objectForKeyedSubscript:',它等同於'valueForKey:'。一個小的差異,但有時很重要。 [源(https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html) –

1

切換到Objective-C++,爲NSDictionary和NSMutableDictionary定義C++包裝類,並覆蓋數組下標運算符。

+0

謝謝!我會試一試。 –

+0

在C++中包裝一個目標c類的任何提示?我發現了很多相反的資源。 –

+0

嘿!你說這是「僅僅是一個學術問題」,所以我給出了一個學術答案。僅僅因爲你*可以*這樣做並不意味着你*應該*。如果你更喜歡Ruby,那爲什麼不使用Ruby(http://sourceforge.net/projects/rubycocoa/)? – Caleb

4

你要做的事情需要一個稱爲「操作符重載」的語言特徵。 Objective-C不允許操作符重載,因爲該語言的設計者認爲操作符重載有害,而不是有用。

C++確實允許運算符重載,因此獲得所需語法的一種方法是將您的集合包裝在C++類中,然後使用它們。要切換到Objective-C++,只需將實現文件的擴展名從.m更改爲.mm即可。我個人建議不要在集合中使用C++包裝,因爲它會讓你的代碼更難以讓其他Objective-C程序員閱讀,並且會破壞Xcode的一些更高級的功能。例如,你將不能再使用重構工具,因爲Xcode將無法正確解析你的代碼。

+1

它也不必要地複雜化你的代碼,只是爲了在數組訪問中保存一些鍵擊。那是*這樣一個失敗的主張。 – Chuck

+0

謝謝Nathan。我知道人們會反對這個建議(我不太可能將它用於舉例和討論),這就是爲什麼我把它標爲學術。我重載了像+這樣的運算符,但是如何特別重載括號,括號或其他匹配對來完成集合查找快捷方式。 –

+1

@ Peter-DeWeese,你要爲括號運算符做什麼,看起來像這樣: 'id operator [](int i){return [collection objectAtIndex:i]; }' – Nathan

3

其他的答案告訴你爲什麼你不能做到這一點 - 或如何解決它,但的Objective-C是一種冗長的語言 - 並使用描述性名稱是語言的樂趣的一部分。當然,你還在輸入更多的字母,但是隨着代碼的完成,它的寫作幾乎沒有任何變化,你可以清楚地看到你在做什麼。

+0

就我個人而言,我發現它的冗長性 - 尤其是支架湯 - 使它整體上不易讀。 –