是否可以将NSDecimalNumber
扩展为符合Encodable & Decodable
协议?
答案 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)