gpt4 book ai didi

ios - 使用 pragma ifdef 有条件地为 mac 和 ios 编译相同的协议(protocol)头?

转载 作者:行者123 更新时间:2023-12-03 16:58:19 25 4
gpt4 key购买 nike

Possible Duplicate:
Which conditional compile to use to switch between Mac and iPhone specific code?

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

如何使用像 #ifdef TARGET_OS_IPHONE 这样的杂注标记在两个库中包含相同的协议(protocol) header ,一个为 iOS 构建,一个为 Mac 构建?

这是我的实际协议(protocol)和我在条件编译方面的(失败的)尝试

#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 版本的目标的可靠示例。

最佳答案

你会踢自己的。这是#if,而不是#ifdefTARGET_OS_IPHONE 是一个 #define,对于 iOS,设置为 1,对于 Mac,设置为 0。您想使用简单的#if

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

此外,您不能在协议(protocol)定义中对协议(protocol)进行前向声明。您必须执行以下操作:

#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

关于ios - 使用 pragma ifdef 有条件地为 mac 和 ios 编译相同的协议(protocol)头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13255645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com