Ios 如何在Swift中替换这些屏幕大小和设备类型的宏?

Ios 如何在Swift中替换这些屏幕大小和设备类型的宏?,ios,objective-c,swift,Ios,Objective C,Swift,回到Objective-C,我在constants.h文件中定义了以下宏: #define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) #define IS_IPAD (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) #define IS_IOS7 ([[[UIDevice currentDevice] systemVersion] floa

回到Objective-C,我在
constants.h
文件中定义了以下宏:

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IS_IPAD    (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
#define IS_IOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
#define APP_DEFAULT_FONT_FACE @"HelveticaNeue-Light"
#define APP_DEFAULT_FONT_FACE_THIN @"HelveticaNeue-UltraLight"
#define APP_VERSION @"1.2"
我开始玩斯威夫特,我注意到这些东西已经不起作用了。那么现在我应该如何定义这些宏,并检测设备属于哪个系列呢


如果Swift没有宏,那么它的语法是什么?

在这种情况下,定义这些常量的最简单方法似乎是使用
let
关键字。宏在Swift中不可用,因此在这种情况下必须使用常量(在这种情况下,在性能方面可能会更好):

let IS_IPHONE5=fabs(UIScreen.mainScreen().bounds.size.height-568)<1;
let IS_IPAD=(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad);
let IS_IOS8=(UIDevice.currentDevice().systemVersion.floatValue>=8)
让APP_DEFAULT_FONT_FACE_NAME=“HelveticaNeue Light”;
让APP_DEFAULT_FONT_FACE_THIN_NAME=“HelveticaNeue UltraLight”;
让应用程序_VERSION_STRING=“1.2”;
由于
是IPHONE5
常量,我使用了
fabs
来避免可能的浮点舍入错误。我不确定他们是否会成为一个问题,但最好是安全的


IS_IOS7
宏在Swift中是无用的,因为Swift(
IS_IOS7
在Swift程序中总是
YES
)我添加了一个
IS_IOS8
常量…

我倾向于在我做的每个项目中使用这三种结构:

struct ScreenSize {
    static let SCREEN_WIDTH         = UIScreen.mainScreen().bounds.size.width
    static let SCREEN_HEIGHT        = UIScreen.mainScreen().bounds.size.height
    static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}

struct DeviceType {
    static let IS_IPHONE_4_OR_LESS  = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_5          = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_6          = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_6P         = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPAD              = UIDevice.currentDevice().userInterfaceIdiom == .Pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
}

struct iOSVersion {
    static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue
    static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0)
    static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0)
    static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0)
}
对于IPad:

static let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad && ScreenSize.SCREEN_MAX_LENGTH >= 1024.0

斯威夫特没有宏!不要使用宏,使用静态常量,它们更安全。即使在objective-c中也不要使用宏!在任何一种语言中,这些都应该是常量或函数。@JesseRusak宏非常有用,例如用于日志记录。我不希望我的日志语句成为RTFB(阅读精细二进制文件)的其他人的免费评论。。。它们也可以用来创造新的习语。例如,
NSDictionaryOfVariableBindings
在Swift中很好,而且不可能。。。当然,宏应该少用,而且只有在它们值得的时候才使用。Kk我现在明白了,谢谢大家!但是什么是语法?我的constants.swift文件应该是什么的子类?不需要周围的括号。@Zaph这是真的。但是当他们在比较时,我喜欢他们。因此,我不必考虑它是否像
那样绑定(让我们看看IPAD=UI\u USER\u INTERFACE\u IDIOM())==UIUserInterfaceIdiomPad
或类似的
let IS_IPAD=(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
当我看到
=
=
靠得很近时,它总是让我思考。我建议将版本重命名为OSVersion或iOSVersion,但使用这样的结构是有帮助的。我不知道为什么,但这不能正常工作,即旋转时屏幕宽度、屏幕高度返回不正确的值(不是当前宽度,而是高度,反之亦然)。使用po命令在调试器中测试:)会给出与UIScreen.mainScreen().bounds.size.width和UIScreen.mainScreen().bounds.size.height不匹配的值。似乎没有重新计算该值。
if DeviceType.IS_IPHONE_6 {
    //iPhone 6 specific code goes here.
}
static let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad && ScreenSize.SCREEN_MAX_LENGTH >= 1024.0