絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

iOSDC Japan 2016 参加メモ: A-10 SwiftでJavaScript始めませんか?

SwiftでJavaScript

JavaScriptCoreとは

  • JSのランタイム実行環境
  • Swiftとの相互運用が可能

  • 使用例

    • 再ビルドをせずに実装を差し替える
    • カスタムスクリプト環境を提供
    • JSを使ってネイティブアプリを制御できる
    • Web経由でソースコードをダウンロード、など

ちょっとまった

  • 強力すぎないか?
  • 審査通る?

    • 考えてなかった!
  • 環境

基本的な使い方

  • JavaScriptCoreをimport
  • JSContext生成
  • JSコード実行
    • evalの結果はcontextに溜まっていく
  • 実行結果をSwiftで受け取る
    • 返り値をSwiftで受け取れる

変数の扱い

  • JSValueで表現

    • toTypenameメソッドでSwiftの型にできる
    • isTypenameプロパティで判定してから取り出せる
  • オブジェクトもJSValueで

    • swift側からforPropertyなどで取り出したりできる

JavaScript API

  • JSの基本的な組み込み機能だけが備わっている
  • DOMなどの高度なものはない

  • 自分の手でAPIを構築していく

    • やり方は色々
      • JSからでもSwiftからでも
  • 変数/関数/オブジェクトをJSで定義する

    • 普通にeval
  • Swiftで定義する

    • setObjectすることで、JS上で参照できるようになる
    • 参照型だと共有しちゃう
  • 関数をSwiftから取り込む

    • クロージャをコンテキストに設定する
    • AnyObjectにキャストしてsetObjecすると、JS上から呼び出せる
  • Swiftの型をJSで使う

    • @objcをつけてNSObjct継承してやれば、渡せる
    • インスタンスを渡す事もできる
    • meta typeを渡すこともできるので、JSの中でインスタンス化することも可能
  • Swiftの機能をそのままJS上で使える!

コードを書きやすくする方法

  • 普通に書いてると読みづらい
  • プロジェクトにJSファイルを組み込んで、Bundleから読み込んでStringにしてevalに流してあげれば楽にできる

まとめ

  • JSをSwiftから簡単・自在に扱える
  • 審査通るかは、後日!

QA

  • ECMAScript 2016は対応してる?

    • 行けそう
  • JS側でSwiftのオブジェクトを参照した場合、開放されたオブジェクトの扱いはどうなる?

    • JS Managed Valueあたりを見るとわかるかも
  • React Nativeは使ってたはずなので、審査は通りそう