swift中来自前缀头的引用类定义

时间:2017-11-28 09:37:34

标签: objective-c swift prefixheader.pch

我正在向现有的Objective-C项目添加swift代码。我在引用现有前缀标题中的定义时遇到问题。

我有一个名为MyClass的类,在Objective-C中用.h:

定义
@interface MyClass
+(instancetype)myClass;
-(void)doStuff;
@end

和.m:

@implementation MyClass
+ (instancetype) myClass
{
    // More to it than this, but this illustrates the setup
    return [[MyClass alloc] init];
}

- (void)doStuff
{
    // Do something interesting
}
@end

前缀标头MyProj-Prefix.pch包含:

#define MYCLASS MyClass
#define SOMEVAR @"Hello"

我创建了一个桥接标题,其中包含:

#import "MyProj-Prefix.pch"

该项目包含使用类定义的Objective-C代码,例如

[[MYCLASS myClass] doStuff];

我想在我新的快速代码中反映这一点。我可以查看并引用已定义的变量,但定义的类不可见。 e.g。

let someStr = SOMEVAR // This compiles
MYCLASS.myClass.doStuff() // MYCLASS isn't visible

关于如何实现这一点的任何指针?我甚至不确定这是否可以在swift中实现。

1 个答案:

答案 0 :(得分:1)

即使SOMEVAR位于任何其他标头中,也不存在于前缀标头中,此问题仍然存在。这是因为预处理程序指令通常不会导入到Swift中。但是,如果可以将简单宏映射到全局常量,则可以导入简单宏,这可以用于MYCLASS,但不能typealias MYCLASS = MyClass 。请参阅https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17

可以在全球范围内使用Swift中的typealias:

MYCLASS

当然,如果在标题中重新定义MYCLASS,则必须修改类型。

不幸的是,如果MYCLASS的定义根据代码的构建位置/方式而变化,则此方法不是很有用。但是,由于代码必须非常了解可以定义为MYCLASS的各种类的共同行为,例如,可以在此处使用协议。

更新: 在考虑/玩它之后再阅读其他一些帖子,例如Using obj-c typedef in Swift,我认为这是一个更好的解决方案。使用这种方法,如果{-1}}在Objective-C中重新#define d,则无需更改Swift代码。

您的Objective-C代码中的某处,例如在桥接标题中,添加

typedef MYCLASS * _MYCLASS;

然后允许你在Swift中执行以下操作:

_MYCLASS.myClass().doStuff()

如果你真的因为某种原因坚持在Swift中使用MYCLASS,那么在你的Swift代码中添加typealias MYCLASS = _MYCLASS就可以了。