문제

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. 헤더에서 헤더 파일을 가져 오지 않으면 컴파일이 더 빠르지 만 다른 것을 변경하지는 않습니다.

C ++가 열거 선언 선언을 지원하지 않는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top