LoginSignup
0
2

More than 1 year has passed since last update.

【Swift】ストアドプロパティとコンピューテッドプロパティ

Last updated at Posted at 2021-09-16

構造体とは

インスタンスの型になるもの。
Taiyakiの構造体から、中身があんこのたいやきが作られる。
Carの構造体から、日産GTRが作られる。

Swiftでも、UI部品は構造体又はクラスから作られる。

struct Taiyaki{
 
}

プロパティとは

「インスタンスを特徴づける性質や特性」
たい焼きでと例えると、「中の具材」や「値段」

// プロパティの宣言
var プロパティ名 = 初期値
// 例
struct Taiyaki{
 var nakami = "あんこ"
 // 省略
}

ストアドプロパティ

プロパティの値が構造体で初期化されていて、
毎回固定の値が保持されているもの。
実際のコードだと以下の通り。

var プロパティ名 = 初期値
let プロパティ名 = 初期値

// 使用例
struct Taiyaki{
 // ストアプロパティ-初期値が設定されている
 var nakami = "クリーム"
 func sayNakami() {
  print("中身は" + nakami + "です")
 }
}

コンピューテッドプロパティ

ストアプロパティは初期値が設定されていて、
その値をもとにメソッドで使用していた。

それに対して、コンピューテッドプロパティには、以下の特性がある。

  • 初期値を持たない
  • 呼び出されたタイミングで処理を行い、必ず結果を返す

実際にコードを見るとわかりやすい

// 書き方
var プロパティ名: 型名{
 
 return 
}
// 例文
struct Vtuber{
 // これは初期値があるので、ストアプロパティ
 var nakami = "あんこ"
 // ここからがコンピューテッドプロパティ
 var sayNakami:String {
  result = print("中身は" + nakami + "です") // 初期値を使用せずに、変数を使用している
 }
}

ストアドプロパティとコンピューテッドプロパティの違い

2つの構文での違いは以下の通りになる。

ストアドプロパティ コンピューテッドプロパティ
変数、定数 varまたはlet varのみ
型名の省略 可能 不可
波括弧{}の有無 なし あり
戻り値 不要 必須

変数と定数

コンピューテッドプロパティの宣言では定数を指定できない。
定数を指定すると、中身の変更ができなくなるため。

 // letだと、変数nakamiが変更できなくなる
 var sayNakami:String {
  result = print("中身は" + nakami + "です") // 初期値を使用せずに、変数を使用している
 }

型名の省略

ストアドプロパティは変数の初期化の際、型を自動で認識してくれる。
対して、コンピューテッドプロパティは初期値がないので、
宣言時に明示的に型を指定する必要がある

 // ストアドプロパティ-変数を定義しているので、型を自動で認識する
 var nakami = "あんこ"

 // コンピューテッドプロパティ-初期値がないので、明示的に型を指定する必要がある
 var sayNakami:String {
  result = print("中身は" + nakami + "です")
 }

コンピューテッドプロパティとメソッドとの違い

上記で記載したコードはメソッドでも同様のことが実現できる。

// メソッドの場合
func sayNakami() -> Int{
 result = print("中身は" + nakami + "です")
}

ただし、コンピューテッドプロパティには大きな違いがある。

  • 引数を受け取ることができない
  • 戻り値が必ずある。

引数を受け取ることができない

メソッドには func sayNakami("あんこ":String) のように引数を設定できたが、
コンピューテッドプロパティではできない

戻り値が必ずある。

コンピューテッドプロパティは必ず、returnで戻り値を指定しなければならない
なお、中身1行だけの場合、省略できる

// 省略可能なケース
 var nakami = "あんこ"
 var sayNakami:String {
  print("中身は" + nakami + "です") //中身が1行のみのため、returnが省略できる
 }

// 省略不可能なケース
 var nakami = "あんこ"
 var sayNakami:String {
  
  return print("中身は" + nakami + "です") //中身が2行のみのため、明示的にreturnを記述
 }

まとめ

  • ストアドプロパティは初期値をもつもの(値を保持する)
  • コンピューテッドは初期値を持たず、読み出されたタイミングで計算する(計算する)
0
2
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
0
2