1

我正在尝试构建一个库,该库具有处理 iOS 和 OSX 通讯簿框架(iOS 上的联系人列表和 OSX 上的联系人)的便捷方法,并包括以下方法:

  • (BOOL)addressBookContainsRecordWithID:(NSString *)recordIDNSInteger在 OSX 的情况下)
  • (id)newOrExistingGroupWithName:(NSString *)groupName
  • (id)addressBookRecordWithID:(NSString *)recordID

等等

而且我希望能够在 OSX 和 iOS 上调用这些方法,但让该方法执行每个设备各自的逻辑路径。例如,在 OSX 上它会使用一个使用的方法,ABPersonABGroup在 iOS 上它会使用一个使用ABRecordRef.

我目前的计划是使用预处理器指令 ( #if device-is-osx callOSXMethod #else callIOSMethod) 来确定我使用的是 iOS 还是 OSX 并使用正确的方法。

有没有更好的方法可以解决这个问题?我觉得这里可以使用一些设计模式。

4

2 回答 2

3

这取决于您的两个不同实现之间将有多少共享代码。如果除了对 AddressBook 框架的一些特定方法调用之外几乎所有代码都是共享的,那么预处理器指令#if TARGET_OS_IPHONE就是要走的路。

另一方面,如果您发现#if块中的代码变得很长,将 Mac 和 iOS 实现拆分为共享相同接口的单独文件通常更有意义。因此,您将拥有:

  • MyAddressBook.h - 两者共享
  • MyAddressBook_Mac.h - MyAddressBook 的 Mac 实现
  • MyAddressBook_iOS.h - MyAddressBook 的 iOS 实现

通过在每个实现文件中使用类扩展,您的实现甚至可以具有不同的实例变量,这使得这变得更容易。第二种模式以必须维护两个地方的任何通用代码为代价提高了可读性。

于 2012-12-06T15:31:51.140 回答
1

预处理器指令是要走的路。您甚至可以使用预定义的:

#if TARGET_OS_IPHONE
    // iOS code here
#else
    // OS X code here
#endif
于 2012-12-06T15:25:59.893 回答