2017-01-12 8 views
2

我々がobj-Cにスウィフトの列挙型を公開する方法を知っている:SwiftからObj-Cにオプションのenum値を返すにはどうすればよいですか?

@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では、非参照型のオプション値を表すことはできません。 1つの可能な回避策は、 'nil'のようなケースをenumに追加することです - ' case none、cat、dog'。 – OOPer

+1

私は、面白いオプションの列挙型を見つけました。列挙型は、いくつかの可能性のあるケースの1つを表す必要があります。それをオプションにすると、隠された状態の母親が追加されます。 @CodeDifferentによって提案されているように、代わりに 'none'の場合があります。あなたはそれがあなたの問題を解決するかどうかはわかりません。 – vikingosegundo

答えて

0

オプションSwiftのIntsはObjective-Cの型にマップしません。問題は、myAnimal()メソッドがObjective-Cで表現できない型を返すことです。

私はそれを参照してください方法は、次の2つのオプションを持っている...

オプション1:あなたのメソッドの戻り値の型に変更します。

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

をこれは本当にあなた」のObjective-Cで以来、偉大ないないようです

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

オプション2:このような何かをしなければならないdは、あなたの列挙型でキャッチオールケースを追加

@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 
    } 
} 

このようにして、オプションシグニチャを返さないようにメソッドのシグネチャを変更することができ、コンパイラは満足できます。

関連する問題