在使用Xcode 8和iOS 10时如何使用NSUserDefaults

31

NSUserDefaults在iOS 10 SDK中似乎不再是一个类:

let defaults = NSUserDefaults.standardUserDefaults()

这个无法编译。这个类被移除了吗?

(这是一个标准问答对,以防止重复提问的洪水)


以下是使用 Swift 5 语法的最简单解释:https://www.youtube.com/watch?v=lMIx7H4u4lg - Mayur Prajapati
3个回答

46

NSUserDefaults 已经更名为 UserDefaultsstandardUserDefaults() 已经更名为 standard().

let defaults = UserDefaults.standard

现在这个功能可以正常运作。

预发布文档链接


6
看起来我要重新编写一些过去的代码,这会很有趣。 - Andy Ibanez
@JAL - 一旦我们对这些 NSUserDefaults 进行更改以符合 Swift 3 / ios10 / Xcode 8,所有当前的 NSUserDefaults 值是否会保留? - Joe
@Joe 是的,所有数据将继续存在。这只是类和函数名称的更改。 - JAL
@JAL - 哇,多谢!顺便问一下 - 当Xcode 8公开发布,并且我们都按照您上面的答案更新语法时,那些仍在使用ios8和9的用户会受到何种影响? - Joe
1
@Joe 语法的变化不应该影响用户。这只是对Swift语言的更改。在iOS 8和9上可用的任何类仍将继续可用。如果您使用Swift 3和Xcode 8构建iOS 8应用程序,则应该与使用Swift 2.3的iOS 10应用程序,使用Swift 2.2构建的iOS 9应用程序等效果相同。 - JAL

20

更精确地使用Swift-3中的UserDefaults:

       //To save the string 
       let userDefaults = UserDefaults.standard
       userDefaults.set( "String", forKey: "Key")

       //To retrieve from the key
       let userDefaults = UserDefaults.standard
       let value  = userDefaults.string(forKey: "Key")
       print(value)

5
UserDefaults前面不需要写Foundation. - Roland T.

16

@JAL的回答是正确的,但可能过于具体。

在Swift 3中,许多API都被重新命名。大多数Foundation类型(其中包括NSUserDefaults)已经失去了它们的NS前缀,并且它们的方法已更名以反映Swift 3 API准则。 Foundation还用Swift本地值类型(URL, IndexPath, Date等)替换了一些基本数据类型类(NSURLNSIndexPathNSDate等)。方法重命名也适用于您在应用程序中使用的任何其他Cocoa/Cocoa Touch API。

一步一步地解决这些问题,逐行处理,会让人发疯。当将项目移植到Swift 3时,你应该首先选择Edit > Convert > To Current Swift Syntax菜单栏中的选项。这将一次性应用所有更改,包括一个代码行受多个更改影响的情况(因此单独处理它们可能不会达到预期效果)。

*我在“替换”一词中加了引号,因为相应的NS类仍然存在于某些需要它们的情况下,但使用它们的任何API都会引用新的值类型:例如tableView(_:cellForRowAt:)现在接受一个IndexPath而不是NSIndexPath


谢谢rickster。关于iOS 10中的类重命名,这里有一个元问题链接 - JAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接