答えてズンズン!:かんたん文字列連結

サルでき.jp > 11.サルにもできるiPhoneアプリの作り方(旧アメブロ記事) > 答えてズンズン!:かんたん文字列連結

2009/11/18 09:00 投稿先 11.サルにもできるiPhoneアプリの作り方(旧アメブロ記事) 投稿者 カワサキ タカシ

れ?このブログってTwitterのブログじゃなかったっけ?

すっかりそんな気分になっているみなさま。
このブログはiPhoneアプリ開発のブログでございます。
私自身がいろいろ忘れかけておりましたが。

そんな浮気心に喝を入れるコメントがwyolicanさんから届きました。
ありがとうございます。

それでは久しぶりに行ってみましょう!

答えて~ズン!ズン!

wyolicanさんからのご質問】


質問です

開発屋お父ちゃんさんの、おもしろおかしな
(でも教科書より全然頭に入る!?)
ブログをいつもコッソリ見させていただいております。

実は自分も初心者ネコさんと同じくつまずきました。
参考書と答えてズンズンを読み比べてなんとなく雰囲気がわかりました!
(ありがとうございます :D  )
ビルヂングも問題なく完了しました。

貪欲なもので、時間も表示したいと思いまして
コードを書き込んではXcodeの中にいる人に怒られの繰り返しで怒られなくはなったのですが、
不明な数値が出てきてしまいました。
トータルの秒数かと思ったのですが、(60)で割り切れない数。

こんなコードなのですが
(デタラメだったりすると思うので、笑っちゃってください^^;)

宜しければ、教えて下さいませんでしょうか?

-(IBAction)calc{
NSDate *targetDate = datePicker.date;  //
NSDate *today = [NSDate date];     //いま何時!?(°∀°)
NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

NSUInteger unitFlags = NSDayCalendarUnit
| NSHourCalendarUnit
| NSMinuteCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags fromDate:today toDate:targetDate options:0];
NSInteger days;
days = [components day],[components hour],[components minute];
//そぉね、だいたいねぇ
resultLabel.text = [NSString stringWithFormat:@"%dDays.%02d:%02d",days];
[gregorian release];
}

参照記事 : 開発基礎トレ2:アウトレットとアクションの使い方


いや~。素晴らしいです、wyolicanさん。
あの狭いコメント欄にこの文量。ほとばしるやる気が伝わってきますね。

さてさて。
3回目の答えてズンズンは文字列の取り扱い方についてお話しします。

他の言語を経験されている方がObjective-Cを少しやると、
確実に引っかかってくるポイントがあります。なんだコレと。

それが文字列連結のやり方です。

「サルにもできる」「iPhoneアプリの作り方」
これをつなげて、

「サルにもできるiPhoneアプリの作り方」
にすることを、文字列連結と言います。

普段あまりプログラミングに馴染みが無い方には「え?そんなこと?」ですが、
機械は人間のようにゆる~く言葉をつなげていくことができません。

“サルにもできる”+”iPhoneアプリの作り方”=サルにもできるiPhoneアプリの作り方
のように、何らかの処理をやってはじめて文字をくっつけることができます。

多くの言語では、足せばいいんです。足せば。

tempText = “サルにもできる”+”iPhoneアプリの作り方”;

これでtempTextを出力すればちゃんとつながって出てきます。

ですが、Objective-Cではコレが何故か超複雑。
足せません。

NSMutableStringなる変数を用意して、
appendStringなるメソッドを使って文字列をつなげます。
(NSString+stringByAppendingStringを使う手もありますが、ここでは使わないので略)

NSMutableString* tempText = @”サルにもできる”;
[tempText appendString : @"iPhoneアプリの作り方"];

みたいに。
なんだコレ。

実はですね。
wyolicanさんのコードにはこんな行がありまして。

days = [components day],[components hour],[components minute];

これがちょいと狙い通りに動いていないんです。

「もしかして、、、この難解な文字列連結しないとダメなんじゃ、、、?」

いえいえ。ご安心を。

こんな感じにします。


ViewControllerのヘッダー
答えてズンズン!:かんたん文字列連結
<クリックで拡大>

-(IBAction)calc{
NSDate *targetDate = datePicker.date;
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

NSUInteger unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags fromDate:today toDate:targetDate options:0];

// STEP1: 3つ変数を用意する
NSInteger days;
NSInteger hours;
NSInteger minutes;

//↓ここをちょっと変更
//days = [components day],[components hour],[components minute];

// STEP2: 取得したデータを各々の変数に入れておく
days = [components day];
hours = [components hour];
minutes = [components minute];

//そぉね、だいたいねぇ

// STEP3: 最後に一気にフォーマット変換+文字列連結
resultLabel.text = [NSString stringWithFormat:@"%dDays.%02d:%02d",days,hours,minutes];

[gregorian release];
}


一気にキメに行ったwyolicanさんの気持ちはよーくわかるのですが(^^;

・実は狙い通りに結合されていない
・1個の変数daysを3つの%d(%02d)に入れようとしてしまった

この2つのポイントでトラブルが発生してしまいました。

ここは焦らず、
日用、時用、分用の変数を個別に用意しておいて、

最後の stringWithFormat で、キュッと、
「フォーマット変換をしてもらうついでに、文字列連結もやってしまう」
かんたん文字列連結でいきましょう。

それでは。
久々登場の笑点スタイルのアイツの登場です。

ビルドして進行、ドン!

答えてズンズン!:かんたん文字列連結

1Daysて

まぁそこはwyolicanさんへの宿題ということで。。。

いかがでしたか?wyolicanさん。
ほぼほぼできてましたので、もうあとちょっと。ですよ。
がんばってくださいね!

<宣伝>続けてObjective-C入門とドムドムやってもらえればもうばっちりです!</宣伝>
Objective-C入門
Objective-C入門その1:まずはコメントの書き方から
Objective-C入門その2:山の高さを知ろう!

☆全14回。これでObjective-Cはもうばっちり☆

ドムドムの作り方
ドムドムその1:設計図を書いてみよう
ドムドムその2:画像ファイルにしてみよう

☆全15回。最後にはソースファイルもついてくるゾ☆

それでは次回お会いしましょう。

答えて~ズン!ズン!

関連する記事:


Advertisement