ObjC & Swift 스까쓰기

글쓴이: Shante256 , 2016년 10월 7일

애플이 Swift를 발표하면서 ObjC를 지속적으로 지원한다고 발표했다.
그 사실을 입증하기라도 하는듯, Objective-C와 Swift 코드를 통합할 수 있는 방법을 제공한다.

##Swift에서 ObjC 사용하기

간단히 예제 프로젝트로 이해하는 것이 좋을 것이라 생각한다.

  1. [macOS] - [Command Line Tool]을 선택한다.
  2. [Product Name]란에 Swift-C를 기입한다.
  3. [Language]는 Swift를 선택한다.

프로젝트를 처음 생성하면 네비게이터 영역이 아래와 같이 구성된다.
navigator

이 예제에서는 간단히 Person이라는 클래스를 만들어 볼 것이다.
우선, 프로젝트에 ObjC 파일을 추가하기 위해 ⌘+N 키를 눌러, 새로운 소스파일을 추가한다.

템플릿 선택 시트가 나타나면, [Cocoa Class]를 선택한다.
다음으로 [Class Name]란에 Person을 기입하고, [Subclass of]에서는 NSObject를 선택한다.
*주의: [Language]는 Objective-C를 선택한다.

파일을 생성하면 작은 시트가 나타난다.
> Would you like to configure an Objective-C bridging header?

반드시 Create Bridging Header를 선택해야한다.

만약 실수로 Bridging header를 생성하지 않았다면?
⌘+N을 눌러, 헤더파일(.h)을 하나 추가한다.
헤더파일 명칭은 Swift-C-Bridging-Header.h로 지정한다.
프로젝트 설정의 [Build Settings]에서 [Swift Compiler - General]을 찾는다.
Objective-C Bridging Header에 Swift-C-Bridging-Header를 기입한다.

다음으로, Objective-C 소스파일에 Person 클래스를 선언할 차례다.

Person.h파일에 아래와 같이 작성한다.

#import <Foundation/Foundation.h>

@interface Person: NSObject
{
  NSString* name;
  NSUInteger age;
}

@property NSString* name;
@property NSUInteger age;

- (void) intro;

@end

다음으로, Person.m파일을 작성한다.

#import "Person.h"

@implementation Person

@synthesize name;
@synthesize age;

- (void) intro
{
  NSLog(@"My name is %@, and I'm %lu years old.", name, age);
}

@end

이렇게, Person 클래스는 다 만들어졌으니, Person 클래스를 Swift에 추가할 차례다.

Swift-C-Bridging-Header.h 파일을 열고 다음 한 줄을 기입하자.

#import "Person.h"

이제, Swift에서 Person 클래스를 사용할 준비를 마쳤다.
main.swift를 열고 아래 코드를 작성해보자.


Person miles = Person()
mlies.name = "Miles"
miles.age = "24"

miles.intro()

실행 결과
My name is Miles, and I’m 24 years old.

지금까지의 과정을 잘 따라 했다면, 아무 이상 없이 실행되었을 것이다.


##ObjC에서 Swift 사용하기

ObjC에서 Swift를 사용하는 것은 약간 복잡해 보일 수 있다.
이번에는 ObjectiveSwift라는 프로젝트를 만들어 볼 것이다.

이전과 같이 [Command Line Tool]을 선택한다.
Product Name은 ObjectiveSwift을 기입하고, Language는 Objective-C를 선택한다.

Objective-C에서 Swift 코드를 혼합할 때는 Bridging Header가 필요하지 않다.
단순히, 모듈을 추가하고, Swift 코드를 작성할 때 약간의 주의만 있으면 된다.

우선 Person.swift 클래스를 작성하자.
⌘+N를 누르면 템플릿 선택 시트가 나타난다. 여기서 [Cocoa Class]를 선택한다.
[Class]란에는 Person, [Subclass of]는 NSObject, [Language]는 Swift를 선택한다.

여기서 Bridging Header를 생성할 것인지를 묻는 시트가 나타나는데, 굳이 생성하지 않아도 된다.
만약 추가하려는 Swift 코드에서 Objective-C 코드를 사용할 필요가 있다면, Bridging Header를 만들어야 할 것이다.

Person.swift파일을 열고, 아래 코드를 작성한다.


import Foundation

@objc public class: NSObject {
  public var name: String?
  public var age: NSNumber?

  public intro() {
    Swift.print("Hello, My name is \(name!), I'm \(age) years old.")
  }
}

Person 클래스를 작성하는 과정이 아주 짧게 끝이났다.
다음으로, ObjC 코드에서 Swift를 사용할 수 있도록 특수 헤더를 import해야한다.

특수 헤더라고 해도 특별할 건 없고, 그냥 소스코드에 모듈이름-Swift.h를 import 하면 된다.

main.m 파일을 아래와 같이 작성해보자.

#import <Foundation/Foundation.h>
#import "ObjectiveSwift-Swift.h"

int main(int argc, char* argv[]) {

  @autoreleasepool {
    Person* miles = [[Person alloc] init];
    [miles setName: @"Miles"];
    [miles setAge: 24];

    [miles intro];

  }

  return 0;
}

실행결과
My name is Miles, I’m 24 yers old.

잘 따라 했다면 아무 이상 없이 실행될 것이다.


글을 작성하면서 발견한 점이 있는데, Objective-C에서 Swift를 사용할 때, 프로젝트 이름에 -Swift라는 이름이 있으면 안되다.
처음에 이름을 Objective-Swift로 지정했다가, 헤더를 찾을 수 없다는 에러 때문에, 15분 가량 소요했다.