代码之家  ›  专栏  ›  技术社区  ›  andyvn22

这是一个很好的kvo兼容方式来建模一个易变多关系吗?

  •  1
  • andyvn22  · 技术社区  · 14 年前

    假设我想要一个易变的,无序的关系。出于内部优化的原因,最好将其存储在 NSMutableDictionary 而不是 NSMutableSet . 但我想把实现细节保密。

    我还想提供一些与kvo兼容的访问器,因此:

    - (NSSet*)things;
    - (NSUInteger)countOfThings;
    - (void)addThings:(NSSet*)someThings;
    - (void)removeThings:(NSSet*)someThings;
    

    现在,为字典提供访问器(当然是在我的实现文件中的私有访问器)将更方便,也不那么邪恶,因此:

    @interface MYClassWithThings ()
    @property (retain) NSMutableDictionary* keyedThings;
    @end
    

    我觉得这很好!我可以使用访问器来处理 keyedThings 在类中,但其他对象认为它们处理的是可变的、无序的(,unkeyed!)对许多关系。

    我担心我做的一些事情可能是“邪恶”的,尽管,根据良好的风格和苹果公司的批准等。我在这里做过什么坏事吗?(例如,不提供 setThings ,因为 things 属性应该是可变的?)

    2 回复  |  直到 14 年前
        1
  •  2
  •   Peter Hosey    14 年前

    我不想为这本字典制造财产(即使是私人财产),但我认为它没有任何问题。

    不提供是不是错了 setThings ,因为 things 属性应该是可变的?

    对.kvc不喜欢缺少 setThings: 方法。

        2
  •  2
  •   Tom    14 年前

    这里没什么邪恶的。对于无序关系,唯一的强制变异方法是 addThings: removeThings: (见 the KVC doc )您的访问器 keyedThings 属性不会与任何kvc访问器冲突,因此您也可以使用它。

    让您放心的是,苹果静态分析器已知要检查的唯一东西是到未记录的api的消息。除此之外,如果您的实现决策不影响应用程序的行为,则您可以获得应用程序商店的批准。

    更新: 我对这个问题很感兴趣,并为自己重新阅读了kvc文档。这里的语言让我停顿了一下:

    对于许多无序的关系来说 最常用的建模方法是使用 nsset或子类。在这种情况下 如果键值编码没有 找到 属性,直接访问集合。 通常,您只实现这些 方法,如果您使用的是自定义的 需要的集合类 好像是一个集合。

    听起来作者更希望你摆脱 things 并实施 enumeratorOfThings: memberOfThings: .