A colossal Dreamer: GR鐵塔-天生我材

iOS ObjC Symbol conflict with other Swift Framework. 본문

Development/아이폰

iOS ObjC Symbol conflict with other Swift Framework.

江多林 2019. 12. 3. 10:25

하나의 프로젝트에서 프레임웍(외부 오픈소스)를 사용하는 경우는 빈번하다.

 

내 프로젝트(AwesomeApp)에 CaptureControl 이라는 스위프트 클래스를 사용중에

참조하는 프레임웍내(FRwork)에 CaptureControl 이라는 스위프트 클래스를 사용한다면,

 

내 프로젝트는 AwesomeApp.CaptureControl, 프레임웍은 FRwork.CaptureControl 과 같이

다른 언어의 namespace(java:package) 로 구분해서 사용이 가능하다.

 

하지만, 내 프로젝트에 ObjC 코드가 있고, ObjC 에서 내 프로젝트와 FRwork 모두 접근해야 하는 상황이라면,

 

두 클래스 모두 ObjC 헤더파일에 동일한 CaptureControl 로 import 되어

컴파일이 안되게 된다.

이름을 수정하면 되겠지만, 그것이 여의치 않다면,

 

@objc(xxx) 의 메타정보 지정으로 해결이 가능하다.

내 프로젝트 클래스 선언 바로 앞에 @objc(MYCaptureControl) 을 지정하면,

ObjC 에서 MYCaptureControl 로 접근이 가능하고,

프레임웍쪽에서 @objc(FRCaptureControl) 을 지정하면,

ObjC 에서 FRCaptureControl 로 프레임웍 클래스를 사용할 수 있다.

 

Swift 사용 초기에 코딩컨벤션을 정할 때,

Swift 는 모듈을  NameSpace 처럼 쓸 수 있으니, prefix(FR, MY, CA, UI 등)를 붙일 필요가 없다는 주장이 있었는데.

이 처럼 문제될 수 있다.

또한 위와 같이 해결하면, Swift와 ObjC 서로간의 클래스이름이 달라지는 문제도 있다.

 

선호의 문제로 볼 수도 있겠지만,

프레임웍을 생성하는 쪽에서는 Swift 도 역시 prefix 를 붙여서 작업해주는 것이

애플리케이션 작업하는 쪽을 배려하게 될 것 같다.

 

(prefix 를 치는 것은 노동력 낭비라는 친구도 당근 있겠지만,)

(단지 그가 이런 배려를 항상 받아왔다고 볼 수도 있을 것이다.)