我正在尝试构建一个具有处理iOS和OSX AddressBook框架(iOS上的联系人列表和OSX上的联系人)的便捷方法的库,并包括以下方法:
(BOOL)addressBookContainsRecordWithID:(NSString *)recordID
(在OSX的情况下为NSInteger
)(id)newOrExistingGroupWithName:(NSString *)groupName
(id)addressBookRecordWithID:(NSString *)recordID
等
我希望能够在OSX和iOS上调用这些方法,但是让该方法为每个设备执行相应的逻辑路径。例如,在OSX上,它将使用使用ABPerson
和ABGroup
的方法,而在iOS上,它将使用使用ABRecordRef
的方法。
我目前的计划是使用预处理程序指令(#if device-is-osx callOSXMethod #else callIOSMethod
)来判断我是使用iOS还是OSX并使用正确的方法。
我有更好的方法可以解决这个问题吗?我觉得这里可以使用一些设计模式。
答案 0 :(得分:3)
这取决于两个不同实现之间的共享代码量。如果除了对AddressBook框架的一些特定方法调用之外几乎所有代码都是共享的,那么使用#if TARGET_OS_IPHONE
的预处理器指令就可以了。
另一方面,如果您发现#if
块中的代码变得越来越长,将Mac和iOS实现拆分为共享相同接口的单独文件通常更有意义。因此你有:
通过在每个实现文件中使用类扩展,您的实现甚至可以拥有不同的实例变量,这一点变得更加容易。第二种模式导致更高的可读性,代价是必须维护两个地方的常用代码。
答案 1 :(得分:1)
预处理器指令是要走的路。甚至可以使用预定义的:
#if TARGET_OS_IPHONE
// iOS code here
#else
// OS X code here
#endif