【问题标题】:NSDictionary data shared between classes类之间共享的 NSDictionary 数据
【发布时间】:2014-12-05 19:39:18
【问题描述】:

我正在创建一个允许用户弹钢琴的 OS X 应用程序(使用 MIDI 键盘)。音符将从左到右滚动,由用户在正确的时间播放正确的音符,有点类似于摇滚乐队或任何其他游戏。将滚动的注释将从文本文件或某种输入源生成,它可能如下所示:

C4 D4 B3 A3 C4 ...

我正在为音乐笔记创建字典。在音乐中,有 12 种独特的值,所以我们只说有 12 种独特的字母类型。 “C”的值为 0,“C#”的值为 1,“D”的值为 2,等等。我需要以这种方式对它们进行编码,因为用户将要播放的 MIDI 数据是以数字形式生成的。 “C”将始终为 0,因此需要对这些数据进行硬编码。在多个类之间共享此字典以便该类的每个实例也可以访问它的最佳做法是什么?

【问题讨论】:

  • 了解更多有关您计划如何在代码中使用此数据结构的信息会很有帮助。字典可能不是你最好的选择。一个枚举或只是一组常量可能会更好/更好。但从问题中很难判断。
  • 抱歉信息不足...我会更新的。
  • 简单地在类之间共享它。您使用指针寻址 NSDictionary,指针可以作为参数传递或存储在另一个类的属性中或从另一个类的属性中获取,因此很容易为同一个对象提供多个类的可寻址性。这不需要任何花哨的初始化方法或单例或任何东西,只需要合理地了解您的应用程序是如何工作的。
  • @HotLicks 我认为这根本不是同一个问题。它确实与对象之间的数据共享有关,但是:a)尚不清楚所讨论的对象是否是视图控制器,它们很容易成为模型对象或视图或其他东西; b) 有问题的数据是一个常量字典,用于将名称映射到值,因此一直将字典作为参数传递将是不必要的负担。

标签: objective-c nsdictionary


【解决方案1】:

在多个类之间共享此字典以便该类的每个实例也可以访问它的最佳做法是什么?

在类的+initialize 方法中创建字典,并将指向它的指针存储在静态(文件范围)变量中。 +initialize 在创建类的任何实例之前被调用,因此它是一个独立于特定对象进行类所需的任何设置的好地方。

static NSDictionary *notesDict;

@implementation SomeClass

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

+ (NSDictionary*)notes
{
    return notesDict;
}

//...

@end

+notes 访问器可以方便地从其他类访问字典,如果有必要的话。

【讨论】:

  • 您可能还会发现在返回此字典的类中添加 + (NSDictionary *) notesDict; 方法很有用。
  • @par 同意——我最初认为该字典只能由单个类在内部使用,但从问题中不清楚这是真的。
  • 当你有 NS_ENUM 时为什么要使用字典,在这里看一个例子:stackoverflow.com/questions/8496903/…,阅读 Cœur 的答案
  • @Fantini 这不是一回事。 OP 要求提供字典,而不是枚举。枚举非常适合在代码中命名相关值,但不能在枚举中按名称查找值。 OP 显然必须读取包含音符名称的数据流并转换为音符值,这很容易使用字典:int note = [noteDict valueForKey:noteName];。要使用枚举进行类似的映射,您需要一系列 if 语句来将传入名称与已知名称进行比较,并从枚举中返回适当的值,这既慢又不方便。
  • 是的,使用枚举不会让这变得更好,我已经考虑过了。它实际上会做更多的工作,因为我仍然需要将字符串与 int 匹配。对我来说,字典似乎是最好的解决方案。我需要将同一个字典传递给多个班级。我在原帖中确实说过。
猜你喜欢
  • 2011-06-03
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多