(環境)
xcode:11.3
version 5.1.3
(参考文献)
詳解 Swift 第5版
著者 萩原剛志
発行者 SBクリエイティブジャブ式会社
P084-085
上記の書籍において、タイププロパティの説明について、以下のコードのdisplay2.show()
のstdWidth
がdisplay3.show()
の結果から変化がないことについて、この様に言及されています。
タイププロパティび初期化のための式は、値が必要とされて初めて評価され、その後は使われないことが原因です。
ここからstdSizeは最初のインスタンスを生成するときに初期化されたあとは、例えばdisplay3の様に新しい、インスタンスを生成しても、再評価はされない(改めて初期化はされない)と読み取れました。なぜこの様な仕様になっているか理由はわからないのですが、例えば一番最後いいかのコードを加えると
print(LCD.stdWidth)
当然、2560が改めて初期化(再評価)され表示されると思います。
同じタイププロパティ、stdWidth
とstdSize
再評価されるとされないのは違いはなんでしょうか?stdSize
は数式だから?間接的に値が決まるから?
同じタイププロパティでもなぜ、この様に違いが生じるのか分かる方がいればご教示ください。
※もっと言ってしまうと、display1インスタンスを生成した時点で初めてタイププロパティstdSizeが評価されて、それで最後にして使われなくなるとも解釈できるので、上記の引用文の通りであればdisplay2
もdisplay1
と同じ結果が出力される様な気もするのですが・・・・
swift
1var serialNumber = 2127 2 3struct LCD { 4 struct Size { 5 var width, height:Int 6 } 7 static var stdHeight = 1080 8 static var stdWidth = 1920 9 static var stdSize = Size(width: stdWidth, height: stdHeight) 10 11 static func sn() -> Int { 12 serialNumber += 1; 13 return serialNumber 14 } 15 let size: Size 16 let serial = "CZ:" + String(LCD.sn()) 17 18 init(size: Size = LCD.stdSize) { 19 self.size = size 20 } 21 func show() { 22 print(serial, "((size.width)x(size.height))") 23 } 24 25} 26 27 28let display1 = LCD(size: LCD.Size(width:800, height:600)) 29display1.show()//CZ:2129 (800x600) 30LCD.stdHeight = 1200 31let display2 = LCD() 32display2.show()//(1920x1200) 33LCD.stdWidth = 2560 34let display3 = LCD() 35display3.show()//(1920x1200)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/25 01:18