Swift-properties

提供:Dev Guides
移動先:案内検索

Swift-プロパティ

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

格納プロパティと計算プロパティの違い

Stored Property Computed Property
Store constant and variable values as instance Calculate a value rather than storing the value
Provided by classes and structures Provided by classes, enumerations and structures

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

  • 格納されたプロパティの値を観察するには
  • スーパークラスから派生した継承サブクラスのプロパティを観察するには

保存されたプロパティ

Swift 4では、定数および変数のインスタンスを保存するためのStored Propertyコンセプトが導入されています。 定数の保存プロパティは「let」キーワードによって定義され、変数の保存プロパティは「var」キーワードによって定義されます。

  • 定義中に、保存されたプロパティは「デフォルト値」を提供します
  • 初期化中に、ユーザーは初期値を初期化および変更できます
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では、保存されたプロパティには、保存されたプロパティで宣言された値を保存するためのバックアップ用のインスタンス変数もあります。

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

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

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

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

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では、プロパティ値を監視して応答するために、プロパティオブザーバーが使用されます。 プロパティ値が設定されるたびに、プロパティオブザーバが呼び出されます。 レイジーストアドプロパティを除き、メソッド 'overriding’によってプロパティオブザーバを 'inherited’プロパティに追加できます。

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

  • 値を保存する前に-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

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

ローカル変数とグローバル変数は、プロパティの計算と監視のために宣言されます。

Local Variables Global Variables
Variables that are defined within a function, method, or closure context. Variables that are defined outside function, method, closure, or type context.
Used to store and retrieve values. Used to store and retrieve values.
Stored properties is used to get and set the values. Stored properties is used to get and set the values.
Computed properties are also used. Computed properties are also used.

タイプのプロパティ

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

構文

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