日記
みかんを買ったので今から食べる.
今日書いたコード
class HTMLElement { let name: String let text: String? lazy var asHTML: () -> String = { [unowned unownedSelf = self, unowned elem = HTMLElement(name: "h3")] in if let text = unownedSelf.text { return "<\(unownedSelf.name)>\(text)</\(unownedSelf.name)>" } else { return "<\(unownedSelf.name) />" } } init(name: String, text: String? = nil) { self.name = name self.text = text } deinit { print("\(name) is being deinitialized") } } var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world") print(paragraph!.asHTML()) paragraph = nil
h3 is being deinitialized <p>hello, world</p> p is being deinitialized
感想
Capture Listの中で変数を初期化するとき,let
もvar
もつかないのにちょっと違和感があるけど常にイミュータブルなのにつけるのも変な話か.関数のパラメータはfunc name(arg param: Type = default)
なのでそっちだと考えたら違和感は薄らぎそう.
クロージャは関数のシンタックスシュガーみたいな話を以前読んだ気がするので探したらあった.
Global and nested functions, as introduced in Functions, are actually special cases of closures.https://docs.swift.org/swift-book/LanguageGuide/Closures.html