목표 c에서의 전방 사원 열거
-
09-09-2019 - |
문제
Objective-C 프로그램에서 열거적 인 가시성에 문제가 있습니다. 두 개의 헤더 파일이 있고 하나는 typedef enum
. 다른 파일을 사용해야합니다 typedef
'D 유형.
똑바로 C에서는 간단합니다 #include
다른 헤더 파일이지만 Objective-C에서는 사용하지 않는 것이 좋습니다. #import
헤더 파일 사이에서 앞으로 사용합니다 @class
필요에 따라 선언. 그러나 열거 유형을 전달하는 방법을 알 수 없습니다.
해당하는 것을 제외하고는 실제 열거 값이 필요하지 않습니다. .m
안전하게 할 수있는 구현 파일 #import
떨어져 있는. 그래서 어떻게 얻을 수 있습니까? typedef enum
헤더에서 인식 할 수 있습니까?
해결책
계속해서 사용하십시오 #import
. 사람들이 사용하는 것이 유일한 이유입니다 @class
가능하면 코드가 컴파일하기 위해 코드가 약간 빠르게 만들어지기 때문입니다. 그러나 문제는 없습니다 #import
하나의 .h 파일은 다른 하나입니다. 실제로 다른 클래스를 연장 할 때는이 작업을 수행해야합니다.
다른 팁
가장 최근의 방법 (Swift 3; 2017 년 5 월)은 Objective-C에서 열거 (NS_ENUM/NS_OPTION)를 선언하는 다음과 같은 것을 사용하는 것입니다.
// Forward declaration for XYZCharacterType in other header say XYZCharacter.h
typedef NS_ENUM(NSUInteger, XYZCharacterType);
// Enum declaration header: "XYZEnumType.h"
#ifndef XYZCharacterType_h
#define XYZCharacterType_h
typedef NS_ENUM(NSUInteger, XYZEnumType) {
XYZCharacterTypeNotSet,
XYZCharacterTypeAgent,
XYZCharacterTypeKiller,
};
#endif /* XYZCharacterType_h */`
귀하의 질문에 대한 답은 계속해서 TypEdef 헤더 파일을 가져 오거나 열거 유형 대신 Nsinteger와 같은 일반 유형을 사용하는 것입니다.
그러나 단지 컴파일 속도보다 헤더 파일을 가져 오지 않아야 할 이유가 더 있습니다.
헤더 파일을 가져 오지 않으면 외부 클래스에 대한 부주의 한 액세스가 줄어 듭니다.
예를 들어, 특정 파일의 변경을 위해 파일 시스템을 추적하는 TrackFileChanges 클래스가 있으며 파일에서 캐시 된 데이터를 저장하는 캐시드 파일 클래스가 있다고 가정 해 봅시다. 후자는 TrackFileChanges*의 개인 IVAR을 사용할 수 있지만 캐시드 파일의 사용을 위해서는 단순히 구현 세부 사항입니다 (이상적으로는 IVAR은 새로운 런타임을 사용하여 사유지로 자동 생성되지만 가능하지 않으면 불가능합니다. ' 구식 시간을 사용하여).
따라서 #import "cachedfile.h"의 클라이언트는 아마도 TrackFileChanges.h에 대한 액세스가 필요하지 않을 것입니다. 그리고 만약 그들이 그렇게한다면, 그들은 스스로 #importing함으로써 그것을 분명히해야합니다. @class trackfilechanges instea를 사용하여 #import "trackfilechanges.h"를 CachedFile.h 캡슐화를 향상시킵니다.
그러나 두 번째 헤더가 첫 번째 클라이언트를 모든 클라이언트에 노출시키려는 경우 두 번째 헤더 파일에서 헤더 파일을 가져 오는 데는 아무것도 없습니다. 예를 들어, 클래스를 선언하는 헤더 파일은 서브 클래스 헤더 파일에서 직접 가져와야하며 프로토콜을 선언하는 헤더 파일은 직접 가져올 수 있습니다 (youy는 @protocol ABC를 사용할 수 있지만이를 피할 수 있음).
컴파일러 확장자를 사용하는 경우 Clang 에서이 순서를 사용할 수 있습니다.
enum Enum;
typedef enum Enum Enum2;
void f(Enum2); // ok. it sees this type's true name.
enum Enum {
E_1
};
// ok. now its declaration is visible and we can use it.
void f(Enum2 e) {
}
참고 : a -Wpedantic
경고.
C ++ 11을 사용하는 경우 선언을 전달하는 데 안전한 열거를 사용해야합니다. enum class Enum:uint8_t;
(컴파일러 확장자가 아님).
객관적인 C.H 파일에서 나에게 열거의 전달 선언에 효과가있는 것은 ProjectName-Swift.h 파일에서 살펴보고 다음과 같은 일이 발생한 내용을 확인했습니다.
Enum swiftenumname : nsinteger;
Swiftenumname의 함수 매개 변수 유형이 있었기 때문에이 전달 선언이 필요했습니다. 그리고 ProjectName-Swift.h를 목표 C.H 파일에 넣을 수는 없습니다.
그런 다음 목표 C.M 파일에서 #Import "ProjectName-Swift.h"를 방금 사용했으며 Swiftenum을 정상적으로 사용했습니다.
이것은 Swift 4.1.2를 사용했습니다.
당신도해야합니다 #import
어쨌든 또는 만 포함하는 별도의 헤더 파일을 만듭니다. typedef
. 헤더에서 헤더 파일을 가져 오지 않으면 컴파일이 더 빠르지 만 다른 것을 변경하지는 않습니다.