在Swift中初始化C结构

在Swift中初始化C结构,swift,Swift,我在从Swift调用statfs()时遇到问题。该调用使用了一个名为statfs的结构作为参数,swift编译器似乎混淆了这两者 此代码告诉我结构未初始化,因此无法编译: var sb : statfs if(statfs(fd, &sb) == 0) { //... } 但是当我尝试初始化结构时(我尝试了“var sb:statfs=statfs()”和“var sb:statfs=statfs(f_bsize:0,f_iosize:0,…”),它告诉我参数不匹配,它似乎在寻

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

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

var sb : statfs
if(statfs(fd, &sb) == 0)
{
    //...
}
但是当我尝试初始化结构时(我尝试了“var sb:statfs=statfs()”和“var sb:statfs=statfs(f_bsize:0,f_iosize:0,…”),它告诉我参数不匹配,它似乎在寻找函数的参数而不是结构

所以,我猜我一定缺少一些语法上的糖分,让编译器意识到它应该关注结构,而不是函数


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

问题是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)
///通用初始值设定项
函数blankof(类型:T.type)->T{
var ptr=unsafemeutablepointer.alloc(sizeof(T))
var val=ptr.memory
ptr.destroy()
返回值
}
导入达尔文
typealias StatFS=StatFS//这就做到了
var fs=blankof(StatFS)
println(statfs(“/”,&fs))
println(fs.fffree)

关于你的第二个问题(你是否应该将其单独列为一个问题?;-):

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

试试这个:

func open(x, y) {
  Darwin.open(x, y)
}
就像在这里:

这很好!但是,在查看文档后:UnsafeMutablePointer.alloc的参数是一个T的值,而不是字节数-因此这里是“1”。此外,ptr.move()与.memory和.destroy()的作用相同,但速度更快,因此您可以将其缩减为一行。