的代码来确定我的应用程序正在运行的iOS设备(例如

问题描述 投票:0回答:1

Swift文档表示C数据类型已得到充分支持,但对C功能没有任何说法。是否有一种纯粹的迅速方法来检索机器标识符,或者我必须为此桥接到Objective-C中?

	
您可以在Swift中执行相同的操作(对简洁的错误检查省略了):

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

swift 6:
ios swift objective-c cocoa-touch
1个回答
59
投票

String(cString:)
现在已弃用,归因于
https://stackoverflow.com/a/79423711/1187415。

func platform() -> String? { var size = 0 if sysctlbyname("hw.machine", nil, &size, nil, 0) != 0 { return nil } var machine = [CChar](repeating: 0, count: size) if sysctlbyname("hw.machine", &machine, &size, nil, 0) != 0 { return nil } return String(utf8String: machine) }

swift 1.2(xcode 6.3 beta-2), @martinr上面的代码需要稍作修改。 sysctlbyname需要第一个参数的CCHAR数组(即C字符串),而“ size”参数。
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:更新了2017-01-04,用于Swift3语法


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.