【问题标题】:How do I decode a Double using NSCoder, NSObject and Swift 3 for iOS如何使用适用于 iOS 的 NSCoder、NSObject 和 Swift 3 解码 Double
【发布时间】:2016-10-06 08:28:55
【问题描述】:

我正在尝试使用 Swift 从 Xcode 8.0 中的持久存储中存储和加载对象。

我遵循了 Apple 的 Start Developing iOS Apps (Swift): Jump Right In 教程,并且在星级评分的整数值方面遇到了同样的问题。

这是我的课程“费用”的“裁剪”版本,用于显示我遇到问题的“金额”变量:

class Expense: NSObject, NSCoding {
    var amount: Double

    static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
    static let ArchiveURL = DocumentsDirectory.appendingPathComponent("expenses")

    struct PropertyKey {
        static let amountKey = "amount"
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(amount, forKey:PropertyKey.amountKey)
    }

    required convenience init?(coder aDecoder: NSCoder) {
        let amount = aDecoder.decodeObject(forKey: PropertyKey.amountKey) as! Double        

        self.init(date: date, amount: amount, description: description, image: image)
    }
}

当我运行模拟器并尝试加载“数量”时,我得到以下异常:“致命错误:在展开可选值时意外发现 nil”。我对 Swift 和 xCode 很陌生,我真的不知道如何解决这个问题。

【问题讨论】:

  • 让 amount = aDecoder.decodeDouble(forKey:PropertyKey.amountKey) as Double?为了安全起见,请确保将“金额”设为可选(添加为 Double?)Swift 3
  • required convenience init?(coder aDecoder: NSCoder) { 方法在哪里结束?
  • @Ahmad 谢谢你,那行得通。您能否发表您的评论作为答案,以便我“接受”它:)
  • @FrederikNorlykEriksen 很高兴为您提供帮助 :) 根据您的要求,我将其发布为答案

标签: ios swift swift3 xcode8 nscoding


【解决方案1】:
required convenience init?(coder aDecoder: NSCoder) {
    // for safety, make sure to let "amount" as optional (adding as Double?)
    let amount = aDecoder.decodeDouble(forKey:PropertyKey.amountKey) as Double?

    self.init(date: date, amount: amount, description: description, image: image)
}

【讨论】:

  • 不用说as Double?——只要让amount是非可选的,只要它需要传递给可选参数就可以提升它。说as Double? 不会增加任何安全性。
【解决方案2】:

尝试将属性加载为可选:

let amount = aDecoder.decodeObject(forKey: PropertyKey.amountKey) as Double?

另外,为了从存储中获取属性,您必须先保存它。如果还没有保存,请处理nil的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多