[Swift]初心者向けにクラスの使い方をまとめてみた

swift

初心者向けにSwiftのクラスの使い方をまとめてみました。

基本的なクラスの使い方を中心にまとめています。

Swiftのクラスを使ってみる

というわけで、さっそくSwiftのクラスの使い方を紹介していきます。

かなり簡単なクラスで説明していきますので、初心者向けの記事となります。

まず、、、犬クラスを作ってみましょう。名前プロパティとメソッドとして「吠える」という機能を付けてみます。

class Dog {
    var name = "ポチ"
   
    func bark() -> String {
        return "\(name)がbow!と吠えました"
    }

Swiftのクラスの書き方は、先頭にclass~と記述しその後にクラス名を記述します。命名規則に則り、クラス名の先頭は大文字で記載します。

let name: Stringでnameプロパティを設定し、クラス内にメソッドはそのまま書いてOKです。

では、これをインスタンス化してみましょう。

class Dog {
    var name = "ポチ"
    
    func bark() -> String {
        return "\(name)がbow!と吠えました"
    }
}

var dog = Dog()
dog.bark() // ポチがbow!と吠えました

var dog = Dog()でDogクラスをインスタンス化しています。

インスタンス化することで、変数dogに入り.bark()で関数が使えるようになりました。

クラスのプロパティを空で設定し、インスタンス化する際に設定する

上記の例では、クラス内ですでにname = ポチというプロパティを設定しています。

インスタンス化する度にポチが量産されます笑

次に、nameプロパティは設定せずインスタンス化する時に犬の名前を決めれるようにします。

class Dog {
    var name : String
    
    func bark() -> String {
        return "\(name)がbow!と吠えました"
    }
    
    init(name: String) {
        self.name = name
    }
}

var dog = Dog(name: "ポチ")
dog.bark()

先ほどのコードと変わった点は2点。

  • nameプロパティを事前に設定していない
  • 犬の名前はインスタンス化する時に決めることができる

ちなみに、var name : Stringと記述してとりあえずString型のnameプロパティを用意するだけではエラーが返ってきます。

Class ‘Dog’ has no initializers

先ほどの例では、最初からDogクラスのnameプロパティにはポチという名前(初期値)が設定されていました。

今回の例では、var name : Stringと空で用意されているため初期値がありません。

 

そのためにはinit()~ 以下の記述が必要になります。initはインスタンス化する度に処理が走り、初期値を設定してくれます。初期値を事前に設定している場合はこの処理は不要ですが、今回ポチという名前を事前に設定していないため必要というわけです。

var dog = Dog(name: “ポチ”)で、nameプロパティにポチという初期値を設定しました。

この記述でnameプロパティは自由に設定することができます。

親クラスと子クラスを設定する

次に親クラスと子クラスを見ていきます。Swiftでは他の言語と同じようにクラスの継承をすることができます。

クラスの継承をうまく使うことで、同じ処理を再度書く必要がなくなりコードがすっきりします。

  • 親クラス(スーパークラス)
  • 子クラス(サブクラス)

このようにも呼びます。

それでは、動物クラスを作りそこからサブクラスの犬クラス、猫クラスを作ってみましょう。

class Animal {
    let name : String
    func bark() -> String {
        return ""
    }
    
    init(name: String) {
        self.name = name
    }
}

class Dog : Animal {
    override func bark() -> String {
        return "\(name)がbow!と吠えました"
    }
}

class Cat : Animal {
    override func bark() -> String {
        return "\(name)がnyan!と鳴きました"
    }
}

var dog = Dog(name: "ポチ")
dog.bark() // ポチがbow!と吠えました

var cat = Cat(name: "タマ")
cat.bark() // タマがnyan!と鳴きました

少し冗長になってしまいましたが、Animalクラス(スーパークラス)では先ほどと同じようにnameプロパティとbark関数を定義しました。

そして、その特徴をそのままDogクラス、Catクラスで継承しています。

継承することで、Animalクラスの持つプロパティや関数を使うことができます。

なお、クラスの継承は class 子クラス名 : 親クラス名{}で記述します。

今回、犬はワン!猫はにゃーと鳴かせたかったのでAnimalクラスのbark関数をいじりました。

この時に使うのがoverride funcです。これにより親クラスの関数を上書きしています。

Swiftで複数のクラスを継承することはできるのか?

ここで疑問。Swiftで複数のクラスを継承することはできるのでしょうか?

例えば、狼 Wolfクラスを作成したいとします。狼は野生動物なのでWildクラスを追加して、AnimalクラスとWildクラスを継承したいとします。可能でしょうか?

答えはNO。Swiftでは多重継承はできません。継承できるクラスは一つまでという決まりがあります。(他の言語では多重継承ができる言語もあります)

では、複数の定義を継承したい場合はどのようにしたらいいのでしょうか?

この時に使われるのが「プロトコル」というものです。

このプロトコルがけっこう強力でして、Swiftの開発者がSwiftはオブジェクト指向プログラミングではない、プロトコル指向プログラミングだと言っているのも頷けます。

プロトコルの説明をすると、また長くなってしまいますのでSwiftのプロトコルについて詳しく紹介されている記事を紹介しておきます。

Swiftをせっかく使うならProtocol Oriented Programmingしたい



カテゴリー