如何从Objective-C访问Swift中的枚举?

时间:2014-07-03 04:02:42

标签: objective-c enums swift

Objective-C中定义了一个全局枚举:

typedef enum {
     UMSocialSnsTypeNone = 0,
     UMSocialSnsTypeQzone = 10,
     UMSocialSnsTypeSina = 11,                 //sina weibo
} UMSocialSnsType;

此代码设置平台的共享类型:

snsPlatform.shareToType = UMSocialSnsTypeDouban;

在Swift中,我想获得平台的分享类型:

var snstype = snsPlatform!.shareToType
println(snstype)

结果:UMSocialSnsType (has 1 child)

snstype.toRaw()

错误:UMSocialSnsType does not have a member named "toRaw"

1 个答案:

答案 0 :(得分:9)

据我所知,UMSocialSNSType在Objective-C中声明而未使用NS_ENUM宏,因此未导入为Swift enum。这意味着您不必使用.toRaw()UMSocialSNSType.Douban,而必须使用不同的枚举值作为常量结构。遗憾的是,该类型也没有设置相应的运算符(==~=),因此您必须比较value属性。

var snstype = snsPlatform!.shareToType

switch snstype.value {
case UMSocialSnsTypeDouban.value:
    println("douban")
case UMSocialSnsTypeEmail.value:
    println("email")
default:
    println("other")
}

if snstype.value == UMSocialSnsTypeDouban.value {
    println("douban")
}

好消息是它看起来像Xcode中的所有常量自动完成,所以你应该能够找到你需要做的比较。


看起来像桥接typedef...enum的Swift版本必须是:

struct UMSocialSnsType {
    var value:Int
    init(_ val:Int) {
        value = val
    }
}
let UMSocialSnsTypeNone  = UMSocialSnsType(0)
let UMSocialSnsTypeQzone = UMSocialSnsType(10)
let UMSocialSnsTypeSina  = UMSocialSnsType(11)
// etc

如果它已在Objective-C中使用NS_ENUM宏声明,它看起来像:

enum UMSocialSnsType: Int {
    case UMSocialSnsTypeNone = 0
    case UMSocialSnsTypeQzone = 10, UMSocialSnsTypeSina // etc.
}