Swift-プロパティ

Swift 4言語は、値を関連付けるためのクラス、列挙、または構造のプロパティを提供します。プロパティは、保存済みプロパティと計算済みプロパティにさらに分類できます。

保存されたプロパティと計算されたプロパティの違い

保存されたプロパティ 計算されたプロパティ
定数値と変数値をインスタンスとして保存します 値を保存するのではなく、値を計算する
クラスと構造によって提供されます クラス、列挙、構造によって提供されます

StoredプロパティとComputedプロパティはどちらも、インスタンスタイプに関連付けられています。プロパティがそのタイプ値に関連付けられている場合、「タイププロパティ」として定義されます。保存および計算されたプロパティは通常、特定のタイプのインスタンスに関連付けられています。ただし、プロパティはタイプ自体に関連付けることもできます。このようなプロパティは、タイププロパティと呼ばれます。プロパティオブザーバーも使用されます

  • 保存されたプロパティの値を監視するには
  • スーパークラスから派生した継承されたサブクラスのプロパティを監視するには

保存されたプロパティ

Swift 4では、定数と変数のインスタンスを格納するためのストアドプロパティの概念が導入されています。定数の格納プロパティは「let」キーワードで定義され、変数の格納プロパティは「var」キーワードで定義されます。

  • 定義中、Storedプロパティは「デフォルト値」を提供します
  • 初期化中に、ユーザーは初期値を初期化および変更できます
struct Number {
   var digits: Int
   let pi = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.pi)")

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

67
3.1415

上記のコードの次の行を検討してください-

let pi = 3.1415

ここで、変数piは、インスタンスpi = 3.1415の格納されたプロパティ値として初期化されます。したがって、インスタンスが参照されるときはいつでも、値3.1415のみを保持します。

プロパティを格納する別の方法は、定数構造として持つことです。したがって、構造体のインスタンス全体が「定数の保存されたプロパティ」と見なされます。

struct Number {
   var digits: Int
   let numbers = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.numbers)")
n.numbers = 8.7

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

error: cannot assign to 'numbers' in 'n'
n.numbers = 8.7

'number'を8.7に再初期化する代わりに、 'number'が定数として宣言されていることを示すエラーメッセージを返します。

怠惰な保存プロパティ

Swift 4は、「Lazy Stored Property」と呼ばれる柔軟なプロパティを提供します。このプロパティでは、変数が初めて初期化されるときに初期値が計算されません。'lazy'修飾子は、変数宣言の前に使用され、遅延格納プロパティとして使用されます。

レイジープロパティが使用されます-

  • オブジェクトの作成を遅らせるため。
  • プロパティがクラスの他の部分に依存している場合、それはまだ不明です
class sample {
   lazy var no = number()    // `var` declaration is required.
}

class number {
   var name = "Swift 4"
}

var firstsample = sample()
print(firstsample.no.name)

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

Swift 4

インスタンス変数

Objective Cでは、Storedプロパティには、保存されたプロパティで宣言された値を格納するためのバックアップ用のインスタンス変数もあります。

Swift 4は、これら両方の概念を単一の「保存されたプロパティ」宣言に統合します。対応するインスタンス変数とバックアップ値を持つ代わりに、「保存されたプロパティ」には、変数名、データ型、およびメモリ管理機能によって変数プロパティに関する単一の場所で定義されたすべての統合情報が含まれます。

計算されたプロパティ

計算されたプロパティは、値を格納するのではなく、他のプロパティと値を間接的に取得および設定するためのゲッターとオプションのセッターを提供します。

class sample {
   var no1 = 0.0, no2 = 0.0
   var length = 300.0, breadth = 150.0

   var middle: (Double, Double) {
      get {
         return (length / 2, breadth / 2)
      }
      
      set(axis){
         no1 = axis.0 - (length / 2)
         no2 = axis.1 - (breadth / 2)
      }
   }
}

var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)

