Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中使用Objective-C代码和#define宏_Ios_Objective C_Macros_Swift - Fatal编程技术网

Ios 如何在Swift中使用Objective-C代码和#define宏

Ios 如何在Swift中使用Objective-C代码和#define宏,ios,objective-c,macros,swift,Ios,Objective C,Macros,Swift,我正试图在我的Swift项目中使用第三方Objective-C库。我已经成功地将库导入到Xcode中,并创建了一个-bridgeing Header.h文件,允许我在Swift中使用Objective-C类 然而,我似乎遇到了一个问题:Objective-C代码包含一个带有宏的常量.h文件#define AD_SIZE CGSizeMake(320,50)。将常量.h导入我的-桥接头.h不会产生我的Swift应用程序可以使用的全局常量AD_SIZE 我做了一些研究,发现苹果的文档中说 “在Swi

我正试图在我的Swift项目中使用第三方Objective-C库。我已经成功地将库导入到Xcode中,并创建了一个
-bridgeing Header.h
文件,允许我在Swift中使用Objective-C类

然而,我似乎遇到了一个问题:Objective-C代码包含一个带有宏的
常量.h
文件
#define AD_SIZE CGSizeMake(320,50)
。将
常量.h
导入我的
-桥接头.h
不会产生我的Swift应用程序可以使用的全局常量
AD_SIZE

我做了一些研究,发现苹果的文档中说

“在Swift中,您可以使用函数和泛型来实现相同的功能 结果[作为复杂宏]没有任何折衷 不生成C和Objective-C源文件中的复杂宏 可用于您的Swift代码。”

在读了这篇文章之后,我通过在Swift中指定
let AD_SIZE=CGSizeMake(320,50)
使它运行良好,但我希望在这些值在我不知道的情况下更改时保持与库的未来兼容性


在Swift或我的桥接头中是否有一个简单的修复方法?如果没有,有没有办法替换
#在
Constants.h
中定义AD大小CGSizeMake(320,50)
,并使其与任何使用旧的
AD大小
宏的现有Objective-C应用程序向后兼容?

我通过替换

#定义广告大小CGSizeMake(320,50)

在库的
常量.h
中,使用

extern CGSize const AD_SIZE

及加入

CGSize const AD_SIZE={.width=320.0f,.height=50.0f}


在库的
Constants.m
文件中。

我所做的是创建一个类方法,返回#define

例如:

.h文件:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;
+ (CGSize)adSize { return AD_SIZE; }
.m文件:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;
+ (CGSize)adSize { return AD_SIZE; }
和Swift:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;
+ (CGSize)adSize { return AD_SIZE; }
因为这是一个类方法,所以现在可以像#定义的那样使用它。 如果更改#define宏,它将反映在您创建的新方法中 迅速:

让size=YourClass.adSize()


在类声明之后编写常量。像这样

class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101
类ForgotPasswrdViewController:UIViewController{
让IS_IPHONE5=fabs(UIScreen.mainScreen().bounds.size.height-568)<1;
让Tag_iamTxtf=101

你试过用
静态CGSize
代替宏吗?哦,天哪。你认为有567.5像素高的手机吗?只要写bounds.size.height==568就行了。要知道你的宏的名字不好,因为在缩放模式下的iPod Touch或iPhone 6/7都有相同的高度。