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
のようにして定数にアクセスできます。
// 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 ごとに値を上書きしているときに利用します。
まだ出来立てのツールなので、ご意見・ご要望も歓迎です。