【问题标题】:sysctlbyname failing in swift 1.2sysctlbyname 在 swift 1.2 中失败
【发布时间】:2015-04-09 17:28:37
【问题描述】:

我让这段代码在 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, &size, nil, 0) ^ 错误:无法使用类型为“(String,inout [(CChar)],inout UInt,nil,Int)”的参数列表调用“sysctlbyname” sysctlbyname("hw.machine", &machine, &size, nil, 0)

感谢任何帮助

【问题讨论】:

标签: swift


【解决方案1】:

解决方案在您代码的注释中:大小现在是 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, UnsafeMutablePointer, UnsafeMutablePointerInt>, UnsafeMutablePointer, Int)'

【讨论】:

  • 谢谢@Airspeed :) 我完全错过了
【解决方案2】:

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)!
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2016-07-13
    • 1970-01-01
    • 2019-12-16
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多