Objective-c KVC:对于许多属性的集合访问器模式,如何使用它来增强代码?

Objective-c KVC:对于许多属性的集合访问器模式,如何使用它来增强代码?,objective-c,cocoa,key-value-coding,Objective C,Cocoa,Key Value Coding,我在读:,但我不确定我在哪里可以或应该使用这个。 有没有人能指出一些场景,我可以使用集合访问器模式来访问许多属性,以使我的代码更好,或使我的代码编写更容易?在某些情况下,它非常有用!这里有一些不言自明的例子 假设您有一个相同商品的销售价格数组,并想知道平均价格 NSNumber *averagePrice = [salesPrices valueForKeyPath:@"@avg.self"]; 如果它更复杂的话,这种方法仍然出人意料地简洁和优雅。假设您有一个事务字典数组,每个字典都有一个键“

我在读:,但我不确定我在哪里可以或应该使用这个。
有没有人能指出一些场景,我可以使用
集合访问器模式来访问许多属性
,以使我的代码更好,或使我的代码编写更容易?

在某些情况下,它非常有用!这里有一些不言自明的例子

假设您有一个相同商品的销售价格数组,并想知道平均价格

NSNumber *averagePrice = [salesPrices valueForKeyPath:@"@avg.self"];
如果它更复杂的话,这种方法仍然出人意料地简洁和优雅。假设您有一个事务字典数组,每个字典都有一个键“object”和“price”。你要的是苹果的销售总额

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

还请查看键值编码编程指南中给出的示例。它们也非常具有说明性。

您所阅读的集合访问器模式改进了键值编码处理集合(如NSArray、NSDictionary等)的方式。如果您在自己的类中实现它们,则您的类可以与标准集合类一样与KVC一起使用。例如,您可能有一个
Flight
类,其中包含
乘客的列表。但这些乘客可能不是存储在NSArray中,而是从数据库或其他地方提取的。如果您实施以下方法:

  • -乘客人数
  • -乘客索引:
  • -获取乘客:范围:
然后,使用类的代码可以使用KVC高效地访问乘客列表。例如,您可能会得到一个乘客常客号码列表(假设
passenger
具有这样的属性),如下所示:

NSArray *frequentFlyerNumbers = someFlight.passengers.frequentFlyerNumbers;
这是一个非常方便的工具,它可以让你不必迭代集合,也不用自己收集所有这些数字。如果你不知道你可以用像NSArray这样的标准集合来做这件事,这可能看起来很奇怪,所以先花一点时间来吸收这部分,然后考虑通过执行一些简单的方法,你为自己的<代码>航班类做了同样的事情。这很酷,即使乘客的存储完全在您的班级内部,它仍然可以工作

现在,上面的方法只涉及getter,但是您可以通过实现以下方法对setter执行相同的操作:

  • -插入乘客:a索引:
  • -删除乘客索引:
  • -替换乘客索引:带乘客:
现在,您的代码可以使用KVC在航班上添加和删除乘客:

[someFlight replacePassengersAtIndexes:bumpedPassengerIndexes 
                        withPassengers:passengersFromLateConnectingFlight];
您也可以实现其他KVC访问器,但我不认为需要为您列出它们,因为它们就在您链接的文章中。关键是键值编码在很多地方都很有用,通过实现少量方法,您可以使自己的类符合KVC。

添加到这一点上。 在类API中采用这些方法可以让您的类利用基础集合中相同的已建立的通用编码行为。p> 一个有用的例子是无序集合。您可以实现这一点,以便可以像访问字典一样访问类的所有公共属性。 allKeys将返回属性名。 allValues将返回这些属性的值。 InstanceOffyourClass[APPropertyName]将返回属性APPropertyName

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

没错,但OP询问了收集访问器模式,而您的回答似乎涵盖了收集运算符,如
@avg
@sum
。他们不是一回事。