Issue #851

Use DefaultValue to provide defaultValue in our property wrapper DefaultCodable

public protocol DefaultValue {
    associatedtype Value: Codable
    static var defaultValue: Value { get }
}

public enum DefaultBy {
    public enum True: DefaultValue {
        public static let defaultValue = true
    }

    public enum False: DefaultValue {
        public static let defaultValue = false
    }
}

@propertyWrapper
public struct DefaultCodable<T: DefaultValue> {
    public var wrappedValue: T.Value

    public init(wrappedValue: T.Value) {
        self.wrappedValue = wrappedValue
    }
}

extension DefaultCodable: Equatable where T.Value: Equatable {
    public static func == (l: DefaultCodable, r: DefaultCodable) -> Bool {
        l.wrappedValue == r.wrappedValue
    }
}

extension DefaultCodable: Codable {
    public init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        do {
            wrappedValue = try container.decode(T.Value.self)
        } catch {
            wrappedValue = T.defaultValue
        }
    }

    public func encode(to encoder: Encoder) throws {
        try wrappedValue.encode(to: encoder)
    }
}

Read more