NSCoder не может декодировать Float

Я определил класс со свойствами [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 CY.L    schedule 29.12.2016    source источник
comment
Что, если вы перестанете использовать $ в качестве имени переменной? И, в частности, ключ кодирования/декодирования?   -  person matt    schedule 29.12.2016
comment
Другими словами, где у вас есть static let money = "$", что, если вы поставите static let money = "money"? Это помогает?   -  person matt    schedule 29.12.2016
comment
Еще одна идея: не могли бы вы попробовать определить $ как Double вместо Float?   -  person matt    schedule 29.12.2016
comment
Мы думали одинаково, ха-ха, я пытался положить деньги вместо долларов, но это то же самое.   -  person CY.L    schedule 29.12.2016
comment
Просто попробуйте использовать Double вместо Float, ничего не изменится.   -  person CY.L    schedule 29.12.2016
comment
Извините, это была просто идея... :(   -  person matt    schedule 29.12.2016
comment
Вот еще идея: вместо decodeObject(forKey:) as Float а что если использовать decodeFloat(forKey:)?   -  person matt    schedule 29.12.2016
comment
Дубликат stackoverflow.com/questions/38124480/?   -  person Martin R    schedule 29.12.2016
comment
Привет, Мэтт и Мартин Р. Я только что попробовал использовать decodeFloat вместо decodeObject. Ошибка больше не появляется. НО, в результате всегда декодируется 0.0, независимо от того, какой Float я закодировал (не уверен, что он закодирован), есть идеи?   -  person CY.L    schedule 29.12.2016


Ответы (2)


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

person zacks    schedule 29.12.2016

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

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

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

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

person CY.L    schedule 29.12.2016