6

我正在阅读:用于多属性的集合访问器模式,但我不确定我可以或应该在哪里使用它。有人可以指出一些我可以Collection Accessor Patterns for To-Many Properties用来使我的代码更好或使我的代码编写更容易的场景吗?

4

3 回答 3

3

您正在阅读的集合访问器模式改进了键值编码与 NSArray、NSDictionary 等集合的工作方式。如果您在自己的类中实现它们,您的类可以像标准集合类一样与 KVC 一起使用。例如,也许您有一个Flight包含Passenger. 但也许这些乘客没有存储在 NSArray 中,而是从数据库或其他东西中提取的。如果您实现以下方法:

  • -countOfPassengers
  • -passengersAtIndexes:
  • -getPassengers:range:

然后使用您的类的代码可以使用 KVC 有效地访问乘客列表。例如,您可能会得到一个乘客常旅客号码列表(假设Passenger有这样的属性),如下所示:

NSArray *frequentFlyerNumbers = someFlight.passengers.frequentFlyerNumbers;

这是非常方便的东西——使您不必遍历集合并自己收集所有这些数字。如果你不知道你可以用像 NSArray 这样的标准集合来做到这一点,这可能看起来令人惊讶,所以先花一点时间来吸收这部分,然后考虑通过实现一些简单的方法,你已经做了同样的事情你自己的Flight班级。即使乘客的存储完全在您的班级内部,这也很有效。

现在,上面的方法只涵盖了 getter,但是你可以通过实现对 setter 做同样的事情:

  • -insertPassengers:atIndexes:
  • -removePassengersAtIndexes:
  • -replacePassengersAtIndexes:withPassengers:

现在,再次,您的代码可以使用 KVC 在航班中添加和删除乘客:

[someFlight replacePassengersAtIndexes:bumpedPassengerIndexes 
                        withPassengers:passengersFromLateConnectingFlight];

您还可以实现其他 KVC 访问器,但我认为我不需要为您列出所有这些访问器,因为它们就在您链接的文章中。关键是键值编码是在许多地方使用的有用的东西,并且通过实现一小部分方法,您可以使您自己的类与 KVC 兼容。

于 2013-07-03T09:25:11.617 回答
0

添加到此。在你的类 API 中采用这些允许你的类利用 Foundation 集合中相同的已建立的通用编码行为。

一个有用的例子是无序集合。您可以实现这一点,以便您的类的所有公共属性都可以像字典一样访问。allKeys 将返回属性名称。allValues 将返回这些属性的值。instanceOfYourClass[aPropertyName] 将返回属性 aPropertyName

这将允许快速迭代和自省。实现需要一些努力,但会使一个类很好地适应 KVC 和 KVO,并增加使用绑定做简单而聪明的事情的能力。

于 2013-07-03T09:37:34.803 回答
0

在某些情况下,它真的很方便!这里有一些不言自明的例子。

假设您有一系列相同商品的销售价格,并且想知道平均价格。

NSNumber *averagePrice = [salesPrices valueForKeyPath:@"@avg.self"];

如果它更复杂,这种方法仍然出奇的简洁和优雅。假设您有一个字典交易数组,每个字典都有一个键“对象”和“价格”。您需要苹果的销售总额。

NSArray *apples = [transactions filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"object = %@", @"apple"]];
NSNumber *totalApplesSales = [apples valueForKeyPath:@"@sum.price"];

另请查看 Key Value Coding Programming Guide 中给出的示例。它们也非常具有说明性。

于 2013-06-30T08:30:31.110 回答