【SwiftUI】クラスとインスタンス

SwiftUIは、iOSアプリを開発を進める上で今となっては不可欠で非常に便利なフレームワークです。SwiftUIを使用する際に重要な要素として「クラス」と「インスタンス」があります。本記事では、SwiftUIにおけるクラスとインスタンスの概念について実例を用いて詳しく解説していきます。

クラスとは

SwiftUIにおいて、クラスとはデータとそのデータに対する操作や命令を定義する設計図のようなものです。

クラスの中では、複数のデータと操作を行う関数を持つことができます。

クラス内で定義されているデータのことを「プロパティ」、操作のことを「メソッド」と呼びます。

SwiftUIのクラスは再利用性が高く、様々な場面で同じクラスを使用することができます。例えば、ボタンやテキストフィールドなどのUI要素は、それぞれが独自のクラスとして定義されています。

では、実際のクラスの構造を解説していきます。基本的には、以下のプロパティ/イニシャライザ/メソッドで構成されております。

class クラス名{
    //プロパティ
    var 変数名 = 初期値
    
    //イニシャライザ
    init(引数:データ型) {
        self.変数名 = 引数
    }
    
    //メソッド
    func 関数名(引数:データ型)->戻り値のデータ型{
        return 戻り値
    }
}

プロパティは変数のことを表し、メソッドでは主にプロパティの値を使用して処理を行い、そのデータ型を返却したりすることに使用します。

イニシャライザとは、クラスをインスタンス化した際にプロパティに対して初期値を任意で設定する際に使用される機能です。詳細はインスタンスの方で解説していきます。実際のコードは以下のようになります。

class Person{
    
    //プロパティ
    var name:String
    var age:Int
    var tall:Int
    
    //イニシャライザ
    init(name:String, age:Int, tall:Int) {
        self.name = name
        self.age = age
        self.tall = tall
    }
    
    //メソッド
    func person_info() -> String {
        let info = "\(name)さんは、\(age)歳で身長は\(tall)cmです。"
        return info
    }
    
}

インスタンスとは

インスタンスは、クラスから生成された実体データのことを指し示します。クラスを設計図とたとえた場合に、インスタンスはそこから生成される建物と例えることができます。

インスタンスは、クラスで定義した形の中に値が入っており処理の中で処理を使用することができます。

1つのクラスの形を元にして、インスタンスは幾つでも生成することができます。

ここからは実際にインスタンスの使用例を紹介していきます。

インスタンス生成とイニシャライザ

まずはクラスの章で実際に作成しているクラスのインスタンスを生成する方法です。

以下のようにクラス名と括弧を書き、括弧の中にプロパティを指定することでクラスをインスタンス化することができます。

Person(name:"田中", age:23, tall:171)

このコードでインスタンス化を行った際に、自動でinit内の処理が呼び出されます。この例では、initの括弧内の各変数はインスタンス化した際に渡された実際の値が入っており、それをプロパティに代入していくというinitの処理を表しています。

渡される変数名とプロパティの名前が同一であるため、「self.プロパティ名」という書き方でプロパティを表して差別化しています。

//プロパティ
    var name:String
    var age:Int
    var tall:Int    

//イニシャライザ
    init(name:String, age:Int, tall:Int) {
        self.name = name
        self.age = age
        self.tall = tall
    }

プロパティ参照

次にインスタンスからプロパティの値を参照していきます。

まずインスタンス化した値を変数に代入し、その変数からプロパティを「変数名.プロパティ名」で参照することができます。

let person1 = Person(name:"田中", age:23, tall:171)
person1.name
person1.age
person1.tall

そして、これを複数のインスタンスを設定して行うと以下のように別々の値が取得でき、別々のインスタンスを設定できていることが確認できます。

let person1 = Person(name:"田中", age:23, tall:171)
let person2 = Person(name:"山田", age:25, tall:167)

//1と2のインスタンスからそれぞれnameプロパティを取得
person1.name
person2.name
person1.age
person2.tall

実行結果

田中
山田
23
167

メソッドの実行

メソッドを実行する際には、プロパティと同様に「変数名.メソッド名()」という形で実行します。

let person1 = Person(name:"田中", age:23, tall:171)
let person2 = Person(name:"山田", age:25, tall:167)

//person1とperson2のインスタンスからperson_infoメソッドをそれぞれ呼び出す
person1.person_info()
person2.person_info()

実行結果

"田中さんは、23歳で身長は171cmです。"
"山田さんは、25歳で身長は167cmです。"

メソッド呼び出しの際の仕組みは、インスタンスを生成した際に、イニシャライザにてプロパティの値を設定し、プロパティを利用してメソッドで処理を行った後の結果を取得することができるといったものです。

最後に

クラスとインスタンスについて説明してきました。クラスを一つ作成することで、同じコードを何度も書く必要がなくなり、たくさんのインスタンスを生成することができます。コードの保守性も上がってきます。

他にもSwiftUIで、メモアプリのような一覧画面から詳細画面に移動するアプリの作り方の解説記事など書いていますので、見ていってください!