objective-c - 在 swift 中从前缀 header 引用类定义

标签 objective-c swift prefixheader.pch

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

我有一个名为 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

前缀 header MyProj-Prefix.pch 包含:

#define MYCLASS MyClass
#define SOMEVAR @"Hello"

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

#import "MyProj-Prefix.pch"

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

[[MYCLASS myClass] doStuff];

我想在我的新 swift 代码中反射(reflect)这一点。我可以看到并引用定义的变量,但是定义的类不可见。例如

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

关于如何实现这一目标的任何指示?我什至不确定这在 swift 中是否可行。

最佳答案

即使 #define MYCLASS MyClass 在任何其他 header 中,但不一定在前缀 header 中,这个问题也会存在。这是因为预处理器指令通常不会导入到 Swift 中。但是,如果可以将简单宏映射到全局常量,则导入简单宏,这对于 SOMEVAR 是可能的,但对于 MYCLASS 是不可能的。参见 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17 .

可以在全局范围内使用 Swift 中的类型别名:

typealias MYCLASS = MyClass

当然,如果在 header 中重新定义了 MYCLASS,则必须修改类型别名。

不幸的是,如果 MYCLASS 的定义根据代码构建的位置/方式发生变化,这种方法不是很有用。但是,由于代码必须对可定义为 MYCLASS 的各种类的共同行为有相当多的了解,因此可以在这里使用协议(protocol),例如。

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

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

typedef MYCLASS * _MYCLASS;

这将允许您在 Swift 中执行如下操作:

_MYCLASS.myClass().doStuff()

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

关于objective-c - 在 swift 中从前缀 header 引用类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47528183/

相关文章:

iphone - 发布 App 后 iAd 未在设备上显示

ios - 即使将重复间隔设置为工作日,UILocalNotification 也会每天触发

swift - 我可以在 Swift 中将枚举分配给闭包参数吗

ios - 应用程序包不包含有效的 IOS 标识符

ios - 如何定义宏以在 ios 中执行操作

ios - 仪器报告的内存泄漏。不明白为什么

ios - 一张图片到另一张图片大小问题 ios

objective-c - 核心图标题路径错误