1

iOSおよびOSXのAddressBookフレームワーク(iOSの連絡先リストおよびOSXの連絡先)を処理するための便利なメソッドを備え、次のようなメソッドを含むライブラリを構築しようとしています。

  • (BOOL)addressBookContainsRecordWithID:(NSString *)recordIDNSIntegerOSXの場合)
  • (id)newOrExistingGroupWithName:(NSString *)groupName
  • (id)addressBookRecordWithID:(NSString *)recordID

そして、OSXとiOSの両方でこれらのメソッドを呼び出せるようにしたいのですが、そのメソッドに各デバイスのそれぞれのロジックパスを実行させます。たとえば、OSXではを使用するメソッドを使用ABPersonABGroupますが、iOSではを使用するメソッドを使用しますABRecordRef

私の現在の計画は、#if device-is-osx callOSXMethod #else callIOSMethodiOSとOSXのどちらを使用しているかを判断し、正しい方法を使用するプリプロセッサディレクティブ()を用意することです。

これについてもっと良い方法はありますか?ここで使えるデザインパターンがある気がします。

4

2 に答える 2

3

これは、2つの異なる実装間に存在する共有コードの量によって異なります。AddressBookフレームワークへのいくつかの特定のメソッド呼び出しを除いて、ほとんどすべてのコードが共有されている場合は、プリプロセッサディレクティブを使用#if TARGET_OS_IPHONEする方法があります。

一方、#ifブロック内のコードが非常に長くなっている場合は、通常、MacとiOSの実装を同じインターフェイスを共有する別々のファイルに分割する方が理にかなっています。したがって、次のようになります。

  • MyAddressBook.h-両方で共有
  • MyAddressBook_Mac.h-MyAddressBookのMac実装
  • MyAddressBook_iOS.h-MyAddressBookのiOS実装

これは、各実装ファイル内でクラス拡張を使用することにより、実装が異なるインスタンス変数を持つことさえできるという事実によって容易になります。この2番目のパターンは、2つの場所にある一般的なコードを維持する必要があるという犠牲を払って、読みやすさを向上させます。

于 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 に答える