Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 这是一种很好的兼容KVO的方法来建模可变多对多关系吗?_Cocoa_Key Value Observing - Fatal编程技术网

Cocoa 这是一种很好的兼容KVO的方法来建模可变多对多关系吗?

Cocoa 这是一种很好的兼容KVO的方法来建模可变多对多关系吗?,cocoa,key-value-observing,Cocoa,Key Value Observing,比如说我想要一个易变的、无序的多人关系。出于内部优化的原因,最好将其存储在NSMutableDictionary而不是NSMutableSet中。但我想对实现细节保密 我还想提供一些兼容KVO的访问器,因此: - (NSSet*)things; - (NSUInteger)countOfThings; - (void)addThings:(NSSet*)someThings; - (void)removeThings:(NSSet*)someThings; 现在,为字典提供访问器(当然,在我的

比如说我想要一个易变的、无序的多人关系。出于内部优化的原因,最好将其存储在
NSMutableDictionary
而不是
NSMutableSet
中。但我想对实现细节保密

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

- (NSSet*)things;
- (NSUInteger)countOfThings;
- (void)addThings:(NSSet*)someThings;
- (void)removeThings:(NSSet*)someThings;
现在,为字典提供访问器(当然,在我的实现文件中是私有的)会更方便,也不会那么邪恶,因此:

@interface MYClassWithThings ()
@property (retain) NSMutableDictionary* keyedThings;
@end
我觉得这很好!我可以使用访问器来处理类中的
keyedThings
,但其他对象认为它们处理的是一个可变的、无序的(,未定义的!)对多关系


我担心我正在做的几件事可能是“邪恶的”,但根据好的风格和苹果的认可等等。我在这里做过什么坏事吗?(例如,不提供
setThings
,因为
things
属性假定是可变的,这是错误的吗?

这里没有什么不好的地方。无序关系的唯一强制突变方法是
添加内容:
删除内容:
(请参阅)。
keyedThings
属性的访问器不会与任何KVC访问器发生冲突,因此您在这里也很好

为了让您放心,苹果的静态分析器只需要检查未记录API的消息。除此之外,如果您的实施决策不影响应用程序的行为,那么您可以申请应用程序商店的批准

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

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


听起来,作者更希望您摆脱
事物
,实现
枚举器things:
成员:

这里没有邪恶。无序关系的唯一强制突变方法是
添加内容:
删除内容:
(请参阅)。
keyedThings
属性的访问器不会与任何KVC访问器发生冲突,因此您在这里也很好

为了让您放心,苹果的静态分析器只需要检查未记录API的消息。除此之外,如果您的实施决策不影响应用程序的行为,那么您可以申请应用程序商店的批准

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

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


听起来作者更希望你摆脱
东西
,实现
枚举器things:
memberOfThings:

我不会为字典创建属性(即使是私有属性),但我认为它没有任何问题

…不提供
setThings
,因为
things
属性应该是可变的,这是错误的吗


对。KVC不会喜欢缺少设置东西的方法。

我不会为字典创建属性(即使是私有属性),但我认为它没有任何问题

…不提供
setThings
,因为
things
属性应该是可变的,这是错误的吗


对。KVC不喜欢缺少
setThings:
方法。

没有
things:
,因为它不接受参数。这只是
的事情
。是的,听起来确实如此。。。但我想知道为什么。也许是性能原因?因为在我看来,提供对集合的访问比提供枚举器things:和
memberOfThings:
要干净得多,因为它们都可以从集合中获得。和yvn22:取决于你的字典的布局,这两种方法中的一种或两种可能比获得一个临时集合并使用它来执行这些任务更有效。没有
东西:
,因为它不需要参数。这只是
的事情
。是的,听起来确实如此。。。但我想知道为什么。也许是性能原因?因为在我看来,提供对集合的访问比提供枚举器things:和
memberOfThings:
要干净得多,因为它们都可以从集合中获得。和yvn22:取决于你的字典的布局,这两种方法中的一种或两种可能是执行这些任务的更有效的方法,而不是获取一个临时集合并使用它来执行这些任务。