阅读DeviceKit源码小结

在iOS开发中,有很多时候我们需要知道设备的信息,根据不同设备、系统版本进行相应的适配工作。DeviceKit就是一款非常不错的第三方库。DeviceKit源码只有一个文件,这里并不会对其做过多的介绍。主要对其中用到的一些知识点做点小结。

1.utsname

utsname是linux系统中描述当前系统和硬件信息的一个struct

#define _SYS_NAMELEN    256
struct  utsname {
    char    sysname[_SYS_NAMELEN];  // 系统名称
    char    nodename[_SYS_NAMELEN]; //系统的网络名称
    char    release[_SYS_NAMELEN];  //发布级别
    char    version[_SYS_NAMELEN];  //系统版本信息
    char    machine[_SYS_NAMELEN];  //硬件信息
};
int uname(struct utsname *);//提供一个获取结构体信息的方法

// 用例
var systemInfo = utsname()
uname(&systemInfo)

/*1. 可以看出这是由几个字符数组组成的结构体
  2. 这里通过machine字符串获取硬件信息
 */
// 附带提下ProcessInfo类,用于获取进程的相关信息以及该进程所在系统的操作系统信息等
let identifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"

2.Mirror

由于Swift中并不提倡使用Runtime,而是像其他语言一样使用反射(Reflect),其本身是个结构体。

struct Mirror {
   public let subjectType: Any.Type     //对象的类型
   public let children: Mirror.Children  //对象的子节点
   public let displayStyle: Mirror.DisplayStyle? //对象的展示风格(class,struct,enum,collection等等)
   public var superclassMirror: Mirror? { get }  //对象父类的mirror
}
// 通过遍历子节点,可以获取所需要的信息
let mirror = Mirror(reflecting: systemInfo.machine)
// 拼接字符串
let identifier = mirror.children.reduce("") { (identifier, element) in
    guard let value = element.value as? Int8, value != 0 else {
       return identifier
    }
    return identifier + String(UnicodeScalar(UInt8(value)))
}

3. indirect 关键字

indirect enum属于一个语法方面的知识点,在学习Swift时有过了解,但在实际应用中并没有碰到过,其主要对enum中的case添加了一个中间件,实现了递归的效果,当然也可以直接修饰 enum。

enum Device {
    case iPadPro12Inch
    ...
  
    case unknown(String)

    indirect case simulator(Device) //修饰某个case
}
indirect enum Test {
    ...
}
//  通过这个关键字,可以很方便用递归实现一些类似的功能

4.Equtable,CustomStringConvertible协议

Equtable协议主要给类型添加是否相等的判断方法,而实现CustomStringConvertible则可对某个对象进行描述

extension Device: CustomStringConvertible {
    var description: String {
            switch self {
            case .iPhone4: return "iPhone 4"
            case .iPhone4s: return "iPhone 4s"
            ...
    }
}
extension Device: Equatable {
    public static func ==(lhs: Device, rhs: Device) -> Bool {
        return lhs.description == rhs.description
    }
}
// 更进一步还有Comparable: Equatable协议
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTUR...
    guoshengboy阅读 7,412评论 0 2
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,276评论 4 61
  • 初秋黄昏 散去炙热的余阳 小猫慵懒在石阶上 一二三四只 层叠枯叶里 蜷缩着多少悄悄话 ...
    忍冬君阅读 1,898评论 0 9
  • 当下,除了房地产金融,最热门的非收藏莫属。古董古玩,艺术品市场成为投资的新领域,当下如此,未来势头依旧。 收藏之风...
    月月收藏阅读 4,761评论 0 0
  • 丽人行 杜甫[1] 三月三日[2]天气新,长安水边多丽人。 态浓意远淑且真,肌理细腻骨肉匀。 绣罗衣裳照暮春,蹙[...
    古诗新读阅读 3,173评论 0 1