Skip to content

Instantly share code, notes, and snippets.

@sahara-ooga
Last active May 25, 2017 05:19
Show Gist options
  • Save sahara-ooga/1e6baf6a135534b4307003efdcad8684 to your computer and use it in GitHub Desktop.
Save sahara-ooga/1e6baf6a135534b4307003efdcad8684 to your computer and use it in GitHub Desktop.
ターミナルを使ってSwiftからObjective-Cを利用する

TL;DR

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"

コンパイル・リンク

ObjcClassmain.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のクラスを呼び出して実行できていることがわかりました。

参考

環境

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
#import "ObjcClass.h"
let objcClass = ObjcClass()
objcClass.someMethod()
#import <Foundation/Foundation.h>
@interface ObjcClass:NSObject
-(void)someMethod;
@end
#import "ObjcClass.h"
@implementation ObjcClass
-(void)someMethod {
NSLog(@"Objective-Cのメソッドを呼び出しています");
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment