2016-12-29 5 views
0

Я определяю класс со свойствами [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")} 

} 
+0

Что делать, если вы перестали использовать '$' в качестве имени переменной? И, в частности, ключ кодирования/декодирования? – matt

+0

Другими словами, если у вас есть 'static let money =" $ "' что, если вы ставите 'static let money =" money "'? Это помогает? – matt

+0

Другая идея: вы могли бы попытаться определить '$' как Double вместо Float? – matt

ответ

0

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

0

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

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

enter image description here

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

Смежные вопросы