[ios] Objective-C 와 Swift 동시에 사용하기
Swift Code 에서 Objective-C 코드 사용하기
-
Swift Code 에서 Objective-C 코드를 쓰려면, Objective-C bridging header 가 필요하다.
Xocde 는 Objective-C app 에서 Swift file 을 추가할 때, 혹은 그 반대일 때 이를 쉽게 만들 수 있도록 도와준다.
이 과정을 통해 만들어진 header 파일은 [productModuleName]-Bridging-Header.h 파일명을 갖는다.
이 과정이 아니더라도, Header File 을 직접 만들 수도 있다.
-
Swift 에 Objective-C Code 를 import 하기 위해서는, bridging-header 파일에 Swift 에서 사용하길 바라는 header 를 모두 import 시킨다.
그 다음 Build Setting 의 Swift Compiler - Code Generation 에서 이 bridging-header 파일을 연결해준다.
이 때 path 는 project 에 상대적인 path 여야 한다. ( info.plist 처럼 )
위와 같이 설정하면, bridging-header 에 설정된 header 정보가 Swift 에서 visible 해진다.
( import 가 따로 필요 없다. )
Objective-C 코드에서 Swift 코드 사용하기
-
Objective-C Code 에 Swift 를 import 하기 위해서는, Xcode 가 생성하는 Swift 에 대한 header file 을 사용해야 한다.
이 자동생성되는 파일은 Objective-C header 인데, Swift 의 interface 를 정의하고 있다.
이것은 umbrella header 로 생각되어질 수 있다.
이 파일은 [productModuleName]-Swift.h 파일이름을 갖는다.
-
이 header 파일에는 Swift 코드에서 public modifier 로 마크되어 있는 녀석들이 담겨 있다.
internal modifier 로 마크되어 있는 녀석들도 담겨질 수 있는데, 이것은 Objective-C bridging header 가 있는 경우에 해당한다.
private modifier 를 가지고 있는 녀석들은 @IBAction, @IBOutlet, @objc 로 마킹되어 있지 않는 한 나타나지 않는다.
cf) @testable 로 마킹되어 있다면 internal modifier 로 마킹되어 있는 녀석들은 test 시 public 처럼 접근 가능하다.
-
Swift 코드를 사용하기 위해서는 생성된 Swift header 를 import 하기만 하면 된다.
Swift interface 에는 모든 Objective-C type 의 reference 를 갖고 있다.
-
Swift 코드는 아래와 같이 사용 가능하다.
MySwiftClass* swiftObject = [[MYSwiftClass alloc] init];
[swiftObject swiftMethod];
-
Swift class, protocol 은 반드시 @objc 로 마크되어 있어야 Objective-C 에서 사용 가능하다.
이것이 compiler 에게 Objective-C 에서 이 녀석을 접근할 것이라고 알리기 때문이다.
만약 Swift class 가 Objective-C 를 상속한 녀석이라면, compiler 가 자동적으로 @objc 를 붙여준다.
-
Swift 에서 다음을 사용한 경우에는 @objc 를 붙여도 그 기능을 사용할 수 없다.
Generics
Tuples
Swift 에서 Int raw value type 을 제외한 Enumerations
Swift 에서 정의된 Structures
Top-level function
Global variable
Typealiases
Swift-style variadics
Nested types
Curried functions
-
Objective-C 에서는 Swift Class 를 상속할 수 없다.
그러나 protocol 구현은 가능하다.
-
cyclical reference 를 막기 위해 Objective-C 의 header 에서는 Swift code 를 import 하지 않고 @class, @protocol 로 마킹한다. ( Forward declarations )
-
NS_SWIFT_NAME 이라는 매크로를 사용하여, Objective-C 의 함수들의 signature 를 바꿀 수 있다.
이는 함수와 Enumeration (Enum) 둘 다 가능하다.
-
NS_SWIFT_UNAVAILABLE 매크로를 사용하여 Swift 에서 Objective-C 의 interface 를 사용하지 못하도록 할 수 있다.
기본 설정 정리
-
Swift 에서는 Objective-C 코드 사용을 위해서는 Import 문이 필요 없고, bridging header 만 정의되면 된다.
Objective-C 에서 Swift 코드 사용을 위해서는 자동생성되는 swift header 파일을 import 해야 한다.
Trouble Shooting Tips & Reminder
-
Swift, Objective-C 를 같은 code collection 으로 여겨라.
즉 Name collision 을 조심해야 한다.
-
framework 코드를 만드는 거라면 build setting 에서 Defines Module(DEFINES_MODULE) 을 Yes 로 설정하라.
-
Objective-C bridging header 를 사용한다면, Swift Compiler - Code Generation 밑에 SWIFT_OBJC_BRIDGING_HEADER 의 path 를 project path 에 상대적 path 로 기술하라.
-
Xcode 는 target name 이 아닌, product module name 을 사용하여 bridging header 와 swift header 를 만든다.
-
Swift code 를 Objective-C 에서 사용하기 위해서는 @objc 로 마킹하거나, Objective-C 를 상속한 녀석이어야한다.
-
Objective-C 에서 Swift 코드를 사용할 때에는, Swift 에만 있는 기능들은 사용할 수 없다는 사실을 인지해야 한다.
-
Swift code 에서 Objective-C 에서 만든 type 을 사용한 코드가 있고,
이 코드를 Objective-C 에서 사용하고자 한다면, Bridging-Header 에서 해당 파일이 이미 import 되어 있어야 한다.
-
swift 에서 private 으로 마킹한 녀석은 자동 생성되는 header 에 노출되지 않는다.
@IBAction, @IBOutlet, @objc 로 마킹된 경우는 private 이라도 나온다.
-
App Target 의 경우 internal 로 마킹된 녀석은 bridging header 가 있는 경우에는 자동 생성 header 에 자동 노출된다.
-
Framework Target 의 경우 public 으로 마킹된 녀석만 자동 생성 header 에 노출된다.
Objective-C 클래스를 상속한 녀석의 경우는 internal 로 마킹된 녀석도 사용 가능하다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[ios] Custom TabBar 만들기 (0) | 2017.12.04 |
---|---|
[ios] NSExpression with CoreData (0) | 2017.12.03 |
[ios/tutorial] CABasicAnimation, CATransition, CAKeyframeAnimation, CALayer, CAAnimationGroup ( Core Animation ) (0) | 2017.12.01 |
[ios/tutorial] Core Animation 모든 것!! (0) | 2017.11.30 |
[ios/reference] Advanced Animation Tricks (0) | 2017.11.29 |
댓글