web-dev-qa-db-ja.com

Obj-CでSwiftのEnumを使用することは可能ですか?

Obj-Cクラスの一部をSwiftに変換しようとしています。そして、他のいくつかのObj-Cクラスは、その変換されたクラスでまだenumを使用しています。 Pre-Release Docsで検索しましたが、見つからないか、見逃したかもしれません。 Obj-CクラスでSwift enumを使用する方法はありますか?または、この問題のドキュメントへのリンクですか?

これが、古いObj-Cコードと新しいSwiftコードで列挙型を宣言した方法です。

私の古いObj-Cコード:

typedef NS_ENUM(NSInteger, SomeEnum)
{
    SomeEnumA,
    SomeEnumB,
    SomeEnumC
};

@interface SomeClass : NSObject

...

@end

私の新しいSwiftコード:

enum SomeEnum: NSInteger
{
    case A
    case B
    case C
};

class SomeClass: NSObject
{
    ...
}

更新:回答から。 Swift 1.2より古いバージョンでは実行できません。しかし、この公式によると Swift Blog 。 XCode 6.3と共にリリースされたSwift 1.2では、enumの前に@objcを追加することにより、Objective-CでSwift Enumを使用できます。

129
myLifeasdog

Swiftバージョン1.2(Xcode 6.3)以降では可能です。 enum宣言の前に@objcを付けるだけです

@objc enum Bear: Int {
    case Black, Grizzly, Polar
}

Swift Blog から恥知らずに取得


Objective-Cでは、これは次のようになります

Bear type = BearBlack;
switch (type) {
    case BearBlack:
    case BearGrizzly:
    case BearPolar:
       [self runLikeHell];
}
200
Daniel Galasko

CocoaおよびObjective-CでSwiftを使用 ガイドから:

Swiftクラスまたはプロトコルは、Objective-Cでアクセスして使用できるように@objc属性でマークする必要があります。 [...]

Objective-Cと互換性がある限り、@ objc属性でマークされたクラスまたはプロトコル内のすべてにアクセスできます。これは、ここにリストされているようなSwiftのみの機能を除外します。

Generics Tuples /Swiftで定義されている列挙/ Swiftで定義されている構造/ Swiftで定義されているトップレベル関数/ Swiftで定義されたグローバル変数/ Swiftで定義されたタイプエイリアス/ Swiftスタイルの可変要素/入れ子になった型/ Curried関数

そのため、Objective-CクラスではSwift列挙型を使用できません。

31
hpique

選択した回答を展開するには...

NS_ENUM()を使用して、SwiftとObjective-Cの間でSwiftスタイルの列挙型を共有できます。

これらは、NS_ENUM()を使用してObjective-Cコンテキストで定義する必要があり、Swiftドット表記を使用して使用可能になります。

CocoaとObjective-CでSwiftを使用

Swiftは、Swift列挙として、NS_ENUMマクロでマークされたCスタイルの列挙としてインポートします。つまり、列挙値の名前のプレフィックスは、システムフレームワークで定義されているか、カスタムコードで定義されているかにかかわらず、Swiftにインポートされるときに切り捨てられます。

Objective-C

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
   UITableViewCellStyleDefault,
   UITableViewCellStyleValue1,
   UITableViewCellStyleValue2,
   UITableViewCellStyleSubtitle
};

Swift

let cellStyle: UITableViewCellStyle = .Default
30
SirNod

Swift 4.1、Xcode 9.4.1:

1)Swift enumには@objcをプレフィックスとして付け、Intタイプにする必要があります。

// in .Swift file:
@objc enum CalendarPermission: Int {
    case authorized
    case denied
    case restricted
    case undetermined
}

2)Objective-Cの名前は、enum名+ケース名、たとえばCalendarPermissionAuthorized

// in .m file:
// point to something that returns the enum type (`CalendarPermission` here)
CalendarPermission calPermission = ...;

// use the enum values with their adjusted names
switch (calPermission) {
    case CalendarPermissionAuthorized:
    {
        // code here
        break;
    }
    case CalendarPermissionDenied:
    case CalendarPermissionRestricted:
    {
        // code here
        break;
    }
    case CalendarPermissionUndetermined:
    {
        // code here
        break;
    }
}

そしてもちろん、Objective-Cファイルのインポートリストの最後のアイテムとして、Swiftブリッジングヘッダーをインポートすることを忘れないでください。

#import "MyAppViewController.h"
#import "MyApp-Swift.h"
4
leanne

ObjCコードをそのまま保持する場合は、プロジェクトにヘルパーヘッダーファイルを追加できます。

Swift2Objc_Helper.h

ヘッダーファイルに次の列挙型を追加します。

typedef NS_ENUM(NSInteger, SomeEnum4ObjC)
{
   SomeEnumA,
   SomeEnumB
};

.mファイルに変更を加える別の場所がある場合があります。隠しヘッダーファイルを含めるには:

#import "[YourProjectName]-Swift.h"

[YourProjectName]をプロジェクト名に置き換えます。このヘッダーファイルは、すべてのSwift定義済み@objcクラス、列挙型をObjCに公開します。

列挙型からの暗黙的な変換に関する警告メッセージが表示される場合があります...問題ありません。

ところで、このヘッダーヘルパーファイルを使用して、#define定数などのいくつかのObjCコードを保持できます。

2
David.Chu.ca

これはもう少し役立つかもしれません

問題ステートメント:-Swiftクラスに列挙型があり、他のSwiftクラスからアクセスしています。 Objective Cクラス。

Objective-Cクラスからアクセスする前に:-

enum NTCType   {
    case RETRYNOW
    case RETRYAFTER
}
 var viewType: NTCType? 

Objective Cクラスからアクセスするための変更

@objc  enum NTCType :Int  {
    case RETRYNOW
    case RETRYAFTER
}

値に渡す関数を追加します

  @objc  func setNtc(view:NTCType)  {
        self.viewType = view; // assign value to the variable
    }
0
Anurag Bhakuni

(私のように)String列挙型を実際に使用したい場合は、objective-c専用のインターフェイスを作成できます。例えば:

enum Icon: String {
    case HelpIcon
    case StarIcon
    ...
}

// Make use of string enum when available:
public func addIcon(icon: Icon) {
    ...
}

// Fall back on strings when string enum not available (objective-c):
public func addIcon(iconName:String) {
    addIcon(Icon(rawValue: iconName))
}

もちろん、これにより、オートコンプリートの利便性が得られません(objective-c環境で追加の定数を定義しない限り)。

0
Lukas Kalinski