Swift初心者が構造体とクラスについて、理解できた事をメモしました。間違えていたら、ご指摘ください。
#構造体とクラスの違い
構造体とクラスはとてもよく似ていて分からなかったのですが、調べていくと結構違いがありました。
###①継承
継承する事で他のオブジェクトの機能をほぼ引き継ぎ、使用することができます。
クラス・・・他のクラスを継承できる
構造体・・・他の構造体を継承できない
class a {
var b : Int
init() {
b = 10
}
}
struct c {
var d : Int
init() {
d = 10
}
}
//クラスaを継承
//但し、親クラスのイニシャライザの継承は、基本的にはしないようです
class z : a {
override init() {
}
}
//構造体cを継承、エラー
struct q : c {
override init(){
}
}
###②型
参照型か値型かによって、インスタンス化する際に定数・変数のどちらを使うかで、格納されているプロパティを書き換えできたり、できなかったりします。
クラス・・・参照型 変数・定数どちらでも書き換え可能
構造体・・・値型 変数のみ書き換え可能
構造体のプロパティ定義で定数を使うと、あとで変えることができません。
//クラスの場合
class a {
var b : Int
init() {
b = 10
}
}
//インスタンス化
let e = a()
//10が出力される
print(e.b)
//20が出力される
e.b = 20
print(e.b)
//構造体の場合
struct c {
var d : Int
init() {
d = 10
}
}
//インスタンス化 ここをvarに変えれば下記のエラーは出ないです
let f = c()
//10が出力される
print(f.d)
//ここでエラーが出ます
f.d = 20
print(f.d)
###③イニシャライズ
クラス・・・イニシャライズで初期値を与える必要があります
構造体・・・イニシャライズで初期値を与えなくても動きます
//クラスの場合
class sampleString {
var sString : String
//init() { }で初期値を与える
init() {
sString = "sString" //self.sString = "sString"
}
}
let insString = "hello"
print(insString)
//構造体の場合
struct sampleStruct {
var sStruct : String
}
//init() { }はなくても動く
let insStruct = "hello"
print(insStruct)
###④使い分け
やはり継承できるかどうかが、大きな違いだと思います。これ以外の部分ではデータの容量で決めるとか、値型を使いたいとかそういう部分なのかなと思います。
クラスを使う・・・元のクラスから、その機能を継承して新しいクラスを作っていく場合
構造体を使う・・・継承を使わない前提で、一つのデータのまとまりを使いたい場合
###
因みに、プロトコルの採用はクラス、構造体のどちらでもできます。まあ、共通の規則を構造体全てに一から書いていくのも、合理的ではないですしね。ただ、クラスの継承も、プロトコルの採用も同じような場所に書くから、多少ややこしいです。最初は構造体でも継承できるのかなって思っていました。