【Swift】プロパティの種類!ストアドプロパティやタイププロパティとは?
この記事からわかること
- Swiftのプロパティとは?
- プロパティの種類と違い
- ストアドプロパティ/コンピューテッドプロパティの使い方
- インスタンスプロパティ/タイププロパティの使い分け
- static/classキーワードとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftにおけるプロパティについてまとめていきます。
参考文献: 2.10.5. タイププロパティ | プロパティ | Swift
プロパティとは?
プロパティとは「属性/性質」と言った意味を持つ英単語であり、IT用語としてはオブジェクトの持つ設定や属性、データなどのことを呼びます。
Swiftもオブジェクト指向型のプログラミング言語です。言語仕様として他の言語にも見られるクラス(class)やSwift独自の構造体(struct)が用意されており、それら(オブジェクト)に対して任意のプロパティ(変数)とメソッド(関数)を定義することができます。
おすすめ記事:【Swift】構造体(struct)とは?クラスとの違いと使い方
Swiftでのプロパティはvar
キーワードで変数として、let
キーワードで定数として宣言できます。
class Company{
// 再代入可能
var name:String = ""
// 再代入不可
let telephoneNumber:String = "090-xxxx-xxxx"
}
プロパティの種類
- ストアドプロパティ
- コンピューテッドプロパティ
- インスタンスプロパティ
- タイププロパティ
こう見ると異なる4種類があるようですが、ストアドプロパティにインスタンスとタイプがコンピューテッドプロパティにもインスタンスとタイプがある組分けになります。
ストアド/コンピューテッド
データの保持方法の違い
インスタンス/タイプ
参照条件の違い
ストアドとコンピューテッドの違い
まずはストアドプロパティとコンピューテッドプロパティの違いを見ていきます。
ストアドプロパティ(StoredProperty)
別名「格納型プロパティ」。データを保持する。
コンピューテッドプロパティ(ComputedProperty)
別名:「計算型プロパティ」。データを算出する。
両者の違いはデータを不変的な状態で保持するか常に計算された可変的な状態で保持するかです。
ストアドプロパティ
ストアドプロパティ(StoredProperty)はシンプルに値を保持するプロパティです。格納型と呼ばれるようにプロパティに対して数値や文字列などのデータを格納できます。
class Test {
var stored:String = "Hello World"
}
コンピューテッドプロパティ
コンピューテッドプロパティ(ComputedProperty)は値を保持せずgetterと setterによって値を算出するプロパティです。クロージャーで計算式を渡すことができreturnを使って値を返します。getterとsetterは省略した記述することも可能です。
おすすめ記事:【Swift】基本構文を復習!タプルや変数の使い方、型の注意点#computedプロパティ
class Test {
var computed:Int {
let result = 2 + 5
return result
}
}
インスタンスとタイプの違い
インスタンスプロパティ
インスタンスに紐付いたプロパティ
タイププロパティ
型に紐付いたプロパティ
両者の違いはインスタンス化した後に参照するかするかインスタンス化しなくても参照できるかです。
インスタンスプロパティ
インスタンスプロパティとは名前の通りインスタンス化した時に参照できるプロパティです。これまで使用してきたのがまさしくインスタンスプロパティになります。
class Company{
var name:String = ""
}
var apple = Company()
apple.name = "Apple"
var google = Company()
google.name = "Google"
これはインスタンスごとに紐付いているので他のインスタンスとの繋がりは生まれません。
タイププロパティ
タイププロパティは型自身に紐付くプロパティです。複数のインスタンスを生成しても共通の値を保持させることができます。
Swiftではプロパティ宣言時にstatic
またはclass
キーワードを付与することでタイププロパティとして定義できます。
extension Company{
static var area:String = "Japan"
}
print(Company.area) // Japan
タイププロパティとして定義したプロパティにはインスタンス化しなくてもドットシンタックスを使って値を参照することができます。
staticとclassキーワードの違い
タイププロパティを定義するキーワードとしてstatic
/class
キーワードがありますが、両者にも違いがあります。
class Company{
class var name:String { "" }
static var area:String = "Japan"
}
Company.name
Company.area
例えば構造体や列挙型ではclass
は使用できません。
struct Company{
class var area:String = "Japan" ×
}
またclass
ではストアドプロパティは定義できません。
class Company{
class var name:String = "Japan" ×
}
その他の違いをまとめると以下の通りです。
項目 | static | class |
---|---|---|
ストアドプロパティ | 使用できる | 使用できない |
Override | できない | できる |
構造体/列挙型 | 使用できる | 使用できない |
おすすめ記事:【Swift】プロパティオブザーバとは?willSetとdidSetの使い方
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。