如何访问C#属性?

3

我正在使用libxml2框架编写我的Swift代码,不确定访问属性的正确语法是什么。

在Objective-C中,您可以使用以下代码访问属性:

currentNode->name

但是当我尝试在Swift中使用相同的语法时,我遇到了以下错误:

"花括号块是未使用的闭包"

我猜这是因为“->”已经被保留了。

我还尝试过:

currentNode.name

但我遇到了错误:

"'xmlNodePtr'没有名为'name'的成员"

是否可能在Swift中访问C属性?


3
澄清说明:这些实际上不是属性,至少不是 ObjC @property 的意义。 -> 是指针解引用和结构成员访问的组合。因此,你实际上有一个指向结构体的指针,并且需要对指针进行解引用(以获取结构体本身),然后访问你感兴趣的结构体成员。 (我自己不知道如何在 Swift 中进行此操作。) - Andrew Madsen
感谢您的解释。 - sharikov
1个回答

5

实现此操作的方法是使用UnsafePointer类型的memory变量。

然而,为了加速操作,我更喜欢定义一个自定义运算符来取消引用UnsafePointer类型:

operator postfix & { }

@postfix func &<T>(lhs: UnsafePointer<T>) -> T {
    return lhs.memory;
}

一旦你拥有这个,你可以执行以下操作:
let doc = xmlReadDoc(nil, "my-url", "UTF-8", 0);
let root = xmlDocGetRootElement(doc);

var currentChild = root&.children;
while (currentChild != nil) {
    var str = String.fromCString(UnsafePointer<CChar>(currentChild&.name));
    println("Child name: \(str)");

    currentChild = currentChild&.next;
}

你甚至可以使结果返回一个可空类型,如果你想允许链式调用。

有趣的解决方案。请注意,您不必使用UnsafePointer,特别是如果您正在构建自己的桥接例程以围绕可能能够保证指针安全性的窗口进行操作 - 请参见标准库中的CMutablePointer<T>和相关内容。 - rickster
@rickster 没错,不过OP特别提到了lxml2,所以我的回答是针对它的。 - Richard J. Ross III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接