我正在使用this Gist中的代码来确定我的应用运行的iOS设备(例如iPhone5,1
):
- (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表示C数据类型得到了很好的支持,但它没有提到C函数的任何内容。是否有纯粹的Swift方法来检索机器标识符,或者我是否必须为此目标桥接到Objective-C?
答案 0 :(得分:43)
您可以在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)
}
答案 1 :(得分:14)
从Swift 1.2(Xcode 6.3 beta-2)开始,@ MartinR上面的代码需要稍加修改。 sysctlbyname需要第一个参数的CChar数组(即C字符串),以及“size”参数的Int(而不是Uint)。
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
}
编辑:更新2017-01-04更新 Swift 3 语法