Using sysctlbyname() from Swift

前端 未结 2 1401
感情败类
感情败类 2020-12-10 11:06

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;         


        
相关标签:
2条回答
  • 2020-12-10 11:44

    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)
    }
    
    0 讨论(0)
  • 2020-12-10 11:47

    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

    0 讨论(0)
提交回复
热议问题