Xcode Swift和比较C typedef枚举

Xcode Swift和比较C typedef枚举,xcode,swift,Xcode,Swift,我最近更新到了Xcode-Beta4。我使用的是c api,有一个typedef枚举,如下所示: typedef enum { XML_ELEMENT_NODE= 1, XML_ATTRIBUTE_NODE= 2, ... } xmlElementType; 现在我有了一个xml节点,我想检查它的类型。因此,正确的方法是: if currentNode.memory.type != XML_ELEMENT_NODE { 在Beta 3中,我不得不用

我最近更新到了Xcode-Beta4。我使用的是c api,有一个typedef枚举,如下所示:

typedef enum {
    XML_ELEMENT_NODE=       1,
    XML_ATTRIBUTE_NODE=     2,
    ...
} xmlElementType;
现在我有了一个xml节点,我想检查它的类型。因此,正确的方法是:

if currentNode.memory.type != XML_ELEMENT_NODE {

在Beta 3中,我不得不用
1
替换
XML\u元素\u节点。现在这不起作用了。在这两种情况下,我都会得到错误
xmlementtype不能转换为UInt8

最简单的解决方法是找到标题并用
typedef NS_enum(…)
替换
typedef enum
。这个解决方案的问题是团队中的每个人都必须做出改变

问题是由于C枚举被转换为不透明类型(struct?
C.xmlElementType
)造成的。此类型有一个类型为UInt32
的属性
。不幸的是,该物业不是公共的。您可以从调试器调用它,但在编译代码中使用它会导致错误

我设法用
reflect
做了一个变通方法,但这是一个大难题:

extension xmlElementType : Equatable {
}

public func ==(lhs: xmlElementType, rhs: xmlElementType) -> Bool {
    var intValue1 = reflect(lhs)[0].1.value as UInt32
    var intValue2 = reflect(rhs)[0].1.value as UInt32

    return (intValue1 == intValue2)
}

var elementType = currentNode.memory.type

if elementType == xmlElementType(1) {
    println("Test")
}
我认为这是一个错误。要么定义等式,要么以某种方式将结构转换为整数

编辑:

另一个选项是将
内联
转换函数添加到桥接头:

static inline UInt32 xmlElementTypeToInt(xmlElementType type) {
    return (UInt32) type;
}
然后把平等定义为

public func ==(lhs: xmlElementType, rhs: xmlElementType) -> Bool {
    return ((xmlElementTypeToInt(lhs) == xmlElementTypeToInt(rhs))
}
但是,我发现最简单的选择是将结构强制转换为
UInt32

public func ==(lhs: xmlElementType, rhs: xmlElementType) -> Bool {
    var leftValue: UInt32 = reinterpretCast(lhs)
    var rightValue: UInt32 = reinterpretCast(rhs)

   return (leftValue == rightValue)
}

请注意,这不太可靠,因为您必须确保结构实际上有32个字节,例如,它不是
UInt8
。C转换功能更稳定。

谢谢!这是可行的,但我必须经常调用这个等式,这种方式爆炸了时间,我的应用程序现在需要解析xml文件(从2秒到45;)@Lupurus添加了更多选项。最后一种方式工作得更好更快,但它并不漂亮,速度也不如Xcode beta 3:(嗯……你的第二种方式不起作用“…无法转换为UInt32”@Lupurus-真的吗?你把它放在哪里了?C枚举应该可以转换为整数。不幸的是,
typedef NS_enum(…)
对我不起作用(XCode版本6.1.1(6A2008a)).Swift相等的
内联
转换就像一个符咒!内联转换到桥接头,这是真的。我发现相等方便的地方是将
MyLib桥接助手.Swift
放在桥接头的同一文件夹中,并将相等放在那里,因为这就是它的位置逻辑上属于。非常好的解决方案,谢谢!