Nscoder не удается декодировать Float

У меня есть определение класса с [String] и свойствами Float, он прекрасно работает с процессом кодирования с NSCoder, но он всегда терпит неудачу с декодированием.
У меня есть добавить охранник, впущенный в код, и расположенный это проблема Float $.

Я понятия не имею, что случилось с Float, я видел, что некоторые вопросы не удалось декодировать Int с NSCoder в Swift на веб-сайте сказал, что это связано с дополнительными свойствами, однако это не является необязательной переменной в моем случае.

Любой совет ценится.

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")}

}

2 ответа

  1. u может попробовать
    aCoder.кодирование (<#T# # realv: Float##Float#>, forKey: <#T# # realv: Float##Float#> < # T # # String#>)
    и
    aDecoder.decodeFloat (forKey: < #T##String#>)
    потому что ecodeforkey для объекта.

  2. Спасибо за все Ваши советы,
    Я снова попытался найти и заменить все » $ » на «деньги» в моем проекте, и на этот раз это было успешным.

    Поверьте, это потому, что » $ » является ключевым словом идентификатора файловой системы, поэтому, когда проект имеет доступ к файловой системе, переменная $ будет иметь проблему.

    Введите описание изображения здесь

    Мэтт, еще раз спасибо за совет.