Swift-Properties
Swift4言語は、値を関連付けるためのクラス、列挙、または構造体のプロパティを提供します。 プロパティは、格納されたプロパティと計算されたプロパティにさらに分類できます。
格納されたプロパティと計算されたプロパティの違い
格納されたプロパティ | 計算されたプロパティ |
---|---|
定数値と変数値をインスタンスとして格納 | 値を格納するのではなく、値を計算します |
クラスおよび構造体によって提供される | クラス、列挙型および構造体によって提供される |
格納されたプロパティと計算されたプロパティの両方がインスタンスタイプに関連付けられています。 プロパティがその型の値に関連付けられている場合、それは’型プロパティ’として定義されます。 格納されたプロパティと計算されたプロパティは、通常、特定の型のインスタンスに関連付けられます。 ただし、プロパティは型自体に関連付けることもできます。 このようなプロパティは、型プロパティとして知られています。 プロパティオブザーバーは、スーパークラス
ストアドプロパティ
から派生した継承されたサブクラスのプロパティを観察するために、
- ストアドプロパティの値を観察するためにも使用されます。Swift4では、定数と変数のインスタンスを格納するためのストアドプロパティの概念が導入されています。 定数の格納されたプロパティは’let’キーワードで定義され、変数の格納されたプロパティは’var’キーワードで定義されます。
- 定義中に格納されたプロパティは、”デフォルト値”を提供します
- 初期化中に、ユーザーは初期値を初期化し、変更することができます
struct Number { var digits: Int let pi = 3.1415}var n = Number(digits: 12345)n.digits = 67print("\(n.digits)")print("\(n.pi)")
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−
673.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 = 67print("\(n.digits)")print("\(n.numbers)")n.numbers = 8.7
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−
error: cannot assign to 'numbers' in 'n'n.numbers = 8.7
‘number’を8.7に再初期化する代わりに、’number’が定数として宣言されていることを示すエラーメッセージが返されます。
Lazy Stored Property
Swift4は、変数が初めて初期化されたときに初期値を計算しない’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)
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−
Swift 4
インスタンス変数
Objective Cでは、格納されたプロパティには、格納されたプロパティで宣言された値を格納するためのバックアップ目的のインスタン
Swift4は、これらの両方の概念を単一の「格納されたプロパティ」宣言に統合します。 対応するインスタンス変数とバックアップ値を持つ代わりに、’stored property’には、変数名、データ型、メモリ管理機能によってvariablesプロパティに関する単一の場所に定義されたすべての統合された情報が含まれています。
計算されたプロパティ
計算されたプロパティは、値を格納するのではなく、他のプロパティと値を間接的に取得および設定するためのgetterとオプ
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)
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−
(150.0, 75.0)-150.0-65.0
計算されたプロパティが新しい値を未定義のままにした場合、その特定の変数にデフォルト値が設定されます。
計算されたプロパティを読み取り専用プロパティとして
計算されたプロパティの読み取り専用プロパティは、getterを持つプロパティとして定義されますが、setterはありません。 これは常に値を返すために使用されます。 変数はさらにa’を介してアクセスされます。’構文ですが、別の値に設定することはできません。
class film { var head = "" var duration = 0.0 var metaInfo: { return }}var movie = film()movie.head = "Swift 4 Properties"movie.duration = 3.09print(movie.metaInfo!)print(movie.metaInfo!)
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−
Swift 4 Properties3.09
プロパティオブザーバーとして計算されたプロパティ
Swift4では、プロパティ値を観察して応答するためにプロパティオブザーバーが使用されます。 プロパティ値が設定されるたびに、プロパティオブザーバーが呼び出されます。 遅延格納されたプロパティを除いて、メソッド’overriding’によって’継承された’プロパティにプロパティオブザーバを追加できます。
プロパティオブザーバーは、次のいずれかで定義できます
-
値を格納する前に-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 = 100NewCounter.counter = 800
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−
Total Counter is: 100Newly Added Counter 100Total Counter is: 800Newly 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 = 98print(stud1Mark1.InternalMarks)stud1Mark2.InternalMarks = 87print(stud1Mark2.InternalMarks)
playgroundを使用して上記のプログラムを実行すると、次の結果が得られます−