構造体とは
インスタンスの型になるもの。
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を記述
}
まとめ
- ストアドプロパティは初期値をもつもの(値を保持する)
- コンピューテッドは初期値を持たず、読み出されたタイミングで計算する(計算する)