Objective-c KVC:To-Many属性的集合访问器模式,如何使用它来增强我的代码?

Car*_*loS 6 cocoa objective-c key-value-coding

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

Cal*_*leb 3

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

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

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

NSArray *frequentFlyerNumbers = someFlight.passengers.frequentFlyerNumbers;
Run Code Online (Sandbox Code Playgroud)

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

现在,上面的方法仅涵盖 getter,但您可以通过实现以下方式对 setter 执行相同的操作:

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

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

[someFlight replacePassengersAtIndexes:bumpedPassengerIndexes 
                        withPassengers:passengersFromLateConnectingFlight];
Run Code Online (Sandbox Code Playgroud)

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