公開中のアプリ

[Swift入門#23]クラス(型プロパティ、型メソッド編)

今回はクラスから直接プロパティやメソッドを呼び出す方法について説明します。
今まではインスタンスを作成して、インスタンス名からプロパティやメソッドを呼び出していましたが、インスタンス関係なくクラスから直接呼び出してみましょう。

クラスから直接呼び出すとは?

まずクラスから直接呼び出すとはどう言う事か確認しておきましょう。
例えばStaffクラスの中のoutputと言うメソッドを呼び出したいとします。
その場合、1行目〜2行目のようにインスタンスを生成してから、インスタンス名で呼び出していました。
クラスから直接呼び出す場合は4行目のようにクラス名とメソッド名で呼び出す事ができます。

let mayugezio = Staff()
mayugezio.output()

Staff.output()

クラスから直接呼び出すにはstaticキーワード

クラスから直接呼び出すにはプロパティやメソッドの前にstaticと付けてあげるだけでOKです。
今回はスタッフの人数を値を持つ「peopleCountプロパティ」とそれを出力してくれる「getNumOfCountメソッド」を追加しました。

では例を見てみましょう!

class Staff {
    let name: String     //バイトの名前
    var salaryHour: Int  //時給
    var worked: Int      //働いた時間
    static var peopleCount = 0 // バイトの人数
    init(_ name: String, _ salaryHour: Int, _ worked: Int) {
        self.name = name
        self.salaryHour = salaryHour
        self.worked = worked
        Staff.peopleCount += 1
    }
    static func getNumOfCount() {
        print("スタッフの人数は\(peopleCount)人です")
    }
}

Staff.getNumOfCount() //結果 スタッフの人数は0人です
let mayugezio = Staff("まゆげじお", 1250, 8)
Staff.getNumOfCount() //結果 スタッフの人数は1人です

今回追加したのが5行目の「peopleCountプロパティ」と12行目〜14行目の「getNumOfCountメソッド」です。
どちらも文頭にstaticと記述されているのがわかると思います。
クラスから直接呼び出すにはこれだけでOKです!

ただこれだど新人が入って来ても1を足してくれないので、どこかで「peopleCountプロパティ」に1を足すコードを書かないといけませんね。

「スタッフが新しく入る」=「インスタンスが生成される」と言う事なので、インスタンスが生成されるたびに、「peopleCountプロパティ」に1を足す事で解決するかと思います。

インスタンスが生成されると必ず実行されるのがイニシャライザでしたね?

イニシャライザについてはこちら→[Swift入門#17]クラス(イニシャライザ編)

なのでイニシャライザの中で「peopleCountプロパティ」に1を足していきます。
10行目がその記述ですが、イニシャライザはインスタンスから使うメソッドなので今回は、クラスから呼び出して「peopleCountプロパティ」1を足しています。

では結果を見てましょう。

クラスから直接「getNumOfCountメソッド」を呼び出しているのが17行目です。
18行目でインスタンスを生成して、「peopleCountプロパティ」1を足しています。
1足されたかを確認する為に19行目でもう一度「getNumOfCountメソッド」を呼び出しています。

結果が「スタッフの人数は0人です」から「スタッフの人数は1人です」に変わってるのが確認できると思います。

overrideできるようにするclassキーワード

実はstaticを付けたメソッドはoverrideする事ができません。
overrideしたい場合はstaticをclassと言うキーワードに変えるだけでOKです!

Staffクラスを継承したStaff2クラスを作成して、「getNumOfCountメソッド」をoverrideしたのが下記コードです。

class Staff {
    let name: String     //バイトの名前
    var salaryHour: Int  //時給
    var worked: Int      //働いた時間
    static var peopleCount = 0 // バイトの人数
    init(_ name: String, _ salaryHour: Int, _ worked: Int) {
        self.name = name
        self.salaryHour = salaryHour
        self.worked = worked
        Staff.peopleCount += 1
    }
    class func getNumOfCount() {
        print("スタッフの人数は\(peopleCount)人です")
    }
}

class Staff2: Staff {
    override class func getNumOfCount() {
        print("[Staff2]スタッフの人数は\(peopleCount)人です")
    }
}

Staff2.getNumOfCount() //結果 スタッフの人数は0人です
let fuchan = Staff2("Fu-chan", 1100, 4)
Staff2.getNumOfCount() //結果 スタッフの人数は1人です

まずは12行目を見て下さい。
staticがclassになっていますね。
次は18行目です。
ここでoverrideしてますが、overrideの隣にclassと書かれているのがわかると思います。
ここの2点だけ注意すればOKだと思います。

もしoverrideできない事を忘れて、そのままoverrideしようとしてもエラーで教えてくれるのですぐ気づくと思います。

先ほどと同じですが、結果が23行目〜25行目に書いてあります。

まとめ

今回はクラスから直接プロパティやメソッドを呼び出す方法を書きました。
クラスについての記事は今回で7記事目です。
まだまだ書きます( ̄▽ ̄)
それだけクラスが難しいと言う事なのかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

アプリ