[objective-c] 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에서는 수행 할 수 없습니다. 그러나이 공식 스위프트 블로그 에 따르면 . 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
}

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

참고 : String 열거 형 또는 관련 값이있는 열거 형에서는 작동하지 않습니다. 열거 형은 Int-bound해야합니다.


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

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


답변

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

를 사용하여 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


답변

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

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

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

제네릭 튜플 / Swift에 정의 된 구조 / Swift에 정의 된 구조 / Swift에 정의 된 최상위 함수 / Swift에 정의 된 전역 변수 / Swift에 정의 된 Typealiases / Swift 스타일 가변형 / 중첩 유형 / Cureded 함수

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


답변

스위프트 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;
    }
}

물론 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 코드를 유지할 수 있습니다.


답변

(나처럼) 실제로 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 환경에서 추가 상수를 정의하지 않는 한).


답변

이것은 조금 더 도움이 될 수 있습니다

문제 설명 :-나는 스위프트 클래스에 열거 형을 가지고 있는데, 나는 다른 스위프트 클래스에서 액세스하고 있으며 이제 목표 C 클래스 중 하나에서 액세스해야합니다.

objective-c 클래스에서 액세스하기 전에 :-

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

객관적인 c 클래스에서 액세스하기위한 변경 사항

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

값에 전달하는 함수를 추가하십시오.

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