使NSDecimalNumber可编码

时间:2017-09-19 07:44:00

标签: swift swift4

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

2 个答案:

答案 0 :(得分:11)

无法将NSDecimalNumber扩展为符合Encodable& Decodable协议。 Jordan Rose在以下swift evolution email thread中解释了它。

如果您需要NSDecimalValue输入API,则可以在Decimal附近构建计算属性。

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

顺便说一下。如果您使用NSNumberFormatter进行解析,请注意在某些情况下会导致精度损失的known bug

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)

以这种方式解析字符串:

NSDecimalNumber(string: "8.3", locale: Locale(identifier: "en_US_POSIX"))

答案 1 :(得分:1)

在swift中你应该使用Decimal类型。此类型从框中确认协议Encodable & Decodable

如果您在代码中输入NSDecimalNumber,则很容易将其投放到Decimal

let objcDecimal = NSDecimalNumber(decimal: 10)
let swiftDecimal = (objcDecimal as Decimal)