У меня есть определение класса с [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")}
}
u может попробовать
aCoder.кодирование (<#T# # realv: Float##Float#>, forKey: <#T# # realv: Float##Float#> < # T # # String#>)
и
aDecoder.decodeFloat (forKey: < #T##String#>)
потому что ecodeforkey для объекта.
Спасибо за все Ваши советы,
Я снова попытался найти и заменить все » $ » на «деньги» в моем проекте, и на этот раз это было успешным.
Поверьте, это потому, что » $ » является ключевым словом идентификатора файловой системы, поэтому, когда проект имеет доступ к файловой системе, переменная $ будет иметь проблему.
Мэтт, еще раз спасибо за совет.