ぜのぜ

しりとりしようぜのぜのぜのぜ

84日目

日記

みかんを買ったので今から食べる.

今日書いたコード

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の中で変数を初期化するとき,letvarもつかないのにちょっと違和感があるけど常にイミュータブルなのにつけるのも変な話か.関数のパラメータは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