Swift NSCoder无法解码浮点

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

我定义了一个具有[String]和Float属性的类,它在使用NSCoder的编码过程中运行良好,但在解码时总是失败。 我已经将guard let添加到代码中,并发现这是Float$的问题

我不知道浮动有什么问题,我确实在网上看到一些问题,说它与可选属性有关,但在我的例子中它不是可选变量

任何建议都将不胜感激

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:)