Xcode Swift和比较C typedef枚举
我最近更新到了Xcode-Beta4。我使用的是c api,有一个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中,我不得不用
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
放在桥接头的同一文件夹中,并将相等放在那里,因为这就是它的位置逻辑上属于。非常好的解决方案,谢谢!