他の話題

新人奮闘記6

iOS入門

今回は、前回画面を作成した続きで電卓アプリの実装に入っていきたいと思います。

前回の記事

story5re2

[オブジェクト関連付け]

画面の作成にて、前回はボタンとラベルの配置を行いましたが、動作させるためには、各部品をソースコードと関連付けする必要があります。

ボタンを関連付けするために直接ソースコードで書く事を考えましたが、今回は、アシスタントエディタという機能を使ってGUIでシンプルに関連付けできるように実装してみました。

デフォルトで自動生成されているファイル、ViewController.swiftとMain.storyboardを開いた状態で行います。

[ViewController.swift]

funtouki6_2
さっそく各ボタンの、0~9、00、C、=、+、-、×、÷(/)、. ボタンとラベルをソースと繋げてみました。

パーツを選択しControlキーを押しながら、ViewController.swiftへドラッグをします。するとNameやTypeなどを選択するウィンドウが表示され、振る舞いを設定する事ができます。

funtouki6_1

 

まず0ボタンを関連付けしたいので

Connection:Action
Name:zero
Type:UIButton
Event:Touch Up Insideとし、Connectをクリック。するとViewController.swiftには
空のメソッドが自動生成されます。つまり0ボタンを押した時の動作をこのメソッド内に記述すれば意図した動きになります。
@IBAction func zero (sender: UIButton){
}

しかし、この方法は、少ないパーツだと便利に思えるのですが、今回はボタンが18個
ラベルが1つ、計19個のオブジェクトに対して関連付けないといけなくなります。
それはそうと、上のようなメソッドが18個作られる事に非常に違和感をもってしまいました。

この問題を何とかすべく奮闘した結果・・・

やはりありました!!

目的は全ての数字ボタンと小数点のボタンを一つのメソッドに
各演算ボタンとC、=ボタンを一つのメソッドで扱う事です。
またそれぞれどのボタンが押されたかを取得する事です。

一旦全ての関連付けを削除します。

※ソースは削除してもストーリーボード上には残っているので注意が必要ですが割愛します。
初めにViewController.swiftにメソッドのみ記述します。

@IBAction func number(sender: UIButton){
}

この時点ではただnumberという名前のメソッドを宣言しただけなので、これから関連付けしてみます。

先ほどは、ストーリーボードのオブジェクトからViewController.swiftへ向かってControlキーを押しながらドラッグしましたが、この逆も可能である事に気づき、ViewController.swiftのnumberメソッドから0ボタンへ向かって関連付けしてみました。先ほどと変わらないように思えますが、この方法は複数のオブジェクト(ボタン)に対して関連付ける事ができます。

numberメソッドと関連付けたいボタンを全て、アシスタントエディタを使って関連付けする事ができました。

 

funtouki6_3

同じように各演算、C,= ボタンに対してもユーザ定義のメソッドを用意し、関連付けしました。

@IBAction func Symbol(sender: UIButton){
}

funtouki6_4

[タグ付け]

もちろん、これだけでは0ボタンが押されても、1ボタンが押されても同じメソッドnumberが実行されるだけで、どのボタンが押されたかは判別できません。
そこでボタン各々に対して、識別子のようなもの(タグ)を設定し、そのタグを取得するという仕組みを実装します。

ソースコードを記述し、タグ付けする事も可能ですが、GUIでサクサク設定できる便利な方法でやってみたいと思います。
ストーリボードにて、タグ付けしたいボタンを選択しShow the Attributes inspecterタブから
View -> Tagをポチポチするだけです。今回は0ボタンにタグを設定したので、0のままにしています。

funtouki6_5

各ボタンに設定した番号を示します。

funtouki6_6

funtouki6_7

 

[タグの取得]

次は設定したタグを取得していきたいと思います。

先ほどのnumberメソッドを記述してみました。

@IBAction func number(sender: UIButton){

       var tagNum : Int = sender.tag

Switch tagNum {
case    0…9 :
・・・「0~9」ボタンが押下時
case    10 :
・・・「00」ボタンが押下時
case    11 :
・・・「.」ボタンが押下時
default :  break
}

}

@IBAction func Symbol(sender: UIButton){ 

print(sender.tag)

・・・

}

ソース上のsender.tagで先ほど設定したタグ番号(Int)を取得し、その番号によって、処理を振り分けるようにしています、また数字ボタンでは、そのタグ番号を一部を除いてそのまま実際の数値として扱う事ができるようになります。

keny



新人成長記録5th

こんにちは。Androidアプリのメイン開発者を目標に持つpoppyです
022
今回は、この目標に近づくために8月末までに行う3つのことを紹介していきます
以前の記事で紹介していたカレンダー機能の拡充をしていこうかと考えています

続きを読む



新人奮闘記5

iOS入門

今回から、Xcodeを使ってシンプルな電卓アプリを作成していきたいと思います。

今回は手始めにiPhone5、5s、5cを想定した画面サイズが4インチの端末を対象として作成していきます。

※iOSバージョン、AutoLayOut画面回転等は今回は考慮しません。

まずは、アプリのイメージを図にしてみます。

calc4re2

[図の説明]

画面4インチの全体サイズは568px×320pxですから、それを基準にボタンなどのオブジェクトを
配置してみました。

行ごとのオブジェクトの間隔は全て2.5pxに設定しました。

列ごとの間隔は5pxですが、両サイドの淵は、 2.5pxとしています。

ボタンの数は計18個、入力値や計算結果が表示されるラベルを一つ用意しました。

ボタンサイズは75px×75pxの正方形で、(C),(=)ボタンの二つは、75px×155pxとしました。

