この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep35】Storyboardでシーンを編集する(画面構成、シーンにビューを追加、ラベルとボタンに制約追加、実行まで)」
さて、と。
実際にXcodeを使ってiOSアプリを開発する。
今回作成するiOSアプリは「電卓」だ。
ラベルとボタンの設置
まず一番最初にやるが、ラベルとボタンの設置だ。
これについてはサンプルアプリでやったことと同じことをする。
UIStackViewという便利な機能(クラス)を使うのがポイントって感じ。
水平方向のUIStackViewを4つと垂直方向のUIStackViewを1つ用意して制約をつけて整列させる。
アウトレットとアクションの接続
先ほど配置したラベルとボタンを機能させるためにアウトレットとアクションの接続を行う。
ラベルはアウトレットで接続してプロパティに、ボタンアクションで接続してメソッドで受け取る。
この作業自体は簡単で単純作業。
1つのメソッドに対して、複数のボタンを登録するのも最初は意味が分からなかったけど、やっていくうちに何となく感覚をつかめた。
1 2 3 4 5 6 7 8 9 10 11 12 |
@IBAction func numberButtonTapped(_ sender: UIButton) { } @IBAction func operatorButtonTapped(_ sender: UIButton) { } @IBAction func equalButtonTapped(_ sender: UIButton) { } @IBAction func allClearButtonTapped(_ sender: UIButton) { } |
計算を行うコードの記述
さらに列挙型を定義する。以前基本的な文法のところでやったが完全に忘れてた、列挙型。
(⇒「【Swift奮闘記ep18】列挙型について(列挙型の定義やswitch文を使ったマッチング)」)
1 2 3 4 5 6 7 |
enum Operator { case undefined case addition case subtraction case multiplication case division } |
また3つのプロパティを定義するところが面白い。
〇×〇=○
1 2 3 |
var firstValue = 0 var secondValue = 0 var currentOperator = Operator.undefined |
イコールで答えを出すまでに2つの数値と真ん中の演算子を記憶しておく必要があるからだ。
そしてSwitchを使ってnumberButtonTapped()メソッドを記述する。
sender.currentTitle!でUIButtonクラスのcurrentTitleプロパティ(Storyboardでボタンの「Title」に指定した文字列)
をアンラップして場合分けしている。
currentOperatorの中身が.undefinedかどうか確認して1つ目の値か2つ目の値か判断するところも素敵。
firstValue = firstValue * 10 + valueで何桁の数字も表現できるところは非常にスマート。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
@IBAction func numberButtonTapped(_ sender: UIButton) { var value = 0 switch sender.currentTitle! { case "0": value = 0 case "1": value = 1 case "2": value = 2 case "3": value = 3 case "4": value = 4 case "5": value = 5 case "6": value = 6 case "7": value = 7 case "8": value = 8 case "9": value = 9 default: value = 0 } if currentOperator == .undefined { firstValue = firstValue * 10 + value label.text = "\(firstValue)" } else { secondValue = secondValue * 10 + value label.text = "\(secondValue)" } } |
演算種類の入力もswitch文で記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@IBAction func operatorButtonTapped(_ sender: UIButton) { switch sender.currentTitle!{ case "+": currentOperator = .addition case "-": currentOperator = .subtraction case "×": currentOperator = .multiplication case "÷": currentOperator = .division default: currentOperator = .undefined } } |
他にも結果表示のコードや、オールクリアのコードを記述した。
イコールの処理↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@IBAction func equalButtonTapped(_ sender: UIButton) { var value = 0 switch currentOperator{ case .addition: value = firstValue + secondValue case .subtraction: value = firstValue - secondValue case .multiplication: value = firstValue * secondValue case .division: value = firstValue / secondValue case .undefined: value = firstValue } label.text = "\(value)" firstValue = 0 secondValue = 0 currentOperator = .undefined } |
オールクリアの処理↓
1 2 3 4 5 6 |
@IBAction func allClearButtonTapped(_ sender: UIButton) { firstValue = 0 secondValue = 0 currentOperator = .undefined label.text = "0" } |
実行
本を見ながらせっせと作ったアプリをシュミレータにて実行してみた。
するとエラーが出た。
どこかが間違っているようだ。
一か所間違いを発見したが(equalがequallになってた)、まだあるようだ。
探しても一向に見つからないので、アプリをもう一度最初から作り直すことにした。
復習がてらやれば勉強になって効果絶大!(とポジティブシンキング)
ということで実際にやり直してみたらちゃんと実行できた。
アプリ完成までの時間も2回目という事で、30分もかからずに作成できた。
一体どこが間違っていたかの検証は行っていない。おそらくそういった検証によって力がついていくんだろうけど、今は「とりあえず先に進むこと」を引き続き目標としていく。
続き⇒「【Swift奮闘記ep37】タイマーアプリを作ってみた(UIKit、AudioToolboxフレームワーク)」
※追記
この本の2巡目で電卓アプリをまた作って見たが、作り方はすっかり忘れていて新鮮な気持ちで作ることができた。
全く上達気はしないが、せめて何も見ずにこの電卓アプリくらいは作れる様にはなりたいところ。
(一つ一つのコードの意味は理解できてる)
コメント