頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


構造体に初期値を入れる方法

構造体に初期値を設定する記述の仕方で微妙に違いがあるんだねってお話だよ。

関数やメソッドに構造体を引数として渡す時ってあるじゃない?
でも構造体にいろんなデータ(メンバ)があると、毎回それらを設定するのって面倒だよね。
例をあげるとこんな感じ。
UILabelオブジェクトを作って文字を表示するメソッドを作ると想定してね。その時にテキストを表示させるのにこんな構造体を準備したとするよ。
typedef struct {
    NSString *text;//表示する文字列
    CGRect frame;//
    UIView *view;//載せるUIViewオブジェクト
    UIFont *font;//フォント
    UIColor *color;//フォントの色
    NSTextAlignment textAlignment;//アラインメント
    UIColor *shadowColor;//設定されていればその色で影を付ける
} Text_t;
たいていUILabelのプロパティなんだけどね。
使う時はこんな感じ。
Text_t textInfo;
textInfo.text = @"hoge";
textInfo.frame = (CGRect){ 10,10 , 300, 25 };
textInfo.view = self.view;
[self showLabeWithTextInfo:textInfo];//メソッドを呼び出す
デフォルトでいいものなら設定しなくてもいいようにしたいよね、毎回設定するなんて面倒だし。
ところが上の方法だとメソッド内で値が設定されているのかうまく判定できないんだ。
メソッド内で
if (textInfo.color) label.color = textInfo.color;
のように判定しても必ず括弧内では真と判断されちゃうんだ。参ったよ。
メソッド内じゃなくて宣言した後で調べても (textInfo.color) は真になってる。

これはつまり、全部のメンバについて設定しないとだめってことか、、、面倒だな、ってかこんなクラスを作るの意味ないじゃないかってめまいがしそうだったんだけど、試しに構造体の初期値設定を次のように括弧を使う書き方で記述してみたんだよ。
Text_t textInfo = { @"hoge" , { 10, 10 , 300 , 25 } , self.view };
すると最初のとは違って記述していないものに関しては (textInfo.color) は偽で判定されるんだな。
ということは設定したい項目だけ記述するばOKってことになるよね。めでたし、めでたし。

出力イメージ


参考 構造体

<< iPhoneの画面操作を録画するライブラリを使ってみた   TopPage  2013年の目標 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/712-1293a61b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad