Contents
スウィフト – プロパティ
プロパティとは
クラスや構造体、列挙体等で定義することができる定数/変数のことをさします
Swift 4言語は、値を関連付けるクラス、列挙体または構造体のプロパティを作成できます。プロパティは、さらに、StoredプロパティとComputedプロパティに分類できます。
StoredプロパティとComputedプロパティ
Storedプロパティ | Computedプロパティ |
---|---|
定数と変数の値をインスタンスとして格納する | 値を格納するのではなく値を計算する |
クラスと構造によって構成 | クラス、列挙および構造によって構成 |
Storedプロパティ
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だけが保持されます。
プロパティを格納するもう1つの方法は、定数構造を持つことです。したがって、構造全体のインスタンスは「定数の格納プロパティ」とみなされます。
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’が定数として宣言されていることを示すエラーメッセージを返します。
Lazy Storedプロパティ
Swift 4は、変数が初めて初期化されたときに初期値を計算しない、「Lazy Storedプロパティ」という柔軟なプロパティを提供します。’lazy’修飾子は、変数宣言の前にlazy格納プロパティとして使用されます。
遅延プロパティが使用されます –
- オブジェクトの作成を遅らせる。
- プロパティがクラスの他の部分に依存している場合、それを知らせない
class sample { lazy var no = number() // 宣言が必要です. } class number { var name = "Swift 4" } var firstsample = sample() print(firstsample.no.name)
私たちが上記のプログラムを遊び場で実行すると、次の結果が得られます。
Swift 4
インスタンス変数
Objective Cでは、
Storedプロパティには、Storedプロパティで宣言された値を格納するバックアップ用のインスタンス変数もあります。
Swift 4は、これら両方の概念を単一の「Storedプロパティ」宣言に統合します。対応するインスタンス変数とバックアップ値 ‘Storedプロパティ’を持つ代わりに、変数名、データ型、およびメモリ管理機能によって変数プロパティに関する単一の場所に定義されたすべての統合情報が格納されます。
計算されたプロパティ
値を保存するのではなく、ゲッターとオプションのセッターを使用して、他のプロパティーと値を間接的に検索して設定します。
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
計算されたプロパティが新しい値を未定義として残すと、デフォルト値がその特定の変数に設定されます。
read onlyプロパティとして計算されたプロパティ
計算されたプロパティのread onlyプロパティは、getterを持つプロパティで定義されますが、セッターはありません。常に値を返すために使用されます。
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
プロパティオブザーバとして計算されたプロパティ
プロパティオブザーバは、
- プロパティオブザーバは、プロパティ値の変更を監視して反応します。プロパティオブザーバは、新しい値がプロパティの現在値と同じであっても、プロパティ値が設定されるたびに呼び出されます。。
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