Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift: Trouble Using Enums Declared in Objective-C, In Swift

OK. Looked at the various answers when I typed out the question, and don't see the answer listed.

This seems such a basic, fundamental issue that I MUST be doing something wrong, but I am being driven crazy (actually, not much of a "drive." More of a short putt) trying to figure out what I am getting wrong.

I have created a test project that can be downloaded here (small project).

In any case, I encountered this, when working on importing a large Objective-C SDK that I wrote into Swift.

Everything works great. Until... I try to do comparisons on enums declared in C.

Obviously, C enums are not turned into Swift enums, but I am having trouble figuring out how to use them.

Here's a sample of what you will see in the test project;

I have a couple of C files that declare enums:

#import <Foundation/Foundation.h>

typedef enum
{
    StandardEnumType_Undef  = 0xFF,
    StandardEnumType_Value0 = 0x00,
    StandardEnumType_Value1 = 0x01,
    StandardEnumType_Value2 = 0x02
} StandardEnumType;

typedef NS_ENUM ( unsigned char, AppleEnumType )
{
    AppleEnumType_Undef  = 0xFF,
    AppleEnumType_Value0 = 0x00,
    AppleEnumType_Value1 = 0x01,
    AppleEnumType_Value2 = 0x02
};

StandardEnumType translateIntToEnumValue ( int inIntValue );
int translateEnumValueToInt ( StandardEnumType inValue );

AppleEnumType translateIntToAppleEnumValue ( int inIntValue );
int translateAppleEnumValueToInt ( AppleEnumType inValue );

The functions mentioned do pretty much what it says on the tin. I won't include them.

I did the bridging header and all that.

I am trying to use them in the initial load of the Swift app:

    func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool
    {
        let testStandardConst:StandardEnumType = translateIntToEnumValue ( 0 )

//        Nope.
//        if ( testStandardConst.toRaw() == 0 )
//        {
//            
//        }

//        This don't work.
//        if ( testStandardConst == StandardEnumType_Value0 )
//        {
//            
//        }

//        Neither does this.
//        if ( testStandardConst == StandardEnumType_Value0.toRaw() )
//        {
//            
//        }

//        Not this one, either.
//        if ( testStandardConst.toRaw() == StandardEnumType_Value0 )
//        {
//            
//        }

        let testAppleConst:AppleEnumType = translateIntToAppleEnumValue ( 0 )

//        This don't work.
//        if ( testAppleConst == AppleEnumType.AppleEnumType_Value0 )
//        {
//            
//        }

//        Neither does this.
//        if ( testAppleConst == AppleEnumType.AppleEnumType_Value0.toRaw() )
//        {
//            
//        }

//        Nor this.
//        if ( testAppleConst == .AppleEnumType_Value0 )
//        {
//            
//        }

        return true
    }

I can't seem to get the $#@!! enums to compare to either ints or anything else.

I am often humbled by the stupid errors I make, and sometimes need them pointed out to me, so please humble me.

Thanks!

like image 287
Chris Marshall Avatar asked Jul 29 '14 14:07

Chris Marshall


1 Answers

When working with typedef NS_ENUM enums in swift you should omit enum name in comparison and assignment, here how you can compare it:

if ( testAppleConst == .Value0 ) { ... }

You can read more about this in Apple do s for Swift here.

like image 102
Keenle Avatar answered Nov 15 '22 09:11

Keenle