1

重複の可能性:
MacとiPhone固有のコードを切り替えるために使用する条件付きコンパイルはどれですか?

MacとiOSの両方で問題なく動作するプロトコルを定義しました。ただし、プロトコルのメソッドの1つは、(「id」だけでなく)特定のクラスのオブジェクトを返す方が適切ですが、そのクラスは基本クラスではないため、2つのプラットフォーム(たとえば、UIButtonとNSButton)によって異なります。

#ifdef TARGET_OS_IPHONEiOS用とMac用の2つのライブラリに同じプロトコルヘッダーを含めるようなプラグママークを使用するにはどうすればよいですか?

これが私の実際のプロトコルと条件付きコンパイルの(壊れた)試みです

#import <Foundation/Foundation.h>

@protocol SharedAppDelegate <NSObject>

#ifdef TARGET_OS_IPHONE
@protocol UIApplicationDelegate;
+ (NSObject<UIApplicationDelegate> *)sharedAppDelegate;
#else
@protocol NSApplicationDelegate;
+ (NSObject<NSApplicationDelegate> *)sharedAppDelegate;
#endif

@end

私がすぐに知っていることの1つは、ターゲットにシミュレーターが含まれていないことですが、MacとすべてのiOSの化身をカバーする1つのターゲットの確かな例を見つけることができません。

4

1 に答える 1

3

あなたは自分自身を蹴るつもりです。そうで#ifはありません#ifdefTARGET_OS_IPHONEは、iOS およびmac用#defineに設定されています。シンプルに使いたい。10#if

#if TARGET_OS_IPHONE
    NSLog(@"is iPhone or simulator");
#else
    NSLog(@"is mac... probably");
#endif

また、プロトコル定義内でプロトコルの前方宣言を行うことはできません。次のようにする必要があります。

#if TARGET_OS_IPHONE
@protocol UIApplicationDelegate;
#else
@protocol NSApplicationDelegate;
#endif


@protocol SharedAppDelegate <NSObject>
#if TARGET_OS_IPHONE
+ (NSObject<UIApplicationDelegate> *)sharedAppDelegate;
#else
+ (NSObject<NSApplicationDelegate> *)sharedAppDelegate;
#endif
于 2012-11-06T17:52:02.440 に答える