Objective-C <-> Swift 코드 사용하기
Objective-C 프로젝트에서 Swift 코드 사용하기, Swift 프로젝트에서 Objective-C 코드 사용하기
저는 Swift 개발자이고, 회사의 레거시 코드는 Objective-C로 되어있습니다.
그래서 Objective-C 프로젝트와 Swift 프로젝트를 넘나들어야 할 때가 많은데요.
Objective-C 프로젝트에서 제가 작성한 Swift 코드를 사용해야 할 때나 Swift 프로젝트에서 회사의 Objective-C 모듈을 사용해야 할 때,
참고하기 위해 글을 써보려 합니다.
# Swift 프로젝트에서 Objective-C 사용하기
스위프트 프로젝트에서 오브젝티브-C 파일을 생성하면 아래와 같은 팝업을 볼 수 있습니다.
1. Create Bridging Header를 선택했을 경우
파일을 생성한 곳에 AppName-Bridging-Header.h 파일이 생성된 것을 볼 수 있습니다.
이 파일 안에 새로 만든 오브젝티브-C 파일의 헤더 파일을 임포트 해주면 됩니다.
#import "NewObjectiveCFile.h"
2. Don't Create를 선택하거나 팝업이 보이지 않을 경우
AppName-Bridging-Header.h 파일을 직접 생성해서 새로 만든 오브젝티브-C 파일을 임포트 해줍니다.
다만, 이 프로젝트에서 브릿징 헤더 파일을 사용하고 있다는 사실을 명시해주기 위해서
'Project - Target - Build Settings - Objective-C Bridging Header' 에 파일의 위치/AppName-Bridging-Header.h 를 추가합니다.
3. 끝...
너모 간단... 진짜 간단 끝판왕..
이제 어느 파일에서든 오브젝티브-C로 작성된 코드를 사용할 수 있습니다.
# Objective-C 프로젝트에서 Swift 사용하기
'Project - Target - Build Settings - Defines Module'을 Yes로 설정합니다.
추가한 Swift 파일에서 Objective-C에서 사용할 클래스나 함수명 앞에는 @objc를 달아주어야 합니다.
@objc class TestService {
@objc static let shared = TestService()
@objc func sayHello() {
print("Hello!")
}
}
자 이제 스위프트 코드를 사용하고 싶은 오브젝티브-C 파일에서 해당 코드를 호출해 봅시다.
[[TestService shared] sayHello];
// error
Use of undeclared identifier 'TestService'
이 오류는 우리가 헤더 파일을 임포트 하지 않아서 생긴 오류인데요,
그렇다면 우리는 헤더 파일을 새로 생성해야 하느냐!
아닙니다! 우리가 위에서 Defines Module 을 Yes로 설정해 놓았기 때문에 컴파일 하는 과정에서 헤더 파일을 자동으로 생성해줍니다.
따라서 우리는 Xcode가 몰래 만들어 줄 헤더 파일을 임포트 해주기만 하면 됩니다.
#import "AppName-Swift.h"
앱 이름 뒤에 -Swift.h 만 붙인 파일을 임포트 해주고 새로 빌드하면 있던 에러도 사라지는 마법!
끝입니다! 얘도 안 어렵죠?
# 명심해야 할 것
1. Bridging Header의 파일 위치가 Build Settings에 작성한 위치와 동일한 지 확인해주세요!
2. Bridging Header 파일을 삭제할 때에도 Build Settings에 해당 파일이 삭제되었는 지 확인해주세요!
3. 빌드 과정에서 새로 생성되는 헤더 파일은 "AppName-Swift.h" 입니다!! Project File Name 과 Product Name을 다르게 사용하시는 분들의 경우 반드시 "Product Name-Swift.h" 파일을 임포트 해주세요!! (이걸로 한 시간 버림..)