読者です 読者をやめる 読者になる 読者になる

【iPhoneアプリを作ってみる】3.xcode6で電卓もどきできたどー!(コードメイン)

iPhoneアプリ開発


結局あきらめてつけちゃいました。
いや、猫様がだれてるししゃーないやん?ということにしておきたいがちゃまにあですどーもこんにちは。
ほんと暑くなったねー。
あの男が帰ってきたし、夏突入かな。


さすが修造。ぱねぇ。

まあそんな戯言はさておき、今日は家に引きこもってxcodeをいじっております。
電卓の仕組み、なんとなくわかった!

コードはこんな感じです

//
//  ViewController.swift
//  Copyright (c) 2015年 GACHA. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var calc: UIButton!
    @IBOutlet weak var answer: UILabel!
    @IBOutlet weak var n1: UIButton!
    @IBOutlet weak var n2: UIButton!
    @IBOutlet weak var n3: UIButton!
    @IBOutlet weak var multiple: UIButton!
    
    
    var left:String = "";
    var right:String = "";
    var inr:Bool = false;
    var command = "";
    
    override func viewDidLoad() {
        super.viewDidLoad()
        n1.addTarget(self, action: "calcf:", forControlEvents: .TouchUpInside);
        n2.addTarget(self, action: "calcf:", forControlEvents: .TouchUpInside);
        n3.addTarget(self, action: "calcf:", forControlEvents: .TouchUpInside);
        multiple.addTarget(self, action: "calcf:", forControlEvents: .TouchUpInside);
        calc.addTarget(self, action: "calcf:", forControlEvents: .TouchUpInside);     
        // Do any additional setup after loading the view, typically from a nib.
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func calcf (sender: UIButton){
        var result: Int?;
        switch sender{
        case multiple:
            command=sender.titleLabel!.text!;
            answer.text="*";
            inr=true;
        case calc:
            if inr{
                switch command{
                case "*":
                    result = right.toInt()! * left.toInt()!;
                default:
                    result = 0;
                }
                answer.text="\(result!)";
                left = "";
                right = "";
                inr=false;
            }
                
        default:
            if inr{
                right=right+sender.titleLabel!.text!;
                answer.text=right;
            }
            else{
                left=left+sender.titleLabel!.text!;
                answer.text=left;
            }
            
        }
        
     }
 
}

サンプルコードを解析しながら作ったので解釈が合ってるか微妙。
私はこう理解したよーという覚書も兼ねて説明行きます。

まずはMain.storyboardにUIを配置。
今回はlabelとbuttonを適当に。

var left 最初の数字
var right 2つ目の数字
var inr:Bool=false 2つ目の数字が入ったか判断する(演算記号が入力されるとtrueに)
var command なんの演算記号が使われたかを判断するための変数(今回は掛け算のみなのであまり意味はない)
addTargetでタップされた(指が離れた?)時に何をするか設定。ここではfunc culcf。

func calcfで処理を定義する。
var resultは計算結果を代入する変数。
switch senderで押されたボタンごとの処理を定義する。
case multipleは*の記号が押された時の処理で、var commandにボタンに表示されている文字(ここでは*)を代入する、画面に「*」の記号を表示させる、var inrをtrueにする、という流れ。
case calcはvar inrがtrueかfalseかによって処理を変えている。
var inrがtrueの(A*Bの形で入力されている)場合、var commandの値によって処理を変える。
rightとleftは文字列で変数を定義しているので、それを数値に変えるためにtoInt()を使う。
defaultは*以外が押された時の処理(breakじゃいかんのだろうか…)
answer.textで計算結果を表示。
leftとrightとinを初期化。
で、*とcalc以外(=数字)が押された時、left・rightともに今の数値に押されたボタンの値を足す(ここも文字から数値に変化させるのでtoInt使用している)

以上!
っていう解釈で合ってるんでしょうか?整合はそれなりに取れてると思うんだけどな。

だから「もどき」なんです

勘のいい方はすでに気付いてると思うんですが、これ電卓の割にbuttonが少ない。
ええ、そうです。
 
手抜きましたけど何か?(`・ω・´)
 

f:id:gachamania:20150712145342p:plain

今回の目的は電卓を完成させることではない、swiftというものがどういう仕組みで、どういう手順を踏めば実装できるのかを知ることなのだ!
だから数字が3までだろうが!掛け算しかなかろうが!今は良いのである!!
…って力説しとくか(笑)

まあでもほんとにそこが目的なので、細かいところにはこだわってません。
ぶっちゃけると、上のコードには致命的なバグあるし。
本当に電卓アプリ作るならちゃんと考えるけど、今はまあいっかと思ってます。
それより次は配列とか画像とか使ってサンプル作りたいんだよなー。
しばし考えます。