如何在swift </sys>中导入<sys utsname.h =“”>

时间:2014-08-19 07:30:58

标签: objective-c swift

我正在Swift中创建一个项目。我想显示modelName。我按照以下链接获取modelName

http://myiosdevelopment.blogspot.co.uk/2012/11/getting-device-model-number-whether-its.html

链接中的代码用objective-c编写。但我不知道如何在Swift中导入它。

#import <sys/utsname.h>

请有人帮忙

4 个答案:

答案 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中这个热闹的自动完成的案例:

Xcode completion of <code>utsname</code> initializer

目前,无法在不写出所有值的情况下初始化Swift中的元组,因此将其初始化为局部变量将会相当冗长,如上所示。也没有办法将元组转换为数组,因此巨大的元组也不是很有用。

最简单的解决方案是在Objective-C中实现它。

如果你已经开始使用Swift,你可以这样做,但它并不漂亮:

Int8

答案 1 :(得分:0)

该博客文章中显示的代码看起来像C而不是Objective C - 但是我认为你可以在Objective-C中编写一个包装器

为了在Objective-C和swift之间启用桥接,只需在项目中添加一个新的Objective-C文件 - Xcode将提示您是否创建桥接头

enter image description here

回答是,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 }