見出し画像

Swiftでアプリ。 構造体とクラス

Swiftでアプリを作るときに大活躍するのがクラス、構造体となります。構造体は特にSwiftUIでは重要なものになっています。

構造体は"struct"、クラスは"class"を使って表現します。

struct

構造体の基本構造は

struct 構造体の名前 {
  どんなもの、どんなことができるか変数などで定義(プロパティの設定)
}

具体的には、構造体Animalを作ってみます。

struct Animal{
    var name:String
    var size:Int
}

簡単に名前と大きさのみ定義しました。使うときは変数に入れて使います。

var dog = Animal(name: "Taro", size: 20)

print(dog.name)

実行すると"Taro"と出力されます。

appleの作っているiPhone,Macなどのプログラムを作るためのSwiftUIは基本t系なところは構想体で作り上げられています。

import SwiftUI
struct ContentView: View {
// 必要なコード
}

そしてその中で使うVStack()なども構造体となっています。

@frozen struct VStack<Content> where Content : View

class

構造体と同じように定義することができます。例えば

class Animal{
    var name:String
    var size:Int
}

このようにするとエラーがでます。classの場合は初期値が決められている、もしくはイニシャライザー(init())というものが設定されていないとエラーがでます。

class Animal{
    var name:String
    var size:Int
    
    init(name:String,size:Int){
        self.name = name
        self.size = size
    }
}

init(name:String,size:Int){
self.name = name
self.size = size
}

の部分がイニシャライザです。

これでクラスの定義はできました。変数に入れて使ってみます。

var dog = Animal(name: "Taro", size: 10)

print(cat.name)

実行すると"Taro"と出力されます。構造体ではイニシャライザ(init())がなくても

Animal(name: "Taro", size: 20)

という感じで初期化ができましたがクラスはできません。これを全項目イニシャライザと言います。この点違うところです。

もう一つ構造体とクラスの違うところを挙げると、変数に代入する場合に構造体では"var"変数としてのみ可能となっています。それに対してクラスは"var"変数、"let"定数ともに代入することができます。

これは構造体が直接的に値を扱うのに対して、クラスは参照することで値を取り扱うということから、機能的に違うところがあることになります。

構造体は値型、クラスは参照型と呼ばれています。構造体は直接値を変数に入れていきますが、クラスは値でなくその値が記録されているアドレス(場所)を代入しているということで直接のデータはありません。

データはそのアドレスにあるというだけでデータがどんなものでも構わない、なので変更さても影響がないということです。

データがある場所の記録をクラスでは行うということで、たくさん同じ機能を使っている場合には機能の追加、削除が簡単になるというようなメリットがあります。

クラスの機能で構造体と違うところは継承ができるということです。親クラスから子クラスを作るという感じです。例えばということで

先に出ているAnimalクラスを継承して新しいクラス、"Dog"を作りま。

class Dog:Animal{
    func greet(){
        print("hello")
    }
}

"Dog"には機能をつけてみます。

func greet(){
  print("hello")
}

関数をつけることができ、これをメソッドと呼びます。使ってみます。

var dog = Dog(name: "Jiro", size: 20)

Animalで定義しているプロパティが使えるか試してみます。

print(dog.name)

として実行すると"Jiro"と出力されます。"Dog"では定義していないけど"Animal"を継承しているので"Animal"で定義するのと同じように使えます。
さらに追加した関数も

dog.greet()

とすれば使えるようになりました。継承をすると、親の機能をそのままに新しい機能を追加することができるので、いろんな派生で多種多様なものができます。親の機能を書き換えることも可能なのでカスタマイズが簡単に行えます。


この記事が気に入ったらサポートをしてみませんか?