Swift NSCoder无法解码浮点
我定义了一个具有[String]和Float属性的类,它在使用NSCoder的编码过程中运行良好,但在解码时总是失败。 我已经将guard let添加到代码中,并发现这是Float$的问题 我不知道浮动有什么问题,我确实在网上看到一些问题,说它与可选属性有关,但在我的例子中它不是可选变量 任何建议都将不胜感激Swift NSCoder无法解码浮点,swift,decode,nscoder,Swift,Decode,Nscoder,我定义了一个具有[String]和Float属性的类,它在使用NSCoder的编码过程中运行良好,但在解码时总是失败。 我已经将guard let添加到代码中,并发现这是Float$的问题 我不知道浮动有什么问题,我确实在网上看到一些问题,说它与可选属性有关,但在我的例子中它不是可选变量 任何建议都将不胜感激 import UIKit class aBill : NSObject, NSCoding { //MARK: - Properties var payer: [String] var g
import UIKit
class aBill : NSObject, NSCoding {
//MARK: - Properties
var payer: [String]
var getter: [String]
var $: Float
struct PropertyKey {
static let payer = "payer"
static let getter = "getter"
static let money = "$"
}
// MARK: - Initialization
init?(payer: [String], getter: [String], $: Float) {
// Initialize stored properties.
self.payer = payer
self.getter = getter
self.$ = $
self.currency = currency
self.remark = itemName
super.init()
}
//MARK: - NSCoding properties
func encode(with aCoder: NSCoder) {
aCoder.encode(payer, forKey: PropertyKey.payer)
aCoder.encode(getter, forKey: PropertyKey.getter)
aCoder.encode($, forKey: PropertyKey.money)
}
required convenience init?(coder aDecoder: NSCoder) {
// The name is required. If we cannot decode a name string, the initializer should fail.
guard let payer = aDecoder.decodeObject(forKey: PropertyKey.payer) as? [String]
else {
print("Unable to decode the payer name for a aBill object.")
return nil
}
guard let getter = aDecoder.decodeObject(forKey: PropertyKey.getter) as? [String]
else {
print("Unable to decode the getter name for a aBill object.")
return nil
}
guard let money = aDecoder.decodeObject(forKey: PropertyKey.money) as? Float
else {
print("Unable to decode the $ for a aBill object. ")
return nil
}
print("Start convenience init")
self.init(payer: payer, getter: getter, $: money)
print("Sucess convenience init")
}
//MARK: Archiving Paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("aBill")}
}
你可以试试
aCoder.encode(,forKey:)
和
解码浮点(forKey:)
因为Ecodeorkey是object的。谢谢你的建议, 我重新尝试在我的项目中找到所有的“$”并将其替换为“money”,这次成功了 相信这是因为“$”是文件系统标识符的关键字,所以当项目可以访问文件系统时,变量$将出现问题
马特,再次感谢您的建议。如果您停止使用
$
作为变量名,该怎么办?特别是编码/解码键?换言之,如果你有静态let money=“$”
如果你把静态let money=“money”
放进去会怎么样?这有帮助吗?另一个想法:你能试着把$
定义为双精度而不是浮点吗?我们也有同样的想法哈哈,我试着把钱放在上面而不是美元,但这是相同的。还有另一个想法:用解码浮点(forKey:)而不是解码对象(forKey:)作为浮点
如果你用解码浮点(forKey:)
?