在Swift中初始化C结构

时间:2014-08-03 23:43:46

标签: swift

我从Swift调用statfs()时遇到问题。该调用使用一个名为statfs的结构作为参数,而swift编译器似乎让两者混淆不清。

此代码告诉我结构未初始化,因此无法编译:

var sb : statfs
if(statfs(fd, &sb) == 0)
{
    //...
}

但是当我尝试初始化结构时(我已尝试" var sb:statfs = statfs()"和#34; var sb:statfs = statfs(f_bsize:0, f_iosize:0,...)"它告诉我参数不匹配,它似乎在寻找函数的参数而不是结构。

所以,我猜测必须有一些我缺少的语法糖才能让编译器意识到应该看结构而不是函数。

我有一个类似的命名问题,更不方便:我想有一个名为open()的方法,它调用posix命令open(),但我无法让编译器实现我想调用posix命令而不是我自己的方法。我通过简单地重命名我的方法解决了这个问题,但是必须有一些语法让编译器知道当存在多个同名项时你指的是哪个项目。

2 个答案:

答案 0 :(得分:1)

问题是Swift将函数名和结构名都导入为statfs。您可以通过typealias消除歧义。

/// universal initializer
func blankof<T>(type:T.Type) -> T {
    var ptr = UnsafeMutablePointer<T>.alloc(sizeof(T))
    var val = ptr.memory
    ptr.destroy()
    return val
}
import Darwin
typealias StatFS = statfs // this does the trick
var fs = blankof(StatFS)
println(statfs("/", &fs))
println(fs.f_ffree)

答案 1 :(得分:0)

关于你的第二个问题(你应该把它分开吗?; - ):

  

我希望有一个名为open()的方法,它调用了posix命令open(),但我无法让编译器意识到我想调用posix命令而不是我自己的方法。

试试这个:

func open(x, y) {
  Darwin.open(x, y)
}

喜欢这里:   https://github.com/AlwaysRightInstitute/SwiftSockets/blob/master/ARISockets/Socket.swift#L99