(色々な値の引数での指定方法を追記しました)
これは何?
NSBindingDebugLogLevelのようにデバッグ時やテスト時にだけ、特定のUserDefaultsを設定したいときがあると思います。
こういう時はUserDeaultsのArgument Domainが便利です。
Argument Domainはその名の通り、実行時に引数として指定することのできる、非永続的なドメインです。
またArgument Domainは最も優先度が高いドメインのため、保存されたUser Defaultsが存在していたとしても、それを無視します。
使い方は?
引数としての指定方法は
$ ./App.app/Contents/MacOS/App -NSBindingDebugLogLevel 1
のように実行ファイル名に続けて-Key Value
と指定します。
毎回それするの面倒くさくない?
Argument Domainを利用してXcode上での実行時にのみ特定のUserDefaultsを設定するようにします。
設定方法(Xcode8.1)
まず、Scheme の Edit Scheme...から目的のSchemeを選択します。
次にRunのArgumentsを選択します。そして先ほどのUserDefaultsを設定します。
ここで注意!
-Key Value
は1か所に両方書くこと。ばらばらにすると正しく認識されません。
以上です。
設定方法さえ知っていれば簡単ですが、ここまでたどり着くのが割とややこしいですね。特にSchemeのEdit Scheme...出すところが。
値の指定方法いろいろ
引数での値の指定はProperty ListのXML形式およびASCII形式を使用します。複雑な辞書や配列でない限りASCII形式を利用した方が楽だと思います。
以下に指定方法を例示します。
また値に空白文字が含まれる場合はシングルクォーテンションまたはダブルクォーテーションで囲みます。
数値
数値はそのまま数字を指定します。
-key 1
文字列
これもそのままです。空白文字を含む場合はクォーテーションで囲みます。
-key Hellow
-key 'Hellow World!'
真偽値
YES, NOを指定します。1,0でも有効です。
-key YES
-key 0
配列
カッコ内にカンマ区切りで要素を並べます。
-key '(dog, cat, "Mountain gorilla")'
辞書
中カッコ内に=で結ばれたペアを;区切りで並べます。
-key '{a="Mountain gorilla"; b=cat;}'
おまけ
XML形式も一応使えます。
-key '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Name</key> <string>John Doe</string> <key>Phones</key> <array> <string>408-974-0000</string> <string>503-333-5555</string> </array> </dict> </plist>'
おまけのおまけ
NSDataとNSDateはASCII形式では指定できません。XMLで頑張りましょう。
メリット
- マクロなどを使いソースコードで設定を入れ替えるなどしなくていいため、ソースコードを汚さない。
- 非永続なためUserDefaultsデータベースを汚さない。
デメリット
- 設定方法がややこしい。
- つまり、変更するのもややこしい。
- 設定したこと忘れそう。
- 複数人での開発のとき設定方法を周知するの面倒くさい。
- 設定する暇があったらターミナルからやった方が早くね?