我应该如何在Swift中replace这些屏幕大小和设备typesmacros?

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

 #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,我注意到这些东西已经不再适用了。 那么现在应该如何定义这些macros,并检测这个设备属于哪个系列呢?

如果Swift没有macros,那么这样做的语法是什么?

在这种情况下,定义这些常量的最简单的方法似乎是使用let关键字。 macros在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) let APP_DEFAULT_FONT_FACE_NAME = "HelveticaNeue-Light"; let APP_DEFAULT_FONT_FACE_THIN_NAME = "HelveticaNeue-UltraLight"; let APP_VERSION_STRING = "1.2"; 

对于IS_IPHONE5常量,我使用fabs来避免可能的浮点舍入错误。 我不确定他们是否会成为问题,但最好是安全的。

在Swift中, IS_IOS7macros是没用的,因为Swift 只支持iOS 7和更高版本 (在Swift程序中IS_IOS7总是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) } 

我以如下方式使用它们:

 if DeviceType.IS_IPHONE_6 { //iPhone 6 specific code goes here. } 

对于iPad:

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