print(result.no1)
print(result.no2)

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

(150.0, 75.0)
-150.0
-65.0

計算されたプロパティが新しい値を未定義のままにした場合、その特定の変数にデフォルト値が設定されます。

読み取り専用プロパティとして計算されたプロパティ

計算されたプロパティの読み取り専用プロパティは、getterはあるが、setterがないプロパティとして定義されます。常に値を返すために使用されます。変数には、「。」を介してさらにアクセスします。構文ですが、別の値に設定することはできません。

class film {
   var head = ""
   var duration = 0.0
   var metaInfo: [String:String] {
      return [
         "head": self.head,
         "duration":"\(self.duration)"
      ]
   }
}

var movie = film()
movie.head = "Swift 4 Properties"
movie.duration = 3.09

print(movie.metaInfo["head"]!)
print(movie.metaInfo["duration"]!)

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

Swift 4 Properties
3.09

プロパティオブザーバーとして計算されたプロパティ

Swift 4では、プロパティ値を監視して応答するために、プロパティオブザーバーが使用されます。プロパティ値が設定されるたびに、プロパティオブザーバーが呼び出されます。怠惰な保存プロパティを除いて、メソッド「オーバーライド」によって「継承された」プロパティにプロパティオブザーバーを追加できます。

プロパティオブザーバーは、次のいずれかで定義できます。

  • 値を保存する前に-willset

  • 新しい値を保存した後-didset

  • プロパティが初期化子で設定されている場合、willsetおよびdidsetオブザーバーを呼び出すことはできません。

class Samplepgm {
   var counter: Int = 0 {
      willSet(newTotal){
         print("Total Counter is: \(newTotal)")
      }
      
      didSet {
         if counter > oldValue {
            print("Newly Added Counter \(counter - oldValue)")
         }
      }
   }
}

let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700

ローカル変数とグローバル変数

プロパティを計算および監視するために、ローカル変数とグローバル変数が宣言されています。

ローカル変数 グローバル変数
関数、メソッド、またはクロージャのコンテキスト内で定義されている変数。 関数、メソッド、クロージャ、または型コンテキストの外部で定義されている変数。
値の保存と取得に使用されます。 値の保存と取得に使用されます。
保存されたプロパティは、値を取得および設定するために使用されます。 保存されたプロパティは、値を取得および設定するために使用されます。
計算されたプロパティも使用されます。 計算されたプロパティも使用されます。

タイププロパティ

プロパティは中括弧{}を使用してタイプ定義セクションで定義され、変数のスコープも以前に定義されています。値型の型プロパティを定義するには、「static」キーワードが使用され、クラス型には「class」キーワードが使用されます。

構文

struct Structname {
   static var storedTypeProperty = " "
   static var computedTypeProperty: Int {
      // return an Int value here
   }
}

enum Enumname {
   static var storedTypeProperty = " "
   static var computedTypeProperty: Int {
      // return an Int value here
   }
}

class Classname {
   class var computedTypeProperty: Int {
      // return an Int value here
   }
}

プロパティのクエリと設定

インスタンスプロパティと同じように、タイププロパティはクエリされ、「。」で設定されます。インスタンスを指すのではなく、型のみの構文。

struct StudMarks {
   static let markCount = 97
   static var totalCount = 0
   
   var InternalMarks: Int = 0 {
      didSet {
         if InternalMarks > StudMarks.markCount {
            InternalMarks = StudMarks.markCount
         }
         if InternalMarks > StudMarks.totalCount {
            StudMarks.totalCount = InternalMarks
         }
      }
   }
}

var stud1Mark1 = StudMarks()
var stud1Mark2 = StudMarks()

stud1Mark1.InternalMarks = 98
print(stud1Mark1.InternalMarks)

stud1Mark2.InternalMarks = 87
print(stud1Mark2.InternalMarks)

遊び場を使用して上記のプログラムを実行すると、次の結果が得られます-

97
87