使NSDecimalNumber可编码

Ard*_*ner 9 swift swift4

是否可以扩展NSDecimalNumber到符合Encodable & Decodable协议?

Woj*_*zki 11

不可能扩展NSDecimalNumber以符合Encodable&Decodable协议.Jordan Rose在下面的swift evolution电子邮件主题中解释了它.

如果您需要NSDecimalValue键入API,可以构建计算属性Decimal.

struct YourType: Codable {
    var decimalNumber: NSDecimalNumber {
        get { return NSDecimalNumber(decimal: decimalValue) }
        set { decimalValue = newValue.decimalValue }
    }
    private var decimalValue: Decimal
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句.如果您正在使用NSNumberFormatter解析,请注意在某些情况下导致精度损失的已知错误.

let f = NumberFormatter()
f.generatesDecimalNumbers = true
f.locale = Locale(identifier: "en_US_POSIX")
let z = f.number(from: "8.3")!
// z.decimalValue._exponent is not -1
// z.decimalValue._mantissa is not (83, 0, 0, 0, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

以这种方式解析字符串:

NSDecimalNumber(string: "8.3", locale: Locale(identifier: "en_US_POSIX"))
Run Code Online (Sandbox Code Playgroud)