図の最上部、20pxは、電池残量や、電波状態が表示されるステータスバーなので、こちらも計算にいれました。

 


それではグラフィカルにドラッグ&ドロップでボタンを配置したりできてしまう、ストーリーボードを使って画面を作成して行きます。

※プロジェクト作成やシュミレーターの設定は割愛させて頂きます。

その前に今回はAutoLayoutは使いませんので、show the File inspectorタブから

Use Auto Layout のチェックを外しました。デフォルトではチェックが入っています。

 

[オブジェクトの配置]

Show the Object libraryタブをクリックすると、たくさんのオブジェクトが用意されています。

ここからViewへドラッグ&ドロップで、適当に配置してみたいと思います。

story1story2

 

ボタンと背景の色を区別するため、View->Show the Attributes inspector->Background

にて背景色をターコイズに変更してみました、ボタンの色も同じようにホワイトに変更しています。

これで、ボタン配置の準備は整いました。

ボタンを選択した状態でShow the Size inspectorタブからWidth、Heightを設定します。

この時、x、yの値に注意が必要で、Viewの左上が0,0となり。ボタンの左上を基準としてViewへ配置していきます。

例えばxが0ならボタンはViewの左端にぴったりと張り付き、320とするとViewをはみ出して右サイドの画面外に描画されます。

これを考慮して配置していきますが、オブジェクトそれぞれのプロパティを表に示します。

※細かな計算は省略します。

story4re2

 

各オブジェクトのプロパティを表の値に設定していきます。

story3

このようにボタンやラベルを一つずつ設定していきます。

[結果]

story5re2

 

画面の作成は完了しましたが、非常に手間に感じちゃいました。

近日中にもAutoLayoutで作ってみたいと思います。

今回は画面作成のみとなりますが、次回は動作するように実装していきたいと思います。

 

keny



新人成長記録4th

こんにちは、Android開発プログラマのpoppyです

前回の記事では、
ListViewにおける動的なViewの生成をご紹介いたしました

今回は、Fragmentについて記事にしていきたいと思います

続きを読む



新人奮闘記4

今回は、再帰関数を用いて素因数分解をするプログラムを作成してみました。

素因数分解と突然言われると、懐かしかったり、どうだったかな?という事で簡単に計算例だけ紹介しておきます。

素因数分解は自然数を素数の積で表します。

72 ,120をそれぞれ素因数分解すると

soinsu

のようになります。

今回は、与えられた自然数を2^3 × 3^2のようにハット記号で表すプログラムを書いていきます。

さっそく再帰関数を用いたコードを書いてみました。

soinsu1

 

     $x:素数の初期値    $n:今回のターゲット   $c:累乗の値x^c

5行目で関数をコールします。

8行目にて、xがnより大きい時、この関数は終了します。

9~15行目で、実際の計算を行っています。

16行目にて、自分自身をコールしていますが、この時1を加算してコールしています。

これにより、8行目で、関数は終了する事ができます。

7,8,16行目だけ見るとfor文と似た動きである事がわかります。

[基本的なfor文の動作]

初期化->条件式->ステートメント->インクリメント->条件式->ステートメント

loop_ex

[prime_Fact()の動作]

初期化->条件式->ステートメント->インクリメント->初期化->条件式

再帰呼び出しする時、$x+1,もしくは呼び出し以前に$xを変化させなければ無限ループになってしまう事に注意が必要です。

この条件式と再帰呼び出しの間がn回実行される処理という事になります。

[実行結果]

soinsu_ke

結果は予定通りですが…

いまいち納得がいきません!

上記コードだと、for文の代わりに関数を使って、関数内部(15行目)でechoを使って出力しています。

5行目にprim_Fact()を実行した場所で出力したいのです。つまり、実行結果を丸ごと返り値としてreturnして関数外部で使いたい。

これを解決しようとした時にハマりました。

それでは単純に関数内部で、結果文字列を貯めこんで、return しちゃえばいいんじゃないの?

という事で

14行目で最初の一度だけ$resを初期化

15行目にて連結を繰り返す。

7行目のreturnで貯め込んだ文字列$resを返す。

4行目にて、返り値を確認しています

コード

noticeres

 

[実行結果]

saikinotice_k

見ての通り$resは未定義扱い、おまけにNULLでreturnされていない事がわかります。

繰り返しの中で最後に一度だけ、return されているはずなのに、、、

そこで、returnはどこに何を返すのか、改めて考えていると、大きな勘違いをしている事に

気がつきました。returnは「呼び出し元へ値を返す」事はわかっていたつもりでした。

上記のコードは、7行目でreturnした値は,4行目に返る事を期待したコードです。

しかし、NULLという結果になっているという事は、4行目の関数には返っていません。

では、7行目のreturnはどこへ返っているのでしょうか。

結論から言うと、16行目のprime_Fact()へ返っていました。

動作を図へ示します。

 

saikizu

 

いままでは、シンプルに6行目から16行目を単に繰り返していると考えてました。

上図のように全く同じ関数ではないと考えると、ロジックは変化し、コードも変化します。

図を踏まえた上でもう一度コードを書きなしてみようと思います。

saikicode_f

[実行結果]

soinsu_ke

14行目で$strに最初の素因数分解の結果2^3が格納され、それを引数にして、次のprime_Fact()へ値を渡しています。

これを繰り返し、7行目のreturnが実行された時、一つ前の関数(呼び出し元)へ15行目へ値が返ります。

最終的に初めて関数をコールした場所(5行目)へ値が返ってくるという仕組みです。

以上、細かな例外処理は、割愛させていただきますが、再帰関数に頼る時には、役にたてばと思います。

 

keny

 




アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム