2014-12-05 111 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