为什么在Swift中没有.pch文件可用?

17
在Swift中,不提供Prefix.pch文件。在我的项目中,我想全局声明一些宏并在整个应用程序中使用。
请问有人可以给我建议如何做,应该在哪里声明?
是否有其他文件可以在Swift中替换Prefix.pch文件?

在Swift中无法定义宏。 - Martin R
那么如何在整个应用程序中使用一些值呢?例如:(1)#define NAVIGATIONBAR_COLOR @"5B79B1" (2)#define ISIPAD [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad (3)#define PROFILE_PIC [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"] 在Swift中如何实现呢? - VRAwesome
3
Migrating Your Objective-C Code to Swift:将简单的宏声明为全局常量,并将复杂的宏转换为函数(摘自此答案:https://dev59.com/aWAf5IYBdhLWcg3w9Wiu#24114340)。 - Martin R
1
请看:https://dev59.com/KGAf5IYBdhLWcg3w52I_ - Chris Prince
顺便提一下——你的NSHomeDirectory宏是不好的风格。虽然现在可以工作,但将来可能会出问题。使用NSFileManager-URLForDirectory:inDomain:appropriateForURL:create:error:来获取像文档文件夹这样的“特殊”文件夹,你不应该假设它在主目录中。 - uliwitness
1个回答

37

即使在Obj-C中,使用宏定义常量和表达式也是不应该做的。从你的评论中可以举出例子:

#define NAVIGATIONBAR_COLOR @"5B79B1"

例如,将其作为UIColor类别方法会更好。

+ (UIColor *) navigationBarColor {
    return [UIColor colorWith...];
}

isPad宏应该是一个普通函数。

BOOL isIPad() {
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
}

或者可以使用分类方法,例如在UIDevice

[UIDevice isIPad]

定义为

+ (BOOL)isIPad {
   return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
}

预编译头文件从未旨在与您的所有代码共享宏。它们是为了在其中包含框架头文件以加速编译过程而制作的。随着去年引入模块并现在可以创建自定义模块的可能性,您不再需要预编译头文件。

在Swift中情况也是一样的 - 没有头文件和宏,因此也没有预编译头文件。请改用扩展、全局常量或单例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接