Я определил класс со свойствами [String] и Float, он отлично работает с процессом кодирования с помощью NSCoder, но всегда терпит неудачу с декодированием. Я добавил охрану в код и обнаружил, что это проблема Float $.
Я понятия не имею, что не так с Float, я видел несколько вопросов Fail для декодирования 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")}
}
$
в качестве имени переменной? И, в частности, ключ кодирования/декодирования? - person matt   schedule 29.12.2016static let money = "$"
, что, если вы поставитеstatic let money = "money"
? Это помогает? - person matt   schedule 29.12.2016$
как Double вместо Float? - person matt   schedule 29.12.2016decodeObject(forKey:) as Float
а что если использоватьdecodeFloat(forKey:)
? - person matt   schedule 29.12.2016