Skip to content

Instantly share code, notes, and snippets.

@andrewcar
Created August 13, 2018 20:23
Show Gist options
  • Save andrewcar/20464a98f106d39e84692a5d980c521d to your computer and use it in GitHub Desktop.
Save andrewcar/20464a98f106d39e84692a5d980c521d to your computer and use it in GitHub Desktop.
Easy way to get current device type with dot notation
import UIKit
public enum DeviceType {
case iPhone4
case iPhone4s
case iPhone5
case iPhone5c
case iPhone5s
case iPhone6
case iPhone6Plus
case iPhone6s
case iPhone6sPlus
case iPhone7
case iPhone7Plus
case iPhoneSE
case iPhone8
case iPhone8Plus
case iPhoneX
case iPodTouch5
case iPodTouch6
case iPad2
case iPad3
case iPad4
case iPadAir
case iPadAir2
case iPad5
case iPad6
case iPadMini
case iPadMini2
case iPadMini3
case iPadMini4
case iPadPro9p7Inch
case iPadPro10p5Inch
case iPadPro12p9Inch
case iPadPro12p9Inch2ndGen
case AppleTV
case AppleTV4K
case HomePod
case SimulatoriPhone5s
case SimulatoriPhone6
case SimulatoriPhone6Plus
case SimulatoriPhone6s
case SimulatoriPhone6sPlus
case SimulatoriPhone7
case SimulatoriPhone7Plus
case SimulatoriPhone8
case SimulatoriPhone8Plus
case SimulatoriPhoneSE
case SimulatoriPhoneX
case SimulatoriPad5
case SimulatoriPadAir
case SimulatoriPadAir2
case SimulatoriPadPro9p7Inch
case SimulatoriPadPro10p5Inch
case SimulatoriPadPro12p9Inch
case SimulatoriPadPro12p9Inch2ndGen
case NotAvailable
}
public extension UIDevice {
static let modelName: DeviceType = {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
func mapToDevice(identifier: String) -> DeviceType {
switch identifier {
case "iPod5,1": return .iPodTouch5
case "iPod7,1": return .iPodTouch6
case "iPhone3,1", "iPhone3,2", "iPhone3,3": return .iPhone4
case "iPhone4,1": return .iPhone4s
case "iPhone5,1", "iPhone5,2": return .iPhone5
case "iPhone5,3", "iPhone5,4": return .iPhone5c
case "iPhone6,1", "iPhone6,2": return .iPhone5s
case "iPhone7,2": return .iPhone6
case "iPhone7,1": return .iPhone6Plus
case "iPhone8,1": return .iPhone6s
case "iPhone8,2": return .iPhone6sPlus
case "iPhone9,1", "iPhone9,3": return .iPhone7
case "iPhone9,2", "iPhone9,4": return .iPhone7Plus
case "iPhone8,4": return .iPhoneSE
case "iPhone10,1", "iPhone10,4": return .iPhone8
case "iPhone10,2", "iPhone10,5": return .iPhone8Plus
case "iPhone10,3", "iPhone10,6": return .iPhoneX
case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return .iPad2
case "iPad3,1", "iPad3,2", "iPad3,3": return .iPad3
case "iPad3,4", "iPad3,5", "iPad3,6": return .iPad4
case "iPad4,1", "iPad4,2", "iPad4,3": return .iPadAir
case "iPad5,3", "iPad5,4": return .iPadAir2
case "iPad6,11", "iPad6,12": return .iPad5
case "iPad7,5", "iPad7,6": return .iPad6
case "iPad2,5", "iPad2,6", "iPad2,7": return .iPadMini
case "iPad4,4", "iPad4,5", "iPad4,6": return .iPadMini2
case "iPad4,7", "iPad4,8", "iPad4,9": return .iPadMini3
case "iPad5,1", "iPad5,2": return .iPadMini4
case "iPad6,3", "iPad6,4": return .iPadPro9p7Inch
case "iPad6,7", "iPad6,8": return .iPadPro12p9Inch
case "iPad7,1", "iPad7,2": return .iPadPro12p9Inch2ndGen
case "iPad7,3", "iPad7,4": return .iPadPro10p5Inch
case "AppleTV5,3": return .AppleTV
case "AppleTV6,2": return .AppleTV4K
case "AudioAccessory1,1": return .HomePod
case "i386", "x86_64":
guard let environment = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] else { return .NotAvailable }
switch mapToDevice(identifier: environment) {
case .iPhone5s: return .SimulatoriPhone5s
case .iPhone6: return .SimulatoriPhone6
case .iPhone6Plus: return .SimulatoriPhone6Plus
case .iPhone6s: return .SimulatoriPhone6s
case .iPhone6sPlus: return .SimulatoriPhone6sPlus
case .iPhone7: return .SimulatoriPhone7
case .iPhone7Plus: return .SimulatoriPhone7Plus
case .iPhone8: return .SimulatoriPhone8
case .iPhone8Plus: return .SimulatoriPhone8Plus
case .iPhoneSE: return .SimulatoriPhoneSE
case .iPhoneX: return .SimulatoriPhoneX
case .iPad5: return .SimulatoriPad5
case .iPadAir: return .SimulatoriPadAir
case .iPadAir2: return .SimulatoriPadAir2
case .iPadPro9p7Inch: return .SimulatoriPadPro9p7Inch
case .iPadPro10p5Inch: return .SimulatoriPadPro10p5Inch
case .iPadPro12p9Inch: return .SimulatoriPadPro12p9Inch
case .iPadPro12p9Inch2ndGen: return .SimulatoriPadPro12p9Inch2ndGen
default: return .NotAvailable
}
default: return .NotAvailable
}
}
return mapToDevice(identifier: identifier)
}()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment