我是Swift的新开发人员。我正在使用Swift 4.2和Xcode 10.1。
我需要从firebase中提取一个表示美元和美分的数字(例如10.20),然后将其加到该数字上,除以该数字等。结果应始终在小数点后有两个数字。
我正在尝试使用{% block content %}
{{ super() }}
New content here
{% endblock %}
,但在转换时遇到错误。
这是我的代码。 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'
我得到“使用未解析的标识符Self。”
我应该为此目的使用Replace 'NSbalance' with 'Self(rawValue: Self.RawValue(NSbalance))
吗?如果没有,我该怎么办?
答案 0 :(得分:0)
解决方案是对类型使用Double
。如果值是数字(不是字符串),则Firebase Realtime数据库中的.value
类型为NSNumber
,因此我可以轻松地将其转换为Double
。尽管Double
在以10为基数的计算中不具有Decimal
的精度,但是对于我使用的低级货币值(在小数点后始终只有两个数字),它的精度要高得多。然后,我使用数字格式化程序将其格式化为货币,并消除小数点后的多余数字。起作用的代码如下:
该代码在服务中,用于添加金额以增加余额:
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)
}