我正在Swift中创建一个项目。我想显示modelName。我按照以下链接获取modelName
http://myiosdevelopment.blogspot.co.uk/2012/11/getting-device-model-number-whether-its.html
链接中的代码用objective-c编写。但我不知道如何在Swift中导入它。
#import <sys/utsname.h>
请有人帮忙
答案 0 :(得分:12)
sys/utsname.h
会导入Swift,因此您无需从桥接头导入它。但是,使用Swift中的utsname
非常痛苦,因为Swift将固定长度的C数组导入为元组。如果你查看utsname.h
,就会发现struct
的{{1}}成员都是256个长度的utsname
数组:
char
这会像这样导入Swift:
#define _SYS_NAMELEN 256
struct utsname {
char sysname[_SYS_NAMELEN]; /* [XSI] Name of OS */
char nodename[_SYS_NAMELEN]; /* [XSI] Name of this network node */
char release[_SYS_NAMELEN]; /* [XSI] Release level */
char version[_SYS_NAMELEN]; /* [XSI] Version level */
char machine[_SYS_NAMELEN]; /* [XSI] Hardware type */
};
是的,他们使用256 var _SYS_NAMELEN: Int32 { get }
struct utsname {
var sysname: (Int8, Int8, /* ... 254 more times "Int8, " here ... */) /* [XSI] Name of OS */
var nodename: (Int8, Int8, /* ... snip ... */ ) /* [XSI] Name of this network node */
var release: (Int8, Int8, /* ... snip ... */ ) /* [XSI] Release level */
var version: (Int8, Int8, /* ... snip ... */ ) /* [XSI] Version level */
var machine: (Int8, Int8, /* ... snip ... */ ) /* [XSI] Hardware type */
}
s组成元组。在Xcode中这个热闹的自动完成的案例:
目前,无法在不写出所有值的情况下初始化Swift中的元组,因此将其初始化为局部变量将会相当冗长,如上所示。也没有办法将元组转换为数组,因此巨大的元组也不是很有用。
最简单的解决方案是在Objective-C中实现它。
如果你已经开始使用Swift,你可以这样做,但它并不漂亮:
Int8
答案 1 :(得分:0)
该博客文章中显示的代码看起来像C而不是Objective C - 但是我认为你可以在Objective-C中编写一个包装器
为了在Objective-C和swift之间启用桥接,只需在项目中添加一个新的Objective-C文件 - Xcode将提示您是否创建桥接头
回答是,Xcode会自动创建一个<appname>-Bridging-Header.h
文件。打开它并#include
要从swift中使用的任何objective-c头文件。
答案 2 :(得分:0)
在swift 2.0中:
var sysInfo: [CChar] = Array(count: sizeof(utsname), repeatedValue: 0)
let deviceModel = sysInfo.withUnsafeMutableBufferPointer { (inout ptr: UnsafeMutableBufferPointer<CChar>) -> String in
uname(UnsafeMutablePointer<utsname>(ptr.baseAddress))
let machinePtr = ptr.baseAddress.advancedBy(Int(_SYS_NAMELEN * 4))
return String.fromCString(machinePtr)!
}
print(deviceModel)
答案 3 :(得分:0)
在Swift 4中,您只需使用UIDevice模型属性:
func getPhoneModel() -> String {
return UIDevice.current.model
}