我正在将 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 中重新#define
d,则无需更改 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/