We’re all aware that global variables are bad and that we shouldn’t do
globals. Right? Well... Sometimes you need globally available information like
user interface idiom or OS version. This information is available from
UIDevice
and you can grab it from anywhere in your app.
Testing Device Idiom and OS Version in Swift
if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone { ... }
if UIDevice.currentDevice().systemVersion.compare("8.0", options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending { ... }
However, that’s a lot type type and isn’t easy to read either. In Objective-C we could use macros in the pre-compiled header to make application code easier to read and write.
ProjectName-Prefix.pch
#define isPhone ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define isIOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
Application Objective-C Code
if isPhone { ... }
if isIOS8 { ... }
But Swift doesn’t have macros. Swift does, however, have a global namespace. Anything in that global namespace can be access by any other file in the same module. So you can do something like this.
Globals.swift
let isPhone = UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone
let isIOS8 = UIDevice.currentDevice().systemVersion.compare("8.0", options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending
Application Swift Code
if isPhone { ... }
if isIOS8 { ... }
That’s much better. Using the global namespace to define easy to type and read constants for system provided information feels acceptable to me. Just remember not to abuse it you should be okay.
Comments