LoginSignup
1
1

More than 1 year has passed since last update.

Objective-Cで定義した列挙型(enum)をSwiftからrawValueで初期化する際の注意

Posted at

Swiftが出てきて、非常に協力になったenum。
今回はそのenumとObjective-Cが絡んだ場合に出会った事象について記述します。

はじめにのenumのおさらい

Objective-Cのenumは、原則Integerを使用した値になります

typedef NS_ENUM(NSInteger, Animal) {
    AnimalDog = 0,
    AnimalCat = 1,
    AnimalBird = 2,
};

Swiftの場合、Objective-Cとは違って値を持たずとも定義出来ます

enum: Animal {
    case dog
    case cat
    case biard
}

設定する値もInt以外が使用出来ます。

enum: Color: String {
    case red = "red"
    case blue = "blue" 
    case yellow = "yellow"
}

値からenumを初期化する場合はイニシャライザを使用します。
定義されていない値を渡した場合はnilが返却されます。

let enum1 = Color(rawValue: "red") // .red
let enum2 = Color(rawValue: "green") // nil

また、protocolに準拠させたり、拡張を記述することも出来ます。→ 参考

Objective-Cで定義したenumをSwiftから使用する

Objective-C側で定義したenumをSwiftから使用することが出来るのですが、ここで困ったことが。
Objective-Cで定義したenum値

typedef NS_ENUM(NSInteger, Animal) {
    AnimalDog = 0,
    AnimalCat = 1,
    AnimalBird = 2,
};

こちらをswiftから定義されていない値で初期化した場合、nilが返ってこないのです!

let animal = Animal(rawValue: 5)
print(animal) // Optional(__C.Animal)

対処法

一番手っ取り早いのはenumの定義をSwiftファイルに移動させることでした。
移動させるだけで、イニシャライザで定義されていない値を渡すとnilを返すようになります。

最後に

良きObjective-Cライフを!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1