我正在向现有的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中实现。
答案 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
就可以了。