【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の使い方

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index