【问题标题】:How do I access an enum in Swift from Objective-C?如何从 Objective-C 访问 Swift 中的枚举?
【发布时间】:2014-07-03 04:02:42
【问题描述】:

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

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

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

snsPlatform.shareToType = UMSocialSnsTypeDouban;

在 Swift 中,我想获取平台的 sharetype:

var snstype = snsPlatform!.shareToType
println(snstype)

结果:UMSocialSnsType (has 1 child)

snstype.toRaw()

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

【问题讨论】:

    标签: objective-c enums swift


    【解决方案1】:

    据我所知,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.
    }
    

    【讨论】:

    • 非常感谢!我不知道枚举之前有一个“值”属性。现在我解决问题了!
    • 枚举通常没有“值”属性。这是一个结构——有点像假枚举。
    • Swift 认为枚举是结构,因为 UMSocialSNSType 是在 Objective-C 中声明的,没有使用 NS_ENUM 宏?
    • 添加了更多解释,以便您可以看到这与 Swift 导入 NS_ENUM 枚举的方式之间的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2020-12-14
    • 2015-10-14
    • 2015-02-14
    相关资源
    最近更新 更多