Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中存储/恢复全局字符串数组时出现问题_Ios_Arrays_String_Swift - Fatal编程技术网

Ios 在swift中存储/恢复全局字符串数组时出现问题

Ios 在swift中存储/恢复全局字符串数组时出现问题,ios,arrays,string,swift,Ios,Arrays,String,Swift,我正在学习一门学习swift的课程。作为特定项目方法的一部分,我创建了一个名为“tasks”的全局字符串数组 我已经满足了该项目的要求,但现在我想做的是使该阵列在应用程序打开/关闭之间保持永久性。到目前为止,本课程中描述的方法是 override func viewDidLoad() { NSUserDefaults.standardUserDefaults().setObject(tasks, forKey: "array") } 这将保存阵列。当我尝试调用数组时,问题就出现了 我在

我正在学习一门学习swift的课程。作为特定项目方法的一部分,我创建了一个名为“tasks”的全局字符串数组

我已经满足了该项目的要求,但现在我想做的是使该阵列在应用程序打开/关闭之间保持永久性。到目前为止,本课程中描述的方法是

override func viewDidLoad() {
    NSUserDefaults.standardUserDefaults().setObject(tasks, forKey: "array")
}
这将保存阵列。当我尝试调用数组时,问题就出现了

我在viewDidLoad()中尝试了这两种方法:

第一个错误是“NSArray不能转换为“[String]”;您的意思是使用“as!”强制向下转换吗

第二个错误是“无法将'Element'(又名'AnyObject')类型的值转换为预期的参数类型'Int'

有人能给我一些指导吗?我还是一个相对的新手(只学了大约2周的课程),而且很多文档对我来说太密集了,我还不明白。

改变第一个

// tasks = NSUserDefaults.standardUserDefaults().objectForKey("array")! as! NSArray
tasks = defaults.objectForKey("array") as? [String] ?? [String]()

Ref:

由于数据封装,声明包含可变(集合)类型的全局变量不是好的编程习惯

就在Swift中,有更好的解决方案,例如静态
struct

struct Task {

  static var tasks = [String]()

  static func register()
  {
    NSUserDefaults.standardUserDefaults().registerDefaults( ["tasks" : [String]()])
  }

  static func load()
  {
    Task.tasks = NSUserDefaults.standardUserDefaults().objectForKey("tasks") as! [String]
  }

  static func save()
  {
    NSUserDefaults.standardUserDefaults().setObject(Task.tasks, forKey:"tasks")
  }

  static func append(string : String)
  {
    Task.tasks.append(string)
  }
}

AppDelegate
中尽快调用

Task.register()
在阵列从未写入磁盘时定义默认值


方法

Task.load()
Task.save()
从磁盘读取阵列并将阵列写入磁盘


要将字符串附加到数组,请使用

Task.append("Hello")
Task.append("World")

并获取值

print(Task.tasks) // ["Hello", "World"]
在任何类之外声明的静态结构都可以从任何地方访问,并确保数据封装

您可以通过编写附加函数来扩展结构。
所有函数都需要是静态函数,并由
任务调用。(

您好,我已尝试过,但收到错误:“NSArray!”无法转换为“[String]”;你的意思是降级吗?这不再给我错误!但是,它似乎没有存储数组。我会继续处理它!也许你可以尝试我提供的链接。是的,我已经尝试过了。我会继续处理它。:-)我明白了!我在实际添加项时没有更新NSUserDefaults,而是在vie下使用了该函数wDidLoad。它现在运行得很好。谢谢!我很感激它不是一个好的风格,但是我正在遵循/尝试在课程的这一点上保持我应该拥有的知识。我当然会跟踪你的评论,这样我就知道将来如何做了。谢谢你!哈哈!这是一门广受好评的课程,但它只涵盖了基础知识。随着知识库的增长,我完全希望更好地了解正确的“swift”isms:-)我想用其他东西替换nsuserdefaults,因为数据集可以被删除和退出big@alex看看核心Data@vadiantx将在我的简单代码运行后立即执行此操作。您可以在此处查看:
Task.load()
Task.save()
Task.append("Hello")
Task.append("World")
print(Task.tasks) // ["Hello", "World"]