ぜのぜ

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

80日目

日記

今日書いたコード

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も使っているはずなんだけど,どう嬉しいかが腑に落ちていない.