
構造体/クラス/列挙型(これら型の種類)についての共通した仕様はすでに学習済みです。この記事では3種の固有の仕様を中心に書きとめていきます。
値の受け渡し方法 (値型/参照型 )
Swiftの3種の型(構造体/クラス/列挙型)は値の受け渡しの方法によって値型と参照型の2つに分けられます。
構造体/列挙型 → 値型
クラス → 参照型
値型 (構造体/列挙型)
値型とは、値への参照ではなく値そのものを表す型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
struct Color { var red: Int var green: Int var blue: Int } var xxx = Color(red: 255, green: 0, blue: 0) //xxxに(値型のインスタンス)赤を代入 var yyy = xxx //yyyに赤を代入 xxx.red = 0 //xxxを黒に変更する print(xxx) //xxxのredは「0」に変わるが、 print(yyy) //yyyのredは「255」のまま /*出力 Color(red: 0, green: 0, blue: 0) Color(red: 255, green: 0, blue: 0) */ |
fa-chevron-circle-rightmutatingキーワード
構造体や列挙型(値型)のメソッドで値を変更するには、funcの前にmutatingをつける必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
enum Job { case banker, engineer, youtuber } struct character { var name: String var job: Job var age: Int func changeJob(newJob: Job) { //mutatingがないからエラー。以下のようにfuncの前にmutatingを付ければOK self.job = newJob } } mutating func changeJob(newJob: Job) { //これでエラーが出なくなる self.job = newJob } struct character { var name: String let job: Job var age: Int mutating func changeJob(newJob: Job) { //定数(let)だと再代入は不可 self.job = newJob } } |
参照型 (クラス)
インスタンスが値への参照を表す型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class aaa { var value: Int init(value: Int) { self.value = value } } var xxx = aaa(value: 1) //xxxは参照型のインスタンスaaa(value: 1)を参照する var yyy = xxx //yyyはxxxと同じくインスタンスaaa(value: 1)を参照する xxx.value //1 yyy.value //1 xxx.value = 2 xxx.value //2 yyy.value //2 |
変数や定数への参照型の代入はインスタンスに対する参照の代入を意味するため、複数の変数や定数で1つの参照型のインスタンスを共有できます。
構造体
値型の一種で、ストアドプロパティ(値を保持するプロパティ)の組み合わせによって一つの値を表す。例えば縦と高さの二つのストアドプロパティをもつ構造体で、画面のサイズを表すことが出来ます。もちろん型を構成する要素は全て利用可能です。
標準ライブラリで提供される多くの方は構造体です。(Bool型/数値型/String型/Array
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
struct aaa { var id: Int init(id: Int) { self.id = id } } var xxx = aaa(id: 1) //1 xxx.id = 2 //2 let yyy = aaa(id: 1) //1 yyy.id = 2 //コンパイルエラー /* 定数に代入された構造体のストアドプロパティはk変更出来ない。 */ |
fa-chevron-circle-rightmutatingキーワード
値型のところで触れましたが、値型のストアドプロパティの変更を含むメソッドにはmutatingが必要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
struct aaa { var id: Int init(id: Int) { self.id = id } mutating func Amethod() { //mutatingがないとエラー id = 2 } } var xxx = aaa(id: 1) xxx.id //1 xxx.Amethod() xxx.id //2 |
クラス
構造体と同じような構造だが、参照型、継承可能という点が異なる。
Cococaのほとんどの型はクラス。