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ライフを!