解放区在住氷翠 緑の閃光

他のファイルを作って、クラスを実装してみよう。【Swift】

2018-05-27 23:20

このページの環境は
Swift4をベースにしています。
また、開発環境はXcode9
MacosはHighSierra 10.13となります。

氷翠です。

今回は外部のファイルを用意、クラスを作成することが目的となります。

まずはいつもどおりウインドウの設定から。「Storyboard」を開きます。

「Window」の項目では「title」に任意のタイトル名をつけます。
今回はウインドウの大きさを固定したいと考えたので、「Resize」の部分のチェックを外しておきます。
これでウインドウの大きさは固定されます。
また、氷翠はよく「コマンド+W」をアプリケーションの終了と勘違いしてしまうので、「Close」のチェックを外しましたw

デザインの出来上がりはこちら。Labelの部分には計算の結果が表示されるようにします。
「足す」と「引く」のボタンで+1、―1の計算がどんどんされる感じにします。

ちなみに、labelの設定で、このような部分をいじってあげると、文字の種類、文字の大きさが設定できます。今回のは、文字の大きさを20としておきました。

さらに、こんな部分で、文字位置を設定することができます。
いろいろと試してみるといいかもしれません。

ボタンの設定ですが、2つとも対して変わりはありません。「Title」の部分が「足す」か「引く」かの違いです。

では今回も画面を二分割して作業を開始します。
一つはStoryboard、もう一つはViewController.swiftを開きます。

まずはlabelをドラッグしてプログラムの中につなげていきます。

こんな感じで設定します。
で、今回は変数として用意するのはこのラベルだけにします。
ボタンはそれぞれアクションを起こすためのものなので。

次はボタンの設定です。なので、「Connection」は「Action」に設定します。

いずれも関数名が違うだけで設定は同じものです。
ちなみに、日本語が使えます。しかし、何が起きるかわからないので、半角アルファベットで定義したほうがいいかもしれませんw

次はいよいよ今回のメイン。
他のファイルを作成していきます。この画像のように、ファイルの一覧のところで右クリックするとこんなメニューが出るので、「New File…」を選択します。

ここでは単純に「Swift File」を選択します。
で、今回作成するのは計算の部分をこの中で定義したいと思うので、「keisan.swift」というファイル名にしました。

もう、これは証拠の画像でしかないけど、本当に作成したてはこれだけしか用意されていません。
本当であれば、クラスに対して、初期設定とかしていくとかっこいいのだけど、今回はそういうのはしません。
単純に計算だけの関数を用意します。


import Foundation
class keisan {
    func getAnswer(orig: Int, add: Int) -> Int {
        var answer: Int = 0
        answer = orig + add
        return answer
    }
}

これだけ。
getAnswerという関数を作成しました。
引数としては、元になる数字が「orig」という変数、足す数字が「add」という変数でいずれも整数型。
「->」の後ろにあるのが返り値の型ですが、これがない場合Voidで何も返しません。この場合「->」もいりません。

ではその内容ですが、まず、返り値となる変数を定義しています。「answer」という変数で整数。初期値として0を代入しています。
次の行で、足し算を行っています。もちろん、変数「add」の値がマイナスなら引き算になるでしょうし、その辺は基本です。
で、最後に答えとなった変数「answer」をreturnによって返しています。

これでこのファイルというか、クラスは完成とします。

では次に「ViewController.swift」を開きます。


import Cocoa
class ViewController: NSViewController {
    // 答えを表示するラベル
    @IBOutlet weak var answerField: NSTextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        // 初期値を設定 ここでは「0」を用意
        answerField.stringValue = String(0)
    }
    override var representedObject: Any? {
        didSet {
            // Update the view, if already loaded.
        }
    }
    @IBAction func 足し算(_ sender: NSButton) {
        let orig: Int = Int(answerField.stringValue)!
        let answer: Int = keisan().getAnswer(orig: orig, add: 1)
        answerField.stringValue = String(answer)
    }
    @IBAction func 引き算(_ sender: NSButton) {
        let orig: Int = Int(answerField.stringValue)!
        let answer: Int = keisan().getAnswer(orig: orig, add: -1)
        answerField.stringValue = String(answer)
    }
}

ちょっと長いですが、内容の全てを掲載。

ここで最初に注目するのは


override func viewDidLoad() {
    super.viewDidLoad()
    // 初期値を設定 ここでは「0」を用意
    answerField.stringValue = String(0)
}

この部分。ではこの「viewDidLoad()」とはどういう関数なのか?
ビューが表示された直後に実行される部分で、最初から用意されています。別の場所で。
そう、別の場所で定義されているので、ここであえて、「override」つまり上書きしているのです。
ということで、ラベルの部分に初期値として「0」を代入して、表示しています。
で、「0」というのは整数型なので、文字ではないので、文字として変換しているので、「String(0)」としているのです。


@IBAction func 足し算(_ sender: NSButton) {
    let orig: Int = Int(answerField.stringValue)!
    let answer: Int = keisan().getAnswer(orig: orig, add: 1)
    answerField.stringValue = String(answer)
}
@IBAction func 引き算(_ sender: NSButton) {
    let orig: Int = Int(answerField.stringValue)!
    let answer: Int = keisan().getAnswer(orig: orig, add: -1)
    answerField.stringValue = String(answer)
}

ここからが本番。

どちらも一箇所しか違いはないのだけどね。

3行しかないけど、1行目。
まずは元になる数字を取得します。ここではラベルの内容が元になる数字なので、ラベルから数字を取得します。で、ラベルは文字列「String」なので整数型に変換して「orig」という定数に代入します。

2行目で、クラスを呼び出し、続けて関数を呼び出しています。
クラスはなにもimportする必要もありません。すでにインポートされていると思ってください。
場合によってはクラスをオブジェクトとして扱うため一度定数に代入することもありますが、ここでは必要ないので、そのまま関数を呼び出しています。
その引数としてラベルから取得した「orig」という変数と「add」のところに「足し算」なら1、「引き算」なら-1を指定しています。
その答えが「answer」という定数に代入されています。

3行目でラベルに代入。

とまぁこんな感じで実行することができます。