使用 pragma ifdef 有条件地为 mac 和 ios 编译相同的协议头? [重复]

问题描述 投票:0回答:1

可能重复:
使用哪个条件编译来在 Mac 和 iPhone 特定代码之间切换?

我定义了一个在 Mac 和 iOS 上都能正常工作的协议。 然而,协议的方法之一最好返回特定的对象类(而不仅仅是“id”),但该类不是基础类,因此在两个平台上有所不同(例如,UIButton 和 NSButton)。

如何使用像

#ifdef TARGET_OS_IPHONE
这样的编译指示在两个库中包含相同的协议标头,一个是为 iOS 构建的,另一个是为 Mac 构建的?

这是我的实际协议和我对条件编译的(失败的)尝试

#import <Foundation/Foundation.h>

@protocol SharedAppDelegate <NSObject>

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

@end

我立即知道的一件事是该目标不包括模拟器,但我找不到一个涵盖 Mac 和另一个所有 iOS 版本的目标的可靠示例。

ios xcode cocoa
1个回答
3
投票

你会踢自己的。是

#if
不是
#ifdef
TARGET_OS_IPHONE
是一个
#define
,对于 iOS 设置为
1
,对于 Mac 设置为
0
。您想使用简单的
#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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.