2014-07-03 37 views
4

有在Objective-C定義的全局枚舉:如何從Objective-C訪問Swift中的枚舉?

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

此代碼設置的一個平臺sharetype:

snsPlatform.shareToType = UMSocialSnsTypeDouban; 

在斯威夫特,我想獲得平臺的sharetype:

var snstype = snsPlatform!.shareToType 
println(snstype) 

結果:UMSocialSnsType (has 1 child)

snstype.toRaw() 

錯誤:UMSocialSnsType does not have a member named "toRaw"

回答

9

從我可以告訴,UMSocialSNSType被宣佈在Objective-C不使用NS_ENUM宏,所以它不是導入爲雨燕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的斯威夫特 - 版本必須是這樣的:

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. 
} 
+1

非常感謝你!我不知道枚舉在「value」屬性前有一個。現在我解決了這個問題! – user3800029

+0

枚舉通常不具有「值」屬性。這是一個結構 - 一種假枚舉。 –

+0

Swift認爲枚舉是struct,因爲UMSocialSNSType是在Objective-C中聲明的,而不使用NS_ENUM宏? – user3800029