我正在尝试在我的Swift项目中使用第三方Objective-C库。我已经将库成功导入到Xcode中,并且我创建了一个<Project>-Bridging-Header.h
文件,允许我在Swift中使用我的Objective-C类。
我似乎遇到了一个问题:Objective-C代码包含一个带有Constants.h
宏的#define AD_SIZE CGSizeMake(320, 50)
文件。将Constants.h
导入我的<Project>-Bridging-Header.h
不会导致我的Swift应用可以使用的全局常量AD_SIZE
。
我做了一些研究,发现Apple文档here under "Complex Macros"说明了
“在Swift中,您可以使用函数和泛型来实现相同的功能 结果[作为复杂的宏]没有任何妥协。因此, 不会生成C和Objective-C源文件中的复杂宏 适用于您的Swift代码。“
阅读完之后,我通过在Swift中指定let AD_SIZE = CGSizeMake(320, 50)
使其工作正常,但是如果这些值在我不知情的情况下发生变化,我希望保持与库的未来兼容性。
在Swift或我的桥接头中是否有一个简单的解决方法?如果没有,是否有办法替换#define AD_SIZE CGSizeMake(320, 50)
中的Constants.h
,并使任何现有的使用旧AD_SIZE
宏的Objective-C应用向后兼容?
答案 0 :(得分:10)
我所做的是创建一个返回#define的类方法。
示例:
.h文件:
#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;
.m文件:
+ (CGSize)adSize { return AD_SIZE; }
在Swift中:
由于这是一种类方法,您现在可以像使用#define一样使用它。 如果更改#define宏 - 它将反映在您创建的新方法中 在斯威夫特:
让size = YourClass.adSize()
答案 1 :(得分:5)
我通过替换
解决了这个问题 #define AD_SIZE CGSizeMake(320, 50)
在图书馆Constants.h
中
extern CGSize const AD_SIZE;
并添加
CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };
在图书馆的Constants.m
文件中。
答案 2 :(得分:4)
在Class声明后编写常量。像这样...
class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101