development

Obj-C에서 Swift 's Enum을 사용할 수 있습니까?

big-blog 2020. 6. 29. 07:30
반응형

Obj-C에서 Swift 's Enum을 사용할 수 있습니까?


Obj-C 클래스 중 일부를 Swift로 변환하려고합니다. 그리고 다른 Obj-C 클래스는 여전히 변환 된 클래스에서 enum을 사용합니다. Pre-Release Docs에서 검색했는데 찾을 수 없거나 놓쳤을 수 있습니다. Obj-C Class에서 Swift enum을 사용하는 방법이 있습니까? 아니면이 문제의 문서에 대한 링크입니까?

이것이 내가 오래된 Obj-C 코드와 새로운 Swift 코드에서 열거 형을 선언 한 방법입니다.

내 오래된 Obj-C 코드 :

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

@interface SomeClass : NSObject

...

@end

나의 새로운 스위프트 코드 :

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

class SomeClass: NSObject
{
    ...
}

업데이트 : 답변에서. 1.2 이전 버전의 Swift에서는 수행 할 수 없습니다. 그러나이 공식 Swift 블로그 에 따르면 . XCode 6.3과 함께 릴리스 된 Swift 1.2에서는 Objective-C에서 Swift Enum @objc을 앞에 추가하여 사용할 수 있습니다.enum


Swift 버전 1.2 (Xcode 6.3)부터 가능합니다. 단순히 열거 형 선언 앞에@objc

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

스위프트 블로그 에서 뻔뻔스럽게 찍은


Objective-C에서 이것은 다음과 같습니다

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

로부터 코코아와 오브젝티브 -C와 사용 스위프트 가이드 :

Swift 클래스 또는 프로토콜은 Objective-C에서 액세스하고 사용할 수 있도록 @objc 속성으로 표시되어야합니다. [...]

Objective-C와 호환되는 한 @objc 속성으로 표시된 클래스 또는 프로토콜 내의 모든 항목에 액세스 할 수 있습니다. 여기에 나열된 것과 같은 Swift 전용 기능은 제외됩니다.

제네릭 튜플 / 스위프트에 정의 된 열거 형 / 스위프트에 정의 된 구조 / 스위프트에 정의 된 최상위 함수 / 스위프트에 정의 된 전역 변수 / 스위프트에 정의 된 유형 변수 / 스위프트 스타일 가변형 / 중첩 유형 / 카리 함수

따라서 Objective-C 클래스에서 Swift 열거 형을 사용할 수 없습니다.


선택한 답변을 확장하려면 ...

를 사용하여 Swift와 Objective-C간에 Swift 스타일 열거를 공유 할 수 있습니다 NS_ENUM().

그것들을 사용하여 Objective-C 컨텍스트에서 정의해야하며 NS_ENUM()Swift 도트 표기법을 사용하여 사용할 수 있습니다.

로부터 코코아와 사용 스위프트와 목표 - C

Swift는 NS_ENUM매크로 로 표시된 C 스타일 열거를 Swift 열거로 가져옵니다 . 이는 열거 형 값 이름의 접두사가 시스템 프레임 워크 또는 사용자 정의 코드에 정의되어 있는지 여부에 관계없이 Swift로 가져올 때 잘립니다.

목표 -C

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

빠른

let cellStyle: UITableViewCellStyle = .Default

스위프트 4.1, Xcode 9.4.1 :

1) Swift 열거 형은 접두사가 붙어 @objc있고 Int형식 이어야 합니다.

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

2) Objective-C 이름은 열거 이름 + 대소 문자 이름입니다. 예 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;
    }
}

And, of course, remember to import your Swift bridging header as the last item in the Objective-C file's import list:

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

If you prefer to keep ObjC codes as-they-are, you could add a helper header file in your project:

Swift2Objc_Helper.h

in the header file add this enum type:

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

There may be another place in your .m file to make a change: to include the hidden header file:

#import "[YourProjectName]-Swift.h"

replace [YourProjectName] with your project name. This header file expose all Swift defined @objc classes, enums to ObjC.

You may get a warning message about implicit conversion from enumeration type... It is OK.

By the way, you could use this header helper file to keep some ObjC codes such as #define constants.


If you (like me) really want to make use of String enums, you could make a specialized interface for objective-c. For example:

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))
}

Of course, this will not give you the convenience of auto-complete (unless you define additional constants in the objective-c environment).


this might help a little more

Problem statement :- I have enum in swift class, which I am accessing form other swift classes, and Now I need to access it form my one of the objective C class.

Before accessing it from objective-c class :-

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

Changes for accessing it from objective c class

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

and add a function to pass it on the value

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

참고URL : https://stackoverflow.com/questions/24139320/is-it-possible-to-use-swifts-enum-in-obj-c

반응형