Initializing C structs in Swift
我无法从swift调用statfs()。调用使用了一个名为statfs的结构作为参数,而swift编译器似乎将两者混淆了。
此代码告诉我结构未初始化,因此无法编译:
1 2 3 4 5 | 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将函数名和结构名都导入为
1 2 3 4 5 6 7 8 9 10 11 12 | /// 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) |
在你的第二个问题上(你应该把它分开吗?;-)
I wanted to have a class with method named open() that called the posix command open(), but I couldn't get the compiler to realize I wanted to call the posix command instead of my own method.
试试这个:
1 2 3 | func open(x, y) { Darwin.open(x, y) } |
就像在这里:https://github.com/alwaysrightinstitute/swiftsockets/blob/master/arisockets/socket.swift l99