読者です 読者をやめる 読者になる 読者になる

#iosdc 2016 A-9 Swift で JavaScript 始めませんか?

twitter.com

iOS には JavaScriptCore というフレームワークがあります。これを使うと JavaScript コードと Swift コードを相互に連絡しながらプログラムを実行できます。Swift で作った自作クラスをそのまま JavaScript で使用できたり、JavaScript コードを動的生成して実行できたり、可能性は無限大。このトークではそんな JavaScriptCore の基本のところをざっくり紹介します。

iosdc.jp

Swift で JavaScript 始めませんか?

f:id:niwatako:20160820152035j:plain

f:id:niwatako:20160820152044j:plain

f:id:niwatako:20160820152053j:plain

f:id:niwatako:20160820152100j:plain

f:id:niwatako:20160820152122j:plain

最近プログラミングの楽しさを伝えていとおもっていて2つほど勉強会しています

f:id:niwatako:20160820152128j:plain

新しい勉強会始めます

f:id:niwatako:20160820152216j:plain

ネットラジオも始めました

f:id:niwatako:20160820152208j:plain

本編

f:id:niwatako:20160820152233j:plain

f:id:niwatako:20160820152250j:plain

面白いのがSwift都の相互運用が簡単にできること。

f:id:niwatako:20160820152322j:plain

バーチャルマシーンを作ってその上でJavascriptを動かす環境

f:id:niwatako:20160820152347j:plain

f:id:niwatako:20160820152433j:plain

f:id:niwatako:20160820152442j:plain

f:id:niwatako:20160820152453j:plain

全然考えてませんでした(・ω<)

f:id:niwatako:20160820152516j:plain

過去にJavaScriptCoreにリンクされているとリジェクトされるとか書いてあったが、なんかいろいろサポートされているしそろそろ使えるのでは?

使いたくなりました?

なりましたね?

f:id:niwatako:20160820152837j:plain

f:id:niwatako:20160820152849j:plain

f:id:niwatako:20160820152850j:plain

f:id:niwatako:20160820152851j:plain

f:id:niwatako:20160820152852j:plain

f:id:niwatako:20160820152854j:plain

f:id:niwatako:20160820152855j:plain

f:id:niwatako:20160820152856j:plain

f:id:niwatako:20160820152857j:plain

f:id:niwatako:20160820152859j:plain

f:id:niwatako:20160820152916j:plain

JavaScript API

f:id:niwatako:20160820152932j:plain

一般的なものはあるがWebでおなじみなDOMは無い。非常にまっさらな環境が作られて、必要な機能を揃えていって使う。

f:id:niwatako:20160820153007j:plain

コンテキストに自分でプログラムしてあげる。

JavaScriptを使ったりSwiftを使ったりして変数関数を揃えていって環境を作る。

f:id:niwatako:20160820153037j:plain

面白いのはSwiftの変数を設定できる。参照型だと共有される。

f:id:niwatako:20160820153051j:plain

f:id:niwatako:20160820153127j:plain

f:id:niwatako:20160820153128j:plain

Swiftのクロージャーも渡せる。AnyObjectである必要があるので @convension(block) が必要。

f:id:niwatako:20160820153208j:plain

f:id:niwatako:20160820153218j:plain

Swiftの型をそのまま使ってしまう。

f:id:niwatako:20160820153251j:plain

これでJavaScriptで使えちゃう。

f:id:niwatako:20160820153304j:plain

f:id:niwatako:20160820153311j:plain

JavaScript側から必要に応じてインスタンス化することが出来る。

f:id:niwatako:20160820153336j:plain

Swiftのオブジェクトそのまま使えるのすごくないでしょうか!

最後に一つ

f:id:niwatako:20160820153352j:plain

f:id:niwatako:20160820153413j:plain

f:id:niwatako:20160820153414j:plain

f:id:niwatako:20160820153415j:plain

f:id:niwatako:20160820153427j:plain

Xcodeで補完したりして書けるようになる。

f:id:niwatako:20160820153440j:plain

Contextに流し込む

f:id:niwatako:20160820153456j:plain

f:id:niwatako:20160820153501j:plain

JavaScriptから自在にSwiftを扱える感じをおわかりいただけたでしょうか

f:id:niwatako:20160820153517j:plain

審査通るかは、、、後日!

f:id:niwatako:20160820153528j:plain

Q&A

EcmaScript6は使えますか

SafariのCoreで使っているものなので、どうだろう。。

「RealmのJSはJavaScriptCoreでES6の機能を使えています」(岸川さん)

とのことです

JSでSwiftオブジェクトを参照した時にメモリ管理はどうなるのか

把握できていないがJSマネージドバリューという型があったりして、そのあたりを追っていくと参照まわりが見えてくるかもしれないです。

ReactNativeはJavaScriptCore使っていたので審査通るのではないかと思います。

いい情報をありがとうございます。

まとめ