我正在阅读:用于多属性的集合访问器模式,但我不确定我可以或应该在哪里使用它。有人可以指出一些我可以Collection Accessor Patterns for To-Many Properties
用来使我的代码更好或使我的代码编写更容易的场景吗?
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 兼容。
添加到此。在你的类 API 中采用这些允许你的类利用 Foundation 集合中相同的已建立的通用编码行为。
一个有用的例子是无序集合。您可以实现这一点,以便您的类的所有公共属性都可以像字典一样访问。allKeys 将返回属性名称。allValues 将返回这些属性的值。instanceOfYourClass[aPropertyName] 将返回属性 aPropertyName
这将允许快速迭代和自省。实现需要一些努力,但会使一个类很好地适应 KVC 和 KVO,并增加使用绑定做简单而聪明的事情的能力。
在某些情况下,它真的很方便!这里有一些不言自明的例子。
假设您有一系列相同商品的销售价格,并且想知道平均价格。
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 中给出的示例。它们也非常具有说明性。