Преобразование Firebase .value в NSDecimal - Swift - PullRequest
1 голос
/ 03 апреля 2019

Я новый разработчик Swift. Я использую Swift 4.2 и Xcode 10.1.

Мне нужно извлечь из базы данных число, которое представляет доллары и центы (например, 10.20), и добавить к этому числу, разделить это число и т. Д. Результат должен всегда иметь два числа после десятичной дроби.

Я пытаюсь использовать NSDecimalNumber, но получаю ошибки при конвертации.

Вот мой код. addend имеет тип NSDecimalNumber.

dbRef.observeSingleEvent(of: .value) { (snapshot) in

    // Get the balance
    let NSbalance = snapshot.value as! NSDecimalNumber
    // Add the addend
    let balance = NSbalance + addend
    // Set the new balance in the database and in the user defaults
            dbRef.setValue(balance)
            defaults.set(balance, forKey: Constants.LocalStorage.storedBalance)
}

Я получаю ошибку Cannot convert value of type 'NSDecimalNumber' to expected argument type 'Self'. Когда я принимаю его предложение и делаю следующее изменение: Replace 'NSbalance' with 'Self(rawValue: Self.RawValue(NSbalance)) я получаю «использование неразрешенного идентификатора Self».

Должен ли я использовать NSDecimalNumber для этой цели? Если нет, что мне делать?

1 Ответ

0 голосов
/ 04 апреля 2019

Решением является использование Double для типа..value из базы данных Firebase Realtime имеют тип NSNumber, если значение является числом (а не строкой), поэтому я могу легко преобразовать в Double.Хотя Double не обладает точностью Decimal для расчетов по основанию 10, это более чем точно для значений валюты низкого уровня, которые я использую, у которых всегда есть только два числа после десятичной дроби.Затем я использую средство форматирования чисел для форматирования в качестве валюты и исключаю лишние цифры после десятичной.Код, который работает ниже:

Этот код находится в службе, которая добавляет сумму для увеличения баланса:

dbRef.observeSingleEvent(of: .value) { (snapshot) in

// Get the snapshot value
    let NSbalance = snapshot.value as! Double

    // Add the addend
    let balance = NSbalance + addend

    // Set the new balance in the database and in the user defaults
    dbRef.setValue(balance)
    defaults.set(balance, forKey: Constants.LocalStorage.storedBalance)

Этот код находится в контроллере представления, который показывает баланс:

 dbRef.observe(.value) { (snapshot) in
     //Get the balance
     self.balance = snapshot.value as! Double
     // Format the balance
     let currencyFormatter = NumberFormatter()
     currencyFormatter.numberStyle = .currency
     let balanceString = currencyFormatter.string(from: self.balance as NSNumber)
            self.balanceLabel.setTitle(balanceString, for: .normal)
 }
...