【问题标题】:How to access C properties?如何访问 C 属性?
【发布时间】:2014-06-13 19:58:05
【问题描述】:

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

在 Objective-C 中,您可以通过以下方式访问该属性:

currentNode->name

但是当尝试在 Swift 中使用相同的语法时,我得到了这个错误:

“带括号的语句块是未使用的闭包”

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

我也试过了:

currentNode.name

但我得到了错误:

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

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

【问题讨论】:

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

标签: objective-c frameworks swift


【解决方案1】:

做到这一点的方法是使用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&lt;T&gt; 和朋友。
  • @rickster 这是正确的,虽然 OP 特别提到了 lxml2,所以这就是我的答案所针对的。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
相关资源
最近更新 更多