I recently updated to Xcode-Beta4. I\'m working with a c api and there is a typedef enum like this:
typedef enum {
XML_ELEMENT_NODE= 1,
XML_ATT
The simplest workaround is to find the header and replace the typedef enum with an typedef NS_ENUM(...). The problem with this solution is that everybody in your team has to make the changes.
The problem is caused by the fact that the C enum is converted into an opaque type (struct?) C.xmlElementType. This type has one single property value of type UInt32. Unfortunately, this property is not public. You can call it from the debugger but using it in compiled code results in an error.
I managed to do a workaround using reflect but it's a big hack:
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")
}
I think this is a bug. Either the equality should be defined or some way to cast the struct to an integer.
EDIT:
Another option is to add an inline conversion function to your bridging header:
static inline UInt32 xmlElementTypeToInt(xmlElementType type) {
return (UInt32) type;
}
And then define equality as
public func ==(lhs: xmlElementType, rhs: xmlElementType) -> Bool {
return ((xmlElementTypeToInt(lhs) == xmlElementTypeToInt(rhs))
}
However, the most simple option I have found is to brutally cast the struct to an UInt32:
public func ==(lhs: xmlElementType, rhs: xmlElementType) -> Bool {
var leftValue: UInt32 = reinterpretCast(lhs)
var rightValue: UInt32 = reinterpretCast(rhs)
return (leftValue == rightValue)
}
Note this is less reliable because you have to make sure that the struct actually has 32 bytes and it is not an UInt8, for example. The C conversion function is more stable.