2017-01-12 32 views
2

我們知道如何公開斯威夫特枚舉到的OBJ-C:我們如何將一個可選的枚舉值從Swift返回給Obj-C?

@objc enum Animal: Int { 
    case Cat, Dog 
} 

但是,編譯器抱怨說,下面的 「無法在的OBJ-C代表」:

func myAnimal() -> Animal? { 
    if hasPet() { 
     return .Cat 
    } else { 
     return nil 
    } 
} 

想法?

+2

在您的枚舉中添加'case none'? –

+0

錯誤消息正在表達事實。在Objective-C中,你不能表示非引用類型的可選值。一種可能的解決方法是在你的枚舉中加入'nil'類的情況 - '沒有,貓,狗'的情況。 – OOPer

+1

我發現一個可選的枚舉相當有趣。枚舉應該代表幾種可能情況之一。使其可選添加一個隱藏的狀態的母親。正如@CodeDifferent建議的那樣,我會有一個「無」情況。你我不確定這是否能解決你的問題。 – vikingosegundo

回答

0

Swift中的可選Ints不映射到Objective-C中的類型。問題是你的myAnimal()方法返回的是無法在Objective-C中表示的類型。

的方式我看到它,你有兩個選擇......

選項1:更改方法的返回類型:

func myAnimal() -> NSNumber? { 
    // method body goes here. 
} 

這並沒有真正因爲在Objective-C看起來很大,你」 ð必須做這樣的事情:

if (myAnimal().integerValue == AnimalCat) { 
    // do stuff here 
} 

選項2:在您的枚舉添加一個包羅萬象的情況下

@objc enum Animal: Int { 
    case none = 0 
    case cat = 1 
    case dog = 2 

    init(rawValue: Int) { 
    switch rawValue { 
    case 1: self = Cat 
    case 2: self = Dog 
    default: self = None 
    } 
    } 
} 

// Updated method signature that makes the compiler happy. 
func myAnimal() -> Animal { 
    if hasPet() { 
    return .Cat 
    } else { 
    return .None 
    } 
} 

這樣,你可以改變你的方法簽名不返回一個可選的,編譯器會很高興。

相關問題