日記
今日書いたコード
https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html
protocol Shape { func draw() -> String } struct Triangle: Shape { var size: Int func draw() -> String { var result: [String] = [] for length in 1...size { result.append(String(repeating: "*", count: length)) } return result.joined(separator: "\n") } } struct FlippedShape<T: Shape>: Shape { var shape: T func draw() -> String { let lines = shape.draw().split(separator: "\n") return lines.reversed().joined(separator: "\n") } } struct JoinedShape<T: Shape, U: Shape>: Shape { var top: T var bottom: U func draw() -> String { return top.draw() + "\n" + bottom.draw() } } let smallTriangle = Triangle(size: 3) let flippedTriangle = FlippedShape(shape: smallTriangle) let joinedTriangles = JoinedShape(top: smallTriangle, bottom: flippedTriangle) print("Non-Opaque Type") print(joinedTriangles.draw()) func flip<T: Shape>(_ shape: T) -> some Shape { return FlippedShape(shape: shape) } func join<T: Shape, U: Shape>(_ top: T, _ bottom: U) -> some Shape { JoinedShape(top: top, bottom: bottom) } let opaqueJoinedTriangles = join(smallTriangle, flip(smallTriangle)) print("Opaque Type") print(opaqueJoinedTriangles.draw())
Non-Opaque Type * ** *** *** ** * Opaque Type * ** *** *** ** *
初めて知ったこと
上で書いたコードのjoinedTriangles.draw()
とopaqueJoinedTriangles.draw()
はどちらも同じ結果になるが,呼び出し元から見た型は前者がJoinedShape<Triangle, FlippedShape<Triangle>>
で,後者がsome Shape
になっている.この違いが嬉しいらしい.SwiftUIを使っているのでOpaque Typeも使っているはずなんだけど,どう嬉しいかが腑に落ちていない.