【Swift/SwiftUI】構造体の定義と利用方法

本記事ではSwiftにて構造体を宣言して使用する方法と構造体の中に入れることのできる要素について解説していきます。

構造体とは

構造体とは、事前に作成しておいた変数・メソッドなどをひとまとまりにした値型のデータです。

構造体の変数やメソッドへアクセスを行うことで、インスタンスが生成されます。

構造体は呼び出しごとにインスタンスが生成され、個別の実態データが生まれるため、同じ構造の異なるデータを複数扱うことができる点が大きなメリットになります。

構造体の形

構造体は「struct」から始まり、構造体名を記述することで書き始めます。構造体の中には、クラスと似たようなプロパティ、イニシャライザ、メソッドなどを記述することができます。

これらの要素を一括りにしてメンバと呼びます。また、変数や定数のことを構造体内ではプロパティと呼び、関数はメソッドと呼ばれます。

struct 構造体名 {
  プロパティ
 イニシャライザ
 メソッド
 ...
}

構造体の利用

構造体の宣言と使用方法、各メンバの役割について紹介していきます。

構造体の宣言

今回は例として、人の情報を持ち合わせた構造体を作成します。

struct PersonInfo {
    var name: String
    var age: Int
    var weight: Double
    var height: Double
    
    init(name: String, age: Int, weight: Double, height: Double) {
        self.name = name
        self.age = age
        self.weight = weight
        self.height = height
    }
    
    func getBmi() -> Double{
        return self.weight / ((self.height * self.height)/10000)
    }
    
}

PersonInfoという名前の構造体を定義しました。構造体を定義する際には「struct」をつけた後に続けて構造体名を宣言します。構造体の中で、プロパティやメソッドの宣言をしていきます。

PersonInfo構造体は、名前、年齢、体重、身長というプロパティを保有しており、getBmiというメソッドでは体重と身長を元にBMIの値を計算して返却してくれる機能を実装しています。

initで宣言されているものはイニシャライザという機能で、構造体のインスタンスが作成された際にinit内の処理が実行されます。PersonInfoでは、init内で各プロパティに初期値を代入する処理を行っています。プロパティを示す際には、パラメータとして受け取った変数名と区別するために「self.プロパティ名」とします。

構造体の使用

構造体を使用する際には、まず構造体のインスタンスを作成します。イニシャライザが定義されており、パラメータを渡す必要がある場合には関数使用時などと同様の形式で渡してあげます。

var tanaka = PersonInfo(name: "田中", age: 25, weight: 50, height: 160)
var takahashi = PersonInfo(name: "高橋", age: 19, weight: 60, height: 180)
var satou = PersonInfo(name: "佐藤", age: 30, weight: 75, height: 170)

上の例では、「構造体名(各パラメータ)」の形式で構造体のインスタンスを作成し、tanaka,takahashi,satouというそれぞれの人を意味した変数にインスタンスを代入しています。

それぞれの変数には値の異なる同じ構造のデータが入っており、同じように各メンバを呼び出すことができますが、内容が異なっていることを確認できます。

プロパティの呼び出しは、「変数名.プロパティ名」の形式で呼び出すことができます。

tanaka.name   //田中
takahashi.name   //高橋
satou.name   //佐藤

インスタンス内のメソッドもプロパティと同様に「変数名.メソッド名()」という形式で呼び出しを行うことができます。以下の例では、小数点第二位まで表示するよう結果のformatを調整しています。

String(format: "%.2f", tanaka.getBmi())       //19.53
String(format: "%.2f", takahashi.getBmi())       //18.52
String(format: "%.2f", satou.getBmi())       //25.95

このように構造体はを用意しておくことで、任意のタイミングで定義しておいた構造のインスタンスを複数作成して使用することができます。

print("\(tanaka.name)さんの年齢は\(tanaka.age)歳で、BMLは\(String(format: "%.2f", tanaka.getBmi()))です")
//田中さんの年齢は25歳で、BMLは19.53です

print("\(takahashi.name)さんの年齢は\(takahashi.age)歳で、BMLは\(String(format: "%.2f", takahashi.getBmi()))です")
//高橋さんの年齢は19歳で、BMLは18.52です

print("\(satou.name)さんの年齢は\(satou.age)歳で、BMLは\(String(format: "%.2f", satou.getBmi()))です")
//佐藤さんの年齢は30歳で、BMLは25.95です

最後に

本記事では、構造体の作成からインスタンスの作成と使用方法、構造体内で用意される各メンバの使用法について解説してきました。

他にもSwift/SwiftUIの関数の宣言方法や関数に変数の参照を引数として渡す方法について解説する記事も書いていますのでそちらもご覧ください。