본문 바로가기

Swift와 ObjC에서 Deprecated 처리하기

기술적인 이야기/애플 플랫폼 개발 2020. 3. 3.
반응형

Swift와 Objective-C에서 클래스나 메서드, 프로퍼티 등을 Deprecated로 만드는 방법을 정리하는 글입니다.

Deprecated는 단순히 말해서 '곧 사라질 기능'을 표기할 때 사용합니다. 오래된 프레임워크를 버전업 하거나 했을 때 노란 딱지로 빌드 경고가 뜰 때 이런 Deprecated 경고를 종종 볼 수 있습니다. 기능이 이름의 변경 혹은 리팩터링 등으로 바뀌게 될 부분을 미리 알려주는 용도로도 자주 사용되지요.

Swift의 경우

Swift에서는 @available을 통해 deprecated 표기를 할 수 있습니다.

@available(*, deprecated)
class SomeClass { ... }

함수나 메서드도 동일하게 사용합니다.

@available(*, deprecated)
func someFunc() { ... }

빌드 경고 메시지는 message 필드를 추가하여 입력할 수 있습니다.

@available(*, deprecated, message: "use goodFunc instead")
func oldFunc() { ... }

만약 이름이 바뀐 케이스라면 별도로 renamed 필드를 사용할 수도 있습니다. 예를 들어 아래 예제는 빌드 시 deprecated 경고 메시지에 renamed to 'goodFunc'라는 메시지를 추가로 표시해 줍니다.

@available(*, deprecated, renamed: "goodFunc")
func oldFunc() { ... }

제일 첫 필드에 *를 넣었는데, 여기에 특정 플랫폼을 부여할 수 있습니다. 예를 들어 아래 코드는 iOS용으로 빌드할 때만 deprecated 되었다는 경고를 표시합니다.

@available(iOS, deprecated)

플랫폼을 지정할 경우 버전도 지정이 가능합니다.

@available(iOS, deprecated: 9.0)

멀티 플랫폼을 지정하여 deprecated 시킬 수도 있습니다.

@available(iOS, deprecated: 9.0)
@available(macOS, deprecated: 10.11.0)
@available(tvOS, deprecated: 8.0)
func veryOldFunc() { ... }

완전히 사라질 버전을 obsolete 필드를 이용해 지정할 수도 있습니다.

@available(iOS, deprecated: 9.0, obsolete: 10.0)

Swift에서 Deprecated 속성을 표시하는 방법은 이 정도로 정리가 될 것 같습니다.

Objective-C의 경우

Objective-C에서 Deprecated 속성을 표기하는 방법은 다양한 편입니다. 왜 이렇게 다양하게 지원되는지 이유는 모르겠지만 일단 살펴봅시다.

클래스, 프로토콜

클래스나 프로토콜 전체를 deprecated 시키려면 아래처럼 인터페이스 정의 상단부에 __attribute__ ((deprecated)) 속성을 추가하면 됩니다.

__attribute__ ((deprecated))
@interface DEPRECATING_CLASS : NSObject
...
@end

인터페이스 정의 부분 즉 헤더 파일에서 이렇게 선언해 버리면 해당 클래스나 프로토콜은 deprecated로 표시됩니다.

메서드, 프로퍼티 등

메서드나 프로퍼티는 인터페이스 정의부 가장 끝 부분에 deprecated 속성을 표기하는 여러 방법이 있습니다.

- (void)a_method:(BOOL)field __deprecated;
- (void)other_method __attribute__((deprecated));
- (void)another_method:(int)field DEPRECATED_ATTRIBUTE;

아마도 제일 첫 번째의 __deprecated를 붙이는 방법이 가장 간단할 것 같습니다. 하지만 가독성 측면에서는 가장 마지막이 좋을지도 모르겠네요.

만약 Deprecated를 시키면서 힌트 메시지를 보여주고 싶자면 아래처럼 할 수 있습니다.

- (void)some_method:(BOOL)field __deprecated_msg("use foo instead.");
- (void)also_method __attribute__((deprecated("use foobar instead")));
@property (nonatomic) int prop DEPRECATED_MSG_ATTRIBUE("use blah instead.");

이렇게 할 경우 빌드 시 경고 메시지로 지정된 메시지가 보이게 됩니다. 마지막의 프로퍼티 선언 부분이 약간 튀긴 하는데 어차피 동일하게 사용하게 라인 끝 부분에 표기한다는 점만 알고 있다면 다 동일하게 사용이 가능합니다.

728x90
반응형

댓글