[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 도트 표기법을 사용하여 사용할 수 있습니다.
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
}