Swift入門メモ -クラス・クラスの継承・プロトコル-

16 クラスを使う

dotinstall.com

クラスとは

  • 関連のある変数や関数をまとめて管理出来る
  • クラスの中の変数->プロパティ
  • クラスの中の関数->メソッド
  • クラスを使う時はインスタンスというデータの実体を作る

クラスを作る

  • クラスのプロパティは初期化されるかOptionalになる必要があるので、以下はエラーになる
class Student {
    var name: String // TODO 初期化されていない
    var number: Int // TODO 初期化されていない
    var appear: Int = 0
    func sayHello() {
        println("出席番号 \(number), \(name) say hello")
    }
    func update() {
        appear++
    }
}
  • イニシャライザーを作って初期化
  • インスタンス化してプロパティ等にアクセス
class Student {
    var name: String
    var number: Int
    var appear: Int = 0
    // イニシャライザーを作る
    init (name: String, number: Int) {
        // selfはそのクラスのインスタンス
        self.name = name
        self.number = number
    }
    func sayHello() {
        println("出席番号 \(number), \(name) say hello")
    }
    func update() {
        appear++
    }
}

// インスタンス化
var yasumoto = Student(name: "ayaka", number: 5)
yasumoto.name // ayaka
yasumoto.number // 5
yasumoto.sayHello() // 出席番号 5, ayaka say hello
yasumoto.appear // 0
yasumoto.update()
yasumoto.appear // 1

17 クラスの継承

dotinstall.com

継承とは

  • あるクラスを元に別のクラスを作る

できること

  • 親クラスで定義されたプロパティ、メソッドを全部使うことが出来る
  • 親クラスのメソッドoverrideできる
  • overrideを禁止することが出来る
  • 親クラスのメソッド、プロパティを呼ぶことが出来る
    • superを付ける
class Student {
    var name: String
    var number: Int
    var appear: Int = 0
    // イニシャライザーを作る
    init (name: String, number: Int) {
        // selfはそのクラスのインスタンス
        self.name = name
        self.number = number
    }
    func sayHello() {
        println("出席番号 \(number), \(name) say hello")
    }
    // override禁止 / final
    final func update() {
        appear++
    }
}

// Studentクラスを継承
class ExchangeStudent: Student {
    func reset() {
        appear = 0
    }
    // 親クラスのメソッドを上書き
    override func sayHello() {
        super.sayHello() // 親クラスのメソッドを呼ぶ
        println("出席番号 \(number) は永久欠番です!!")
    }
}


var yasumoto = Student(name: "ayaka", number: 5)
yasumoto.name // ayaka
yasumoto.number // 5
yasumoto.sayHello() // 出席番号 5, ayaka say hello
yasumoto.appear // 0
yasumoto.update()
yasumoto.appear // 1

// yasumoto.reset() // エラーになる。ExchangeStudentしか使えない

var hirono = ExchangeStudent(name: "suzuki", number: 8)
hirono.name // suzuki
hirono.number // 8
hirono.appear // 0
hirono.update()
hirono.appear // 1
hirono.reset()
hirono.appear // 0

// 出席番号 8, suzuki say hello
// 出席番号 8 は永久欠番です!!
hirono.sayHello()

18 プロトコル

dotinstall.com

プロトコルとは

  • 以下のような問題を解決してくれて便利なもの
    • すべてのプロパティを受け継がなくていい
    • クラスの継承では親クラスを複数持つことができない
  • 継承関係がないような複数のクラスに似たような機能を持たせることを保証することができる
protocol Idol {
    // プロパティは読み取り専用か、読み取り&設定両方可能かを指定出来る
    var group: String {get set}
    func sayGroupName() // プロトコルの中では実際の実装を書かない
}

// プロトコルを適用
// プロトコルが複数ある場合はカンマで区切る
// 親クラスを継承してからプロトコルを適用する場合は、継承してからカンマで区切ってプロトコルを適用
class Student: Idol {
    var name: String
    var number: Int
    var appear: Int = 0
    var group: String = "EBC" // プロトコルのプロパティ
    func sayGroupName() { // プロトコルのメソッド
        println("We are \(group)!!!")
    }
    
    // イニシャライザーを作る
    init (name: String, number: Int) {
        // selfはそのクラスのインスタンス
        self.name = name
        self.number = number
    }
    func sayHello() {
        println("出席番号 \(number), \(name) say hello")
    }
    // override禁止 / final
    final func update() {
        appear++
    }
}

var yasumoto = Student(name: "ayaka", number: 5)
yasumoto.group // EBC
yasumoto.sayGroupName() // We are EBC!!!