Property Wrappers A property wrapper adds a layer of separation between code that manages how a property is stored and the code that defines a property.
AttributeΛͭͬͯ͘ΈΔ // 12ҎԼΛอূ͢Δ @propertyWrapper struct TwelveOrLess { private var number = 0 // ඞਢ var wrappedValue: Int { get { return number } set { number = min(newValue, 12) } } }
@propertyWrapper struct SmallNumber { private var maximum: Int private var number: Int var wrappedValue: Int { get { return number } set { number = min(newValue, maximum) } } init() { maximum = Int.max number = 0 } init(wrappedValue: Int) { maximum = Int.max number = min(wrappedValue, maximum) } init(wrappedValue: Int, maximum: Int) { self.maximum = maximum number = min(wrappedValue, maximum) } }
@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 } } } }
public struct Failable: Codable { public let value: Wrapped? public init(from decoder: Decoder) throws { do { let container = try decoder.singleValueContainer() value = try container.decode(Wrapped.self) } catch { value = nil } } public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() if let value = self.value { try container.encode(value) } else { try container.encodeNil() } } }