2014-12-05 148 views
0

我正在創建一個OS X應用程序,允許用戶彈鋼琴(使用MIDI鍵盤)。音符將從左到右滾動,並由用戶在正確的時間播放正確的音符,有點類似於搖滾樂隊或任何其他遊戲。將被滾動的筆記從一個文本文件或某種輸入源的生成,並且它可能看起來像這樣:類之間共享的NSDictionary數據

C4 D4 B3 A3 C4 ... 

我創建一個字典音符。在音樂中,有12個獨特的值,所以讓我們說有12個獨特的字母類型。 「C」的值爲0,「C#」爲1,「D」爲2等。我需要用這種方式對它們進行編碼,因爲用戶將要播放的MIDI數據是以數字方式產生的。 「C」將始終爲0,因此需要對這些數據進行硬編碼。在多個類之間共享此字典的最佳做法是什麼,以便該類的每個實例也可以訪問它?

+0

瞭解更多關於如何計劃在代碼中使用此數據結構的信息會有幫助。字典在這裏可能不是你最好的選擇。一個枚舉或者一組常量可能會工作得更好/更好。但是從這個問題很難說清楚。 – wallace 2014-12-05 19:50:11

+0

對不起,缺少信息...我會更新頂部。 – 02fentym 2014-12-05 19:51:39

+0

只需在類之間共享它。你用一個指針指向NSDictionary,指針可以作爲參數傳遞或存儲在另一個類的屬性中,或者從另一個類的屬性中獲取,所以很容易給同一個對象賦予多個類的可尋址性。這不需要任何花哨的初始化方法或單例或任何東西,只是合理的知識你的應用程序如何工作。 – 2014-12-05 20:36:21

回答

1

在多個類之間共享此字典的最佳做法是什麼,以便該類的每個實例也有權訪問它?

在類的+initialize方法中創建字典並將其指針存儲在靜態(文件範圍)變量中。在類的任何實例被創建之前調用+initialize,所以它是一個很好的地方,可以完成類獨立於特定對象所需的任何設置。

static NSDictionary *notesDict; 

@implementation SomeClass 

+ (void)initialize 
{ 
    notesDict = @{@"C" : @0, @"C#" : @1, @"D" : @2}; 
} 

+ (NSDictionary*)notes 
{ 
    return notesDict; 
} 

//... 

@end 

+notes訪問使得訪問很容易地將字典從其他類,如果這是必要的。

+1

你也可能發現它有用,爲你的類添加一個'+(NSDictionary *)notesDict;'方法來返回這個字典。 – par 2014-12-05 20:00:09

+0

@par同意 - 我最初想的是字典只能由一個班級在內部使用,但從問題來看這並不明確。 – Caleb 2014-12-05 20:30:41

+0

爲什麼使用字典,當你有NS_ENUM,在這裏看一個例子:http://stackoverflow.com/questions/8496903/enum-values-nsinteger-or-int,閱讀Cœur的答案 – Fantini 2014-12-05 20:34:08