我需要混合 Objective-C 和 C++。我想将所有 C++ 内容隐藏在一个类中,而将所有其他内容保留为纯 Objective-C。问题是我想要一些 C++ 类作为实例变量。这意味着它们必须在头文件中提及,头文件会被其他类包含,并且 C++ 开始传播到整个应用程序。到目前为止我能想到的最好的解决方案如下所示:
#ifdef __cplusplus
#import "cppheader.h"
#endif
@interface Foo : NSObject
{
id regularObjectiveCProperty;
#ifdef __cplusplus
CPPClass cppStuff;
#endif
}
@end
这有效。实现文件有一个mm
扩展名,以便它被编译为与 C++ 混合的 Objective-C,#ifdef
解锁 C++ 的东西,然后我们就可以了。当其他一些纯 Objective-C 类导入标头时,C++ 内容被隐藏,并且该类看不到任何特殊内容。这看起来像是一个黑客行为,有更好的解决方案吗?
这听起来像是接口/@协议的经典用法。为 API 定义 Objective-C 协议,然后使用 Objective-C++ 类提供该协议的实现。这样,客户端只需要了解协议,而不需要了解实现的标头。所以考虑到原来的实现
@interface Foo : NSObject
{
id regularObjectiveCProperty;
CPPClass cppStuff;
}
@end
我会定义一个协议
//Extending the NSObject protocol gives the NSObject
// protocol methods. If not all implementations are
// descended from NSObject, skip this.
@protocol IFoo <NSObject>
// Foo methods here
@end
并修改原来的Foo
声明给
@interface Foo : NSObject <IFoo>
{
id regularObjectiveCProperty;
CPPClass cppStuff;
}
@end
然后客户端代码可以使用类型id<IFoo>
并且不需要编译为 Objective-C++。显然你可以传递一个实例Foo
给这些客户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)