2017-09-19 12 views
2

是否有可能延長NSDecimalNumber符合Encodable & Decodable協議?製作NSDecimalNumber可編碼

+0

你嘗試過這麼遠嗎?你有什麼要求?你想要編碼/解碼什麼? –

+0

@LorenzoB我檢查Apple的文檔https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types編碼和解碼的自定義類型。我試圖解析來自服務器的響應,如果我使用Double,我會失去精度。 –

回答

1

在急速的,你應該使用Decimal型。該類型從框中確認爲協議Encodable & Decodable

如果你在你的代碼NSDecimalNumber類型可以很容易地將它轉換爲Decimal

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

這是不可能延長NSDecimalNumber符合Encodable & Decodable協議。喬丹羅斯在下面的swift evolution email thread中解釋它。

如果你需要你的API中NSDecimalValue類型,你可以圍繞Decimal建立計算性能。

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

Btw。如果你正在使用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"))