본문 바로가기
프로그래밍 놀이터/iOS

[ios] Objective-C 와 Swift 동시에 사용하기

by 돼지왕 왕돼지 2017. 12. 2.
반응형

[ios] Objective-C 와 Swift 동시에 사용하기


https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

*objc, @class, @IBAction, @IBOutlet, @objc, @protocol, birdging-header, birdging-header.h, bridging-header, build setting, Code Generation, Compiler, curried functions, cyclical reference, defines module, DEFINES_MODULE, enumeration, Forward declarations, Generic, Global Variable, import, int raw value type, internal modifier, name collision, nested type, NS_SWIFT_NAME, NS_SWIFT_UNAVAILABLE, object-c swift 상속, objective-c bridging header, objective-c code, objective-c header, objective-c interface, Objective-C 코드에서 Swift 코드 사용하기, private modifier, product module name, protocol, public modifier, relative path, Signature, structures, Swift, swift class, SWIFT CODE, Swift Code 에서 Objective-C 코드 사용하기, swift compiler, swift header, swift header file, swift interface, swift objective-c 상속, swift protocol, swift.h, SWIFT_OBJC_BRIDGING_HEADER, target name, top-level function, Trouble Shooting Tips & Reminder, tuple, typealiases, umbrella header, [ios] Objective-C 와 Swift 동시에 사용하기, 상대적 path, 상속, 자동 생성


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 로 마킹된 녀석도 사용 가능하다.




반응형

댓글