【问题标题】:Coding array with NSCoder Swift使用 NSCoder Swift 编码数组
【发布时间】:2015-09-11 14:20:29
【问题描述】:

我正在尝试实现 NSCoder,但目前面临一个顽固的问题。 我的目标是通过 NSCoder 将字符串数组保存到本地文件,并在应用下次打开时加载它。

这是我创建的类,但我不确定应该如何处理 init 和编码器函数:

class MyObject: NSObject, NSCoding {

var storyPoints: [String] = []

init(storyPoints : [String]) {
    self.storePoints = storePoints
}


required init(coder decoder: NSCoder) {
    super.init()

???

}

func encodeWithCoder(coder: NSCoder) {
???
}

}

此外,我如何在我的视图控制器中访问它?我应该在哪里声明保存 NSCoder 的路径?这还不够清楚。

期待任何建议。

谢谢。

【问题讨论】:

标签: ios arrays swift nscoder


【解决方案1】:

这是一个将对象保存到 /tmp 目录的实现和游乐场示例。 init(coder:) 函数会覆盖 NSObject 的,required 也是如此,并且由于它不是指定的初始化程序,因此必须将其标记为 convenience。也因为init(coder:)是一个方便的初始化器,它不能调用super.init()

要直接回答有关存档数组的问题,只需键入 cast the result from decoderObjectForKey(_:)。检查 NSCoding 文档以获取用于编码/解码的信息和 API。那里有很多。

import Cocoa

class MyObject: NSObject, NSCoding {

  var storyPoints: [String] = []

  init(storyPoints : [String]) {
    self.storyPoints = storyPoints
  }

  convenience required init(coder decoder: NSCoder) {
    let storyPoints = decoder.decodeObjectForKey("storypoints") as! [String]
    self.init(storyPoints: storyPoints)
  }

  func encodeWithCoder(coder: NSCoder) {
    coder.encodeObject(storyPoints, forKey: "storypoints")
  }
}

【讨论】:

  • 谢谢!效果很好,但每次我运行应用程序时,数组值都会重新分配,就好像没有发生任何变化一样。
  • 您能否确认您在对对象进行更改后调用了 archiveRootObject(_:toFile:) 方法?
  • 是的,我正在函数代码中执行此操作 - 就在 obj.storyPoints.append(newObject) 发生之后。但是当我重新启动时 - 数组又是空白的。
  • 有点困难,因为 - 我可以用一个函数或另一个单独附加数组。所以要从两个函数访问 MyObject 数组,我在 viewDidLoad 之前在顶部声明了它。我不明白的是 - 我必须在两个单独的函数中声明 NSKeyedArchiver 和其余代码两次?
  • 确保您使用的是 MVC 最佳实践。请务必使用 NSCoding 来初始化和保存您的模型。您的视图控制器如何访问模型很重要,但无法在 cmets 中处理。不要担心实例化 NSKeyedArchiver/Unarchiver 的成本。它是一个单例,应该根据需要使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多