ぜのぜ

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

35日目 projected value

日記

ご飯ができたので雑

今日書いたコード

@propertyWrapper
struct SmallNumber {
    private var number = 0
    var projectedValue = false
    var wrappedValue: Int {
        get { return number }
        set {
            if newValue > 12 {
                number = 12
                projectedValue = true
            } else {
                number = newValue
                projectedValue = false
            }
        }
    }
}

enum Size {
    case small, large
}

struct SizedRectangle {
    @SmallNumber var height: Int
    @SmallNumber var width: Int

    mutating func resize(to size: Size) -> Bool {
        switch size {
        case .small:
            height = 10
            width = 20
        case .large:
            height = 100
            width = 100
        }
        return $height || $width
    }
}

var sized = SizedRectangle()
print(sized.resize(to: .large), sized.$width, sized.$height)
print(sized.resize(to: .small), sized.$width, sized.$height)
// => true true true
// => true true false

初めて知ったこと

property wrapperはprojected valueを定義することで追加の機能を提供できる.上のコードの$で始まるやつ.SwiftUIでやたら便利なやつの意味がわかった.これどっちが先なんだろう.