Gab*_*haw 5 objective-c swift prefixheader.pch
我正在为现有的Objective-C项目添加swift代码.我在引用现有前缀标头中的定义时遇到问题.
我有一个名为MyClass的类,在Objective-C中用.h定义:
@interface MyClass
+(instancetype)myClass;
-(void)doStuff;
@end
Run Code Online (Sandbox Code Playgroud)
而.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
Run Code Online (Sandbox Code Playgroud)
前缀头MyProj-Prefix.pch包含:
#define MYCLASS MyClass
#define SOMEVAR @"Hello"
Run Code Online (Sandbox Code Playgroud)
我创建了一个桥接头,其中包含:
#import "MyProj-Prefix.pch"
Run Code Online (Sandbox Code Playgroud)
该项目包含使用类定义的Objective-C代码,例如
[[MYCLASS myClass] doStuff];
Run Code Online (Sandbox Code Playgroud)
我想在我的新swift代码中反映这一点.我可以看到并引用已定义的变量,但是定义的类是不可见的.例如
let someStr = SOMEVAR // This compiles
MYCLASS.myClass.doStuff() // MYCLASS isn't visible
Run Code Online (Sandbox Code Playgroud)
关于如何实现这一点的任何指针?我甚至不确定这是否可以迅速实现.
即使#define MYCLASS MyClass在任何其他标头中(不一定在前缀标头中)也会存在此问题。这是因为预处理器指令通常不会导入到 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
Run Code Online (Sandbox Code Playgroud)
MYCLASS当然,如果在标头中重新定义了类型别名,则必须对其进行修改。
MYCLASS不幸的是,如果定义的变化取决于代码的构建位置/方式,那么这种方法并不是很有帮助。但是,由于代码必须对可定义为 的各种类的常见行为有相当多的了解MYCLASS,因此可以在此处使用协议。
更新:在更多地思考/使用它并阅读其他一些帖子(例如在 Swift 中使用 obj-c typedef )之后,我认为这是一个更好的解决方案。MYCLASS使用这种方法,如果在 Objective-C 中是红色的,则无需更改 Swift 代码#define。
在你的 Objective-C 代码中的某个地方,例如在桥接头文件中,添加
typedef MYCLASS * _MYCLASS;
Run Code Online (Sandbox Code Playgroud)
然后,您可以在 Swift 中执行以下操作:
_MYCLASS.myClass().doStuff()
Run Code Online (Sandbox Code Playgroud)
MYCLASS如果出于某种原因你确实坚持在 Swift 中使用,那么添加typealias MYCLASS = _MYCLASS你的 Swift 代码就可以解决问题。
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |