加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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转换功能更稳定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读