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を使用できます。
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];
}
CocoaおよびObjective-CでSwiftを使用 ガイドから:
Swiftクラスまたはプロトコルは、Objective-Cでアクセスして使用できるように@objc属性でマークする必要があります。 [...]
Objective-Cと互換性がある限り、@ objc属性でマークされたクラスまたはプロトコル内のすべてにアクセスできます。これは、ここにリストされているようなSwiftのみの機能を除外します。
Generics Tuples /Swiftで定義されている列挙/ Swiftで定義されている構造/ Swiftで定義されているトップレベル関数/ Swiftで定義されたグローバル変数/ Swiftで定義されたタイプエイリアス/ Swiftスタイルの可変要素/入れ子になった型/ Curried関数
そのため、Objective-CクラスではSwift列挙型を使用できません。
選択した回答を展開するには...
NS_ENUM()
を使用して、SwiftとObjective-Cの間でSwiftスタイルの列挙型を共有できます。
これらは、NS_ENUM()
を使用して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
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"
ObjCコードをそのまま保持する場合は、プロジェクトにヘルパーヘッダーファイルを追加できます。
Swift2Objc_Helper.h
ヘッダーファイルに次の列挙型を追加します。
typedef NS_ENUM(NSInteger, SomeEnum4ObjC)
{
SomeEnumA,
SomeEnumB
};
.mファイルに変更を加える別の場所がある場合があります。隠しヘッダーファイルを含めるには:
#import "[YourProjectName]-Swift.h"
[YourProjectName]をプロジェクト名に置き換えます。このヘッダーファイルは、すべてのSwift定義済み@objcクラス、列挙型をObjCに公開します。
列挙型からの暗黙的な変換に関する警告メッセージが表示される場合があります...問題ありません。
ところで、このヘッダーヘルパーファイルを使用して、#define定数などのいくつかのObjCコードを保持できます。
これはもう少し役立つかもしれません
問題ステートメント:-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
}
(私のように)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環境で追加の定数を定義しない限り)。