CocoaPods trunk is moving to be read-only. Read more on the blog, there are 19 months to go.

SBCodableWrappers 1.0.4

SBCodableWrappers 1.0.4

Maintained by spirit-jsb.



  • By
  • spirit-jsb

SBCodableWrappers

API

Wrappers

  • @BoolAsIntDecoding
  • @BoolAsIntEncoding
  • @BoolAsIntCoding
  • @BoolAsStringDecoding
  • @BoolAsStringEncoding
  • @BoolAsStringCoding
  • @Base64Decoding
  • @Base64Encoding
  • @Base64Coding
  • @SecondsSince1970DateDecoding
  • @SecondsSince1970DateEncoding
  • @SecondsSince1970DateCoding
  • @MillisecondsSince1970DateDecoding
  • @MillisecondsSince1970DateEncoding
  • @MillisecondsSince1970DateCoding
  • @ISO8601DateDecoding
  • @ISO8601DateEncoding
  • @ISO8601DateCoding
  • @NonConformingBoolDecoding
  • @NonConformingBoolEncoding
  • @NonConformingBoolCoding
  • @DateFormatterDecoding
  • @DateFormatterEncoding
  • @DateFormatterCoding
  • @ISO8601DateFormatterDecoding
  • @ISO8601DateFormatterEncoding
  • @ISO8601DateFormatterCoding
  • @LossyArrayDecoding
  • @LossyDictionaryDecoding
  • @LossySetDecoding
  • @NonConformingFloatDecoding
  • @NonConformingFloatEncoding
  • @NonConformingFloatCoding
  • @NonConformingDoubleDecoding
  • @NonConformingDoubleEncoding
  • @NonConformingDoubleCoding
  • @NullEncoding
  • @StaticDecoding
  • @StaticEncoding
  • @StaticCoding
  • @OptionalDecoding
  • @OptionalEncoding
  • @OptionalCoding
  • @OmittedDecoding
  • @OmittedEncoding
  • @OmittedCoding
  • @Immutable

Non-Conforming Bool Coding

{
    "boolValue": 1
}

struct SBModel: Codable {
    @BoolAsIntCoding
    var boolValue: Bool
}
{
    "boolValue": "true"
}

struct SBModel: Codable {
    @BoolAsStringCoding
    var boolValue: Bool
}
struct SBNonConformingBoolValueProvider: NonConformingBoolValueProvider {
    static func bool(from value: Int) -> Bool? {
        return value == 1 ? true : value == -1 ? false : nil
    }

    static func value(from bool: Bool) -> Int {
        return bool ? 1 : -1
    }
}

{
    "boolValue": -1
}

struct SBModel: Codable {
    @NonConformingBoolCoding<SBNonConformingBoolValueProvider>
    var boolValue: Bool
}

Base64 Coding

{
    "dataValue": "SGVsbG8gV29ybGQh"
}

struct SBModel: Codable {
    @Base64Coding
    var dataValue: Data
}

Date Coding

{
    "dateValue": 1699394889.0
}

struct SBModel: Codable {
    @SecondsSince1970DateCoding
    var dateValue: Date
}
{
    "dateValue": 1699394889000.0
}

struct SBModel: Codable {
    @MillisecondsSince1970DateCoding
    var dateValue: Date
}
{
    "dateValue": "2023-11-08T06:08:09Z"
}

struct SBModel: Codable {
    @ISO8601DateCoding
    var dateValue: Date
}
struct SBDateFormatterStaticCoder: DateFormatterStaticCoder {
    static var dateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM:dd:yy HH:mm:ss"

        return dateFormatter
    }()
}

{
    "dateValue" : "11:08:23 06:08:09"
}

struct SBModel: Codable {
    @DateFormatterCoding<SBDateFormatterStaticCoder>
    var dateValue: Date
}
struct SBISO8601DateFormatterStaticCoder: ISO8601DateFormatterStaticCoder {
    static let iso8601DateFormatter: ISO8601DateFormatter = {
        let formatter = ISO8601DateFormatter()
        formatter.formatOptions = [.withInternetDateTime, .withDashSeparatorInDate]

        return formatter
    }()
}

{
    "dateValue": "2023-11-08T06:08:09Z"
}

struct SBModel: Codable {
    @ISO8601DateFormatterCoding<SBISO8601DateFormatterStaticCoder>
    var dateValue: Date
}

Lossy Collection Decoding

{
    "arrayValue": [
        "1",
        null,
        "2",
    ],
    "dictionaryValue": {
        "1": "1",
        "2": "2",
        "3": null
    },
    "setValue": [
        "1",
        null,
        "2"
    ]
}

struct SBModel: Codable {
    @LossyArrayDecoding
    var arrayValue: [String]

    @LossyDictionaryDecoding
    var dictionaryValue: [String: String]

    @LossySetDecoding
    var setValue: Set<String>
}

Non-Conforming Decimal Coding

struct SBNonConformingDecimalValueProvider: NonConformingDecimalValueProvider {
    static var positiveInfinity: String = "100"
    static var negativeInfinity: String = "-100"
    static var nan: String = "0"
}

{
    "positive": "100",
    "negative": "-100",
    "nan": "0",
    "regular": 5.0
}

struct SBModel: Codable {
    @NonConformingFloatCoding<SBNonConformingDecimalValueProvider>
    var positive: Float
    @NonConformingFloatCoding<SBNonConformingDecimalValueProvider>
    var negative: Float
    @NonConformingFloatCoding<SBNonConformingDecimalValueProvider>
    var nan: Float
    @NonConformingFloatCoding<SBNonConformingDecimalValueProvider>
    var regular: Float
}
struct SBNonConformingDecimalValueProvider: NonConformingDecimalValueProvider {
    static var positiveInfinity: String = "100"
    static var negativeInfinity: String = "-100"
    static var nan: String = "0"
}

{
    "positive": "100",
    "negative": "-100",
    "nan": "0",
    "regular": 5.0
}

struct SBModel: Codable {
    @NonConformingDoubleCoding<SBNonConformingDecimalValueProvider>
    var positive: Double
    @NonConformingDoubleCoding<SBNonConformingDecimalValueProvider>
    var negative: Double
    @NonConformingDoubleCoding<SBNonConformingDecimalValueProvider>
    var nan: Double
    @NonConformingDoubleCoding<SBNonConformingDecimalValueProvider>
    var regular: Double
}

Null Encoding

struct SBModel: Codable {
    @NullEncoding
    var stringValue: String?
}

{
    "stringValue": null
}

Optional Coding

{
    "dateValue": null
}

struct SBModel: Codable {
    @OptionalCoding<ISO8601DateCoding>
    var dateValue: Date?
}

Omitted Coding

Ignore property when decoding or encoding

Immutable

struct SBModel: Codable {
    @Immutable
    @SecondsSince1970DateCoding
    var createTime: Date

    @SecondsSince1970DateCoding
    var updateTime: Date

    mutating func update() {
        self.createTime = Date()    // Error - Cannot assign to property: 'createTime' is a get-only property
        self.updateTime = Date()    // Work!
    }
}

限制条件

  • iOS 11.0+
  • Swift 5.0+

安装

Cocoapods

pod 'SBCodableWrappers', '~> 1.0'

Swift Package Manager

https://github.com/spirit-jsb/SBCodableWrappers.git

作者

spirit-jsb, [email protected]

许可文件

SBCodableWrappers 可在 MIT 许可下使用,更多详情请参阅许可文件