LoginSignup
5
6

More than 5 years have passed since last update.

rdotswift: Android 用の values/strings.xml から iOS 用の R.swift を生成する

Posted at

Android アプリと iOS アプリを両方開発しているとき、
Alert 文言や API エンドポイント、色指定、ナビバーの高さなどなど、
アプリの設定・定数値を共通管理したいことがあります。

Android アプリ用の設定ファイル strings.xml 等から iOS アプリ用の Objective-C の R.h と R.m ファイルを生成するツールに rdotm があります。

Swift でも同じことをやりたいので、rdotswift を作成しました。

以下の手順で利用できます。

brew install node # まだ node.js がインストールしていない場合

npm install -g rdotswift

rdotswift app/src/main/res/values/*.xml --output=R.swift

rdotswift は以下のような R.swift ファイルを生成します。
アプリからは、R.string.app_name のようにして定数にアクセスできます。

R.swift
// Generated by rdotswift <https://github.com/kawanet/rdotswift>

import UIKit

final class R {
    final class bool {
    }

    final class color {
    }

    final class dimen {
    }

    final class string {
    }
}

// colors.xml

extension R.color {
    /** #3F51B5 */
    static let colorPrimary = UIColor(red: 0.247, green: 0.318, blue:0.71, alpha: 1)
    /** #303F9F */
    static let colorPrimaryDark = UIColor(red: 0.188, green: 0.247, blue:0.624, alpha: 1)
    /** #FF4081 */
    static let colorAccent = UIColor(red: 1, green: 0.251, blue:0.506, alpha: 1)
}

// dimens.xml

extension R.dimen {
    /** 16dp */
    static let activity_horizontal_margin: CGFloat = 16
    /** 16dp */
    static let activity_vertical_margin: CGFloat = 16
    /** 16dp */
    static let fab_margin: CGFloat = 16
}

// strings.xml

extension R.string {
    /** MyApp */
    static let app_name = "MyApp"
    /** Settings */
    static let action_settings = "Settings"
}

現在は R クラス以下の bool・color・dimen・string の4つの型に対応しています。
drawable や style には対応していません。

いくつかオプションが指定できます。

rdotswift app/src/develop/res/values/*.xml --exclude='*_android' --output=R.swift

--exclude='*_android' をつけると、_android で終わるキーを無視します。
Android のみで利用する設定を iOS に取り込みたくない場合に使用できます。

rdotswift app/src/develop/res/values/*.xml --extension --if=DEBUG --output=R+develop.swift

--extension をつけると、final class R {} を出力しません。
--if=DEBUG をつけると、#if DEBUG#endif が付きます。
Android の Build Variants と iOS の TARGET を対比させるときに指定できます。

rdotswift app/src/main/res/values/*.xml --class=Const --output=Const.swift

--class=Const をつけると、R 以外のクラス名を使用できます。

rdotswift app/src/main/res/values/*.xml app/src/develop/res/values/*.xml --merge --output=R+develop.swift

--merge をつけると、上記の例では main の XML を読んだあとで、
develop の XML を読んで上書きした結果のみを .swift に出力します。
Android の Build Variants ごとに値を上書きしているときに利用します。

まだ出来立てのツールなので、ご意見・ご要望も歓迎です。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6