Objective-Cの.h
ファイルでSwiftのenumを使いたいと思ってググったら、この記事をみつけた。
How to reference Swift enum in Objective-C Header - Stack Overflow
-
質問
classだったら@class className;
って書けるんだけど。enumではどうするんだ? -
わかってない人
#include "<ProjectName>-Swift.h"
って書いたらいいんやで
※.h
ファイルに書いたらエラー出る -
1番ましな回答
.m
ファイルに privateプロパティとして書くのはできるで。
privateプロパティとして書けたところで.m
ファイルからしかアクセスできなくて役に立たないので、ええ感じにしてみた。
@objc enum SwiftEnumState: Int {
case foo = 0
case bar
case baz
}
Swift側のenum宣言は普通。Objective-Cで使いたいから@objc
付けて、Int型にしておく。
@interface ObjCClass : NSObject
@property (assign, nonatomic) NSInteger __rawValueOfSwiftEnumState__;
@end
Objective-Cの.h
ファイルに、プロパティとして、enumのrawValueを設定。直接アクセスすんな的な名前をつけとく
extension ObjCClass {
var swiftEnumState: SwiftEnumState {
get {
return SwiftEnumState(rawValue:__rawValueOfSwiftEnumState__) ?? .foo
}
set {
__rawValueOfSwiftEnumState__ = newValue.rawValue
}
}
}
Swift側にextensionでComputedプロパティとして、enumでアクセスできるようにラッパーを用意すると、
@interface ObjCClass (SWIFT_EXTENSION(ProjectName))
@property (nonatomic) enum SwiftEnumState swiftEnumState;
@end
<ProjectName>-Swift.h
に、このように変換されるので、
privateじゃないプロパティとしてenumを使えるようになりました。
あぁ、リファクタリングして全部Swiftに書き換えたい。