dram.me

Swift的Glibc模块

补遗

  1. Swift强大的C接口能力的另一个例子是Swift Package Manager中对接系统库的示例。—— 2017-05-16

Swift语言在整体的设计基调上相对传统,但也不乏创新的点。这里要来说说的是其对C库的支持。

Swift包括一个Glibc模块,是对Glibc API的封装,而Swift的创新点在于利用clang实现了C头文件的解析和封装,这样接口封装这样繁重的工作可以自动化地完成。

以下通过Swift中一小段代码来感受下Glibc的便利性,代码摘取自benchmark/utils/DriverUtils.swift

import Glibc

typealias TimeT = timespec
func getTime() -> TimeT {
  var ticks = timespec(tv_sec: 0, tv_nsec: 0)
  clock_gettime(CLOCK_REALTIME, &ticks)
  return ticks
}

其中timespecclock_gettimeCLOCK_REALTIME都是C库原生定义的名称,不需要任何修改就可以直接在Swift代码中使用。另外对于ticks的初始化,是对timespec结构体的实例化,较C代码更为简洁。

下面再给出一个直接调用time获取时间的示例代码:

import Glibc

var now = time_t()
time(&now)
print(now)

或者:

import Glibc
var now = time(nil)
print(now)