sysctlbyname在swift 1.2中失败

时间:2015-04-09 17:28:38

标签: swift

我在swift 1.1中使用了这段代码 不知道如何解决它

var deviceModelIdentifier: String {
    var size : UInt = 0 // Swift 1.2: var size : Int = 0 (as Ben Stahl noticed in his answer)
    //sysctlbyname(_: UnsafePointer<Int8>, _: UnsafeMutablePointer<Void>, _: UnsafeMutablePointer<Int>, _: UnsafeMutablePointer<Void>, _: Int)
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](count: Int(size), repeatedValue: 0)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String.fromCString(machine)!
}

错误:无法使用类型为'(String,nil,inout UInt,nil,Int)'的参数列表调用'sysctlbyname'         sysctlbyname(“hw.machine”,nil,&amp; size,nil,0)         ^ 错误:无法使用类型'(String,inout [(CChar)],inout UInt,nil,Int)的参数列表调用'sysctlbyname''         sysctlbyname(“hw.machine”,&amp; machine,&amp; size,nil,0)

感谢任何帮助

2 个答案:

答案 0 :(得分:4)

解决方案在您的代码中的注释中:大小现在是Int而不是1.2中的Uint,因此编译:

var deviceModelIdentifier: String {
    var size : Int = 0
    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)!
}

(如果您愿意,也可以写var size : size_t = 0

当您浏览不安全的指针锅炉板时,错误消息提示:

  

注意:期望一个类型'的参数列表'(UnsafePointer&lt; Int8&gt;,   UnsafeMutablePointer&LT; Void&gt;,UnsafeMutablePointer&lt; Int &gt;,   UnsafeMutablePointer&LT; Void&gt;,Int)'

答案 1 :(得分:0)

Swift 4.0版

var deviceModel: String {
    var size : Int = 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, encoding: .utf8)!
}