xcode – Swift和比较C typedef枚举
发布时间:2020-12-15 01:43:37 所属栏目:百科 来源:网络整理
导读:我最近更新到Xcode-Beta4.我正在使用c api,并且有一个类似于这样的typedef枚举: typedef enum { XML_ELEMENT_NODE= 1,XML_ATTRIBUTE_NODE= 2,...} xmlElementType; 现在我有一个xml节点,我要检查哪种类型.因此,正确的方法是: if currentNode.memory.type !
我最近更新到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_ELEMENT_NODE.现在这不会起作用.在这两种情况下,我都会收到错误xmlElementType无法转换为UInt8 解决方法
最简单的解决方法是找到标头并用typedef NS_ENUM(…)替换typedef枚举.此解决方案的问题在于团队中的每个人都必须进行更改.
问题是由C enum转换为opaque类型(struct?)C.xmlElementType引起的.此类型具有一个类型为UInt32的属性值.不幸的是,这家酒店不公开.您可以从调试器中调用它,但在编译代码中使用它会导致错误. 我设法使用反射做了一个解决方法,但这是一个很大的黑客: 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转换功能更稳定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |