我使用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才能做到这一点?
发布于 2014-08-24 07:23:14
您可以在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)
}
发布于 2015-03-09 09:53:58
从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
}
编辑:针对Swift 3语法更新2017-01-04
https://stackoverflow.com/questions/25467082
复制相似问题