Я определяю класс со свойствами [String] и Float, он отлично работает с процессом кодирования с помощью NSCoder, но он всегда терпит неудачу с расшифровкой. Я добавлю защитник, помещенный в код, и обнаружил, что это проблема Float $.NSCoder не может декодировать Float
Я понятия не имею, что не так с Float, я видел некоторые вопросы Fail to decode Int with NSCoder in 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")}
}
Что делать, если вы перестали использовать '$' в качестве имени переменной? И, в частности, ключ кодирования/декодирования? – matt
Другими словами, если у вас есть 'static let money =" $ "' что, если вы ставите 'static let money =" money "'? Это помогает? – matt
Другая идея: вы могли бы попытаться определить '$' как Double вместо Float? – matt