3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swiftの構造体、クラス、列挙型に関して

Last updated at Posted at 2021-07-08

swiftのデータ型

Swiftにはデータ型がクラスと構造体と列挙型の3つの種類がある。
それぞれの違いがややこしいのでまとめてみる。

データ型の説明の前に値型と参照型の違い

そもそもコンピュータのデータはメモリのセルの中に格納される。
値型はそのセルの中に→データの中身そのものが入る。
対して参照型は→メモリアドレスが渡される。要はデータが格納されている場所の情報が入る。

title.swift
var atai = "値型"
var copy = atai
atai = "値型2"
print (atai) //値型2
print(copy) //値型
//ーー下記参照型--//
class Sansyo {
 var name: String
    init(_ name: String) {
        self.name = name
    }
}
var sansyo = Sansyo("参照型")
var copysansyo = sansyo
sansyo.name = "参照型2"
print(sansyo.name) // "参照型2"
print(copysansyo.name) // "参照型2"

値型はデータそのものを渡す文メモリの容量を取る。
参照型はそうでもない代わりに副作用を生む可能性がある
*副作用とは,,ソフトウェアの設計者の知らないうちにデータが変更されてしまうこと

クラスとは

他の言語でもおなじみのクラス型。

構造体、列挙型が値型に対して唯一の参照型となる
下記、書き方の例

Class.swift
class Boku {
//しっかり型指定
 var name: String
 var sex: String
 var age: Int
//初期化処理(イニシャライザー)、JSのconstructor()のようなやつ。インスタンスを作る時に自動で発動する
init(name: String, sex: String,age: Int){
 self.name = name//selfは自分自身のインスタンスを示している
 self.age  = age
 self.sex  = sex
}

let boku = Boku(name:"boku",sex:"man",age:23)//インスタンスの生成
print(boku.name) //”boku"

もちろん、クラス内にメソッドを定義することも可能となる。
また、クラスなので継承をすることができる(ここらへんはOOPを理解する必要がある)
親クラス(スーパークラス)や子クラス(サブクラス)の書き方は以下の通り。

class 子クラスの名前: 親クラスの名前 {}

また、オーバーライドやfinalによるオーバーライドの禁止する書き方もあるのでチェックする必要がある。
クラスは奥が深いので後日、細かく勉強してアウトプットしたい。

構造体とは

複数の値を一つの構造体として管理できるデータ型のこと
クラスと違い値型。
また、継承は使用できない。
プロトコルや拡張機能(extension)は使用できる。

構造体の書き方

kouzoutai.swift
struct Person {
var name: String
var age: Int
 mutating func changeAge(age: Int) {
 self.age = age
 }
}
let person = Person(name: "Boku", age: 23)
person.changeAge(age: 24)

書き方はクラスと非常に似ている。
型宣言しつつ、init()でイニシャライザーもできる。(もちろんなくても良い)
メッソド内でストアドプロパティを変更する際はmutatingをfuncの前に使用。
これも構造体だけで二本くらい記事かけそうなので後日細かい部分をアウトプットしたい

列挙型とは

列挙型とは

列挙型の書き方

rekkyo.swift
enum [enum ] {
    case [enum 値1]
    case [enum 値2]
    case [enum 値3]
}

クラスと違って値型。init()によってイニシャライズを定義することができる
ストアドプロパティは定義できない。(コンパイルエラーになる)しかし、コンピューテッドプロパティとタイププロパティは定義できる。

*コンピューテッドプロパティとは
計算されたプロパティ
ゲッター/セッターを使って他のプロパティを持ってくるもの
ゲッター→他のプロパティの値をもとに実行され、値をゲットしてくる。
セッター→自身の新しい値(デフォルトでNewValue)を利用して、他のプロパティの値を更新(セット)する
(値を保持しない)条件分岐や処理によって変動する。

*ストアドプロパティとは
(値を保持する)
保有したプロパティ。よく見るやつ

StoredPropaerties
let name :String

*タイププロパティとは
インスタンス化しないプロパティ。(staticがついている)

公式ドキュメントには他にもたくさんあるのでこれも後日記事を書く。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?