swift実践入門の第15章「SwiftからObjective-Cを利用する」を読んでいて、ターミナルからやってみたくなったのでやってみました。
簡単なObjective-CのクラスObjcClass
と、それを呼び出すSwiftのクラスmain.swift
を定義します。また、ブリッジのためのクラスBridging-Header.h
も用意します。
//ObjcClass.h
#import <Foundation/Foundation.h>
@interface ObjcClass:NSObject
-(void)someMethod;
@end
//ObjcClass.m
#import "ObjcClass.h"
@implementation ObjcClass
-(void)someMethod {
NSLog(@"Objective-Cのメソッドを呼び出しています");
}
@end
//main.swift
let objcClass = ObjcClass()
objcClass.someMethod()
//Bridging-Header.h
#import "ObjcClass.h"
ObjcClass
とmain.swift
をそれぞれコンパイルします。
//ObjcClass.mのコンパイル
$ xcrun clang ObjcClass.m -o ObjcClass.o -c
//main.swiftのコンパイル
$ xcrun swiftc -c main.swift -import-objc-header Bridging-Header.h
$ ls
Bridging-Header.h ObjcClass.m main.o
ObjcClass.h ObjcClass.o main.swift
できた.o
ファイルをリンクして実行ファイルを作ります。
$ xcrun swiftc -o app main.o ObjcClass.o
ld: warning: object file (ObjcClass.o) was built for newer OSX version (10.12) than being linked (10.9)
warningが出ました。私の環境だと、swiftのターゲットがOS X10.9だからのようです。
$ ls
Bridging-Header.h ObjcClass.o main.swift
ObjcClass.h app
ObjcClass.m main.o
実行ファイルapp
ができています。実行してみます。
$ ./app
2017-05-25 11:21:38.738 app[1205:47383] Objective-Cのメソッドを呼び出しています
Objective-Cのクラスを呼び出して実行できていることがわかりました。
- Swift実践入門 第15章「SwiftからObjective-Cを利用する」公式サイト
- Xcodeなしで楽しむSwift (REPLからライブラリ生成まで)
- Compiling and linking Swift plus Objective C code from the OS X command-line(stackoverflow)
macOS 10.12.5
$ clang -v
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ swift -v
Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
Target: x86_64-apple-macosx10.9