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 도트 표기법을 사용하여 사용할 수 있습니다.
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
'development' 카테고리의 다른 글
Swift performSelector : withObject : afterDelay :를 사용할 수 없습니다 (0) | 2020.06.29 |
---|---|
텍스트 파일의 내용을 자바 스크립트 변수에 어떻게로드합니까? (0) | 2020.06.29 |
Visual Studio 2005에서 컴파일 시간이 매우 느림 (0) | 2020.06.29 |
마지막 푸시를 Git으로 롤백하는 방법이 있습니까? (0) | 2020.06.29 |
엘릭서에서 문자열을 결합하는 방법? (0) | 2020.06.29 |