4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Objective-CのHeaderでSwiftのenumを使う

Posted at

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に書き換えたい。

4
5
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
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?