Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using sysctlbyname() from Swift

I’m using the code from this Gist to determine which iOS device (e.g. iPhone5,1) my app is running on:

- (NSString *)platform {     size_t size;     sysctlbyname("hw.machine", NULL, &size, NULL, 0);     char *machine = malloc(size);     sysctlbyname("hw.machine", machine, &size, NULL, 0);     NSString *platform = [NSString stringWithUTF8String:machine];     free(machine);     return platform; } 

The Swift documentation indicates that C data types are well-supported, but it doesn’t say anything about C functions. Is there a pure Swift way to retrieve the machine identifier, or will I have to bridge into Objective-C for this?

like image 358
bdesham Avatar asked Aug 23 '14 22:08

bdesham


2 Answers

You can do the same in Swift (error checking omitted for brevity):

func platform() -> String {     var size : Int = 0 // as Ben Stahl noticed in his answer     sysctlbyname("hw.machine", nil, &size, nil, 0)     var machine = [CChar](count: size, repeatedValue: 0)     sysctlbyname("hw.machine", &machine, &size, nil, 0)     return String.fromCString(machine)! } 

Update for Swift 3:

func platform() -> String {     var size = 0     sysctlbyname("hw.machine", nil, &size, nil, 0)     var machine = [CChar](repeating: 0,  count: size)     sysctlbyname("hw.machine", &machine, &size, nil, 0)     return String(cString: machine) } 
like image 164
Martin R Avatar answered Oct 06 '22 00:10

Martin R


As of Swift 1.2 (Xcode 6.3 beta-2), @MartinR's code above needs to be modified slightly. sysctlbyname needs a CChar array (i.e. C string) for the first parameter, and an Int (instead of Uint) for the "size" parameter.

func platformModelString() -> String? {     if let key = "hw.machine".cString(using: String.Encoding.utf8) {         var size: Int = 0         sysctlbyname(key, nil, &size, nil, 0)         var machine = [CChar](repeating: 0, count: Int(size))         sysctlbyname(key, &machine, &size, nil, 0)         return String(cString: machine)     }     return nil } 

EDIT: Updated 2017-01-04 for Swift 3 syntax

like image 29
Ben Stahl Avatar answered Oct 06 '22 01:10

Ben Stahl