Skip to content

Instantly share code, notes, and snippets.

@es-kumagai
Forked from haranicle/CodePiece.swift
Last active December 15, 2015 18:40
Show Gist options
  • Save es-kumagai/844bfd638b5edee92b00 to your computer and use it in GitHub Desktop.
Save es-kumagai/844bfd638b5edee92b00 to your computer and use it in GitHub Desktop.
Captureの挙動テスト #CodePiece
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されない。
}
@es-kumagai
Copy link
Author

HTMLElement? は値型 (Optional) になるのを留意しつつ、どこで HTMLElement が解放されたかがもう少し明確になるように do ブロックの最後に print("Done") を付けてみました。

@es-kumagai
Copy link
Author

lazy で代入しているクロージャーでは self すなわち HTMLElement をキャプチャーしているのと、HTMLElement を var 定義してキャプチャーしたのを代入したのとおそらく等価。HTMLElement? をキャプチャーしているところは HTMLElement(オブジェクト型)ではなく Optional(値型)をキャプチャーしていることになるはずなのが、それぞれの結果の差につながっているはず。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment