-
-
Save es-kumagai/844bfd638b5edee92b00 to your computer and use it in GitHub Desktop.
Captureの挙動テスト #CodePiece
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class HTMLElement { | |
let name: String | |
let text: String? | |
// プロパティでasHTMLへのstrong参照を持っている | |
lazy var asHTML: Void -> String = { // nameとtextを使いたいからlazy | |
// Closure内でselfのプロパティをキャプチャしている | |
if let text = self.text { | |
return "<\(self.name)>\(text)</\(self.name)>" | |
} else { | |
return "<\(self.name) />" | |
} | |
} | |
init(name: String, text: String? = nil) { | |
self.name = name | |
self.text = text | |
} | |
deinit { | |
print("\(name) is being deinitialized") | |
} | |
} | |
let defaultText = "default text" | |
do { | |
var h1:HTMLElement = HTMLElement(name: "h1") | |
h1.asHTML = { | |
return "<\(h1.name)>\(h1.text ?? defaultText)</\(h1.name)>" | |
} | |
print(h1.asHTML()) // "<h1>default text</h1>"とprintされる | |
// なにもprintされない。 | |
print("Done") | |
// なにもprintされない。 | |
} | |
do { | |
var h2:HTMLElement? = HTMLElement(name: "h2") | |
h2!.asHTML = { | |
return "<\(h2!.name)>\(h2!.text ?? defaultText)</\(h2!.name)>" | |
} | |
print(h2!.asHTML()) // "<h2>default text</h2>"とprintされる | |
// なにもprintされない。 | |
print("Done") | |
// なにもprintされない。 | |
} | |
do { | |
var h3:HTMLElement? = HTMLElement(name: "h3") | |
h3!.asHTML = { | |
return "<\(h3!.name)>\(h3!.text ?? defaultText)</\(h3!.name)>" | |
} | |
print(h3!.asHTML()) // "<h3>default text</h3>"とprintされる | |
h3 = nil | |
// "h3 is being deinitialized" とprintされる。 | |
print("Done") | |
// なにもprintされない。 | |
} | |
do { | |
var br:HTMLElement = HTMLElement(name: "br") // headingの参照カウント1 | |
print(br.asHTML()) // "<br />"とprintされる | |
// なにもprintされない。 | |
print("Done") | |
// なにもprintされない。 | |
} | |
do { | |
var wbr:HTMLElement? = HTMLElement(name: "wbr") // headingの参照カウント1 | |
print(wbr!.asHTML()) // "<wbr />"とprintされる | |
// なにもprintされない。 | |
print("Done") | |
// なにもprintされない。 | |
} | |
do { | |
var hr:HTMLElement? = HTMLElement(name: "hr") // headingの参照カウント1 | |
print(hr!.asHTML()) // "<hr />"とprintされる | |
hr = nil | |
// なにもprintされない。 | |
print("Done") | |
// なにもprintされない。 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
lazy で代入しているクロージャーでは self すなわち HTMLElement をキャプチャーしているのと、HTMLElement を var 定義してキャプチャーしたのを代入したのとおそらく等価。HTMLElement? をキャプチャーしているところは HTMLElement(オブジェクト型)ではなく Optional(値型)をキャプチャーしていることになるはずなのが、それぞれの結果の差につながっているはず。