Qiitaにも投稿しましたが、iOSアプリ開発でもAndroidのR.javaのような仕組みでリソースに安全にアクセスする仕組みを作りました。
rdotm - GitHub
R.mというファイルを自動生成し、XMLに定義した文字列を「文字列ではなくコードで」アクセスできるようにします。
"R.java iOS"などと検索すると、以下のように海外でも探している人がいるようなので(3年前ですけどね...)
Equivalent to R in iOS - Stackoverflow
試しに英語でも書いておこうと思います。
Recently, I developed the tool rdotm(R.m) for iOS app development.
rdotm(R.m) is the Objective-C resource definition generator like Android app's R.java
.
See the following demo especially auto-completion of string_*
.
The tool rdotm
is for Objective-C (iOS), but the idea came from Android app's deveopment.
In Android app's development, R.java mechanism enables us to access the resources defined by XML safely.
Because misspelling the resource name causes compile errors, so we can never release the app including misspelled resource name.
For example, the following code generates a constant R.string.app_name
.
<resources>
<string name="app_name">Foo</string>
</resources>
We can get "Foo" by getString(R.string.app_name)
.
In iOS develpment, although there is a great i18n(l10n?) system using NSLocalizedString
,
we should specify the name of the string resource by NSString
.
When we define Localizable.strings
like this,
"something" = "anything";
then we can refer this string with the following code:
// OK, this will be @"anything"
NSString *s = NSLocalizedString(@"something", nil);
but you may mistype it:
NSString *s = NSLocalizedString(@"s0mething", nil);
This DOES NOT cause any compile errors and the result will be the 1st param s0mething
.
This means that you must run the app manually and detect this bug with your eyes, or write some test codes to detect it.
I didn't want to test it manually nor checking someone's code to detect this kind of bugs.
There was a discussion in Stackvoverflow about this three years ago.
Equivalent to R in iOS - Stackoverflow
But unfortunately, it seems that it's not resolved.
So I introduced R.java
mechanism into my iOS app develoment by developing rdotm
.
It generates Objective-C codes from XML.
Localizable.strings:
"title_top" = "Demo";
Objective-C code:
NSString *title = NSLocalizedString(@"title_top", nil);
strings.xml:
<string name="title_top">Demo</string>
Objective-C code:
NSString *title = [R string_title_top];
You don't have to write @"title_top"
to get localized string any more.
If you misspell, it will cause compile error.
Objective-C code:
[label setTextColor:[UIColor colorWithRed:0/255.0 green:153/255.0 blue:204/255.0 alpha:153/255.0]];
colors.xml:
<color name="default_text">#990099cc</color>
Objective-C code:
[label setTextColor:[R color_default_text]];
You don't have to use raw ARGB values.
Objective-C code:
UIImage *logo = [UIImage imageNamed:@"logo"];
Objective-C code:
UIImage *logo = [R drawable_logo];
You don't have to write @"logo"
to show "logo@2x.png"
.
rdotm checks the resource directory when generating the codes,
which means you can not access non-existent images.
Please check the latest README on GitHub.
If you are a OS X user, you can use Homebrew:
$ brew tap ksoichiro/rdotm
$ brew install rdotm
If you have golang environment,
$ go get github.com/ksoichiro/rdotm
gom is a great dependency manager for golang.
You can use this to install inside your Xcode app project.
golang is required for this method.
$ go get github.com/mattn/gom
$ echo "gom 'github.com/ksoichiro/rdotm'" > Gomfile
$ gom install
You can use rdotm to build process by the following settings.
If you use gom, the script will be like this:
export PATH=_vendor/bin:${PATH}
rdotm \
-res ${SRCROOT}/YOUR_PROJECT/XML_LOCATED_DIR \
-out ${SRCROOT}/YOUR_PROJECT/GENERATED_CODES_DIR \
-clean
That's all.
Sorry for my bad English.
If you have any questions, requests, or something
please contact me by comment form or GitHub issue.