在Xcode 8和iOS 10中使用NSUserDefaults

JAL*_*JAL 30 ios swift swift3 ios10 xcode8

NSUserDefaults 不再是iOS 10 SDK中的类:

let defaults = NSUserDefaults.standardUserDefaults()
Run Code Online (Sandbox Code Playgroud)

这无法编译.这个班级被删除了吗?

(这是一个规范的问答对,以防止重复的问题泛滥)

JAL*_*JAL 47

NSUserDefaults已重命名为UserDefaults. standardUserDefaults()已重命名为standard().

let defaults = UserDefaults.standard
Run Code Online (Sandbox Code Playgroud)

这现在有效.

预发布文档链接.

  • 看起来我将有一些乐趣重写一些过去的代码. (6认同)

Shr*_*wan 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)
Run Code Online (Sandbox Code Playgroud)

  • 无需在UserDefaults之前编写`Foundation` (5认同)

ric*_*ter 16

@ JAL的答案是正确的,但也许太具体了.

许多 API在Swift 3中被重命名.大多数Foundation类型(NSUserDefaults其中)都丢失了它们的NS前缀并重命名了它们的方法以反映Swift 3 API准则.基金会还"取代"*一帮其基本数据类型的类(NSURL,NSIndexPath,NSDate等)与雨燕本地值类型(URL,IndexPath,Date等).重命名方法也适用于您在应用中使用的任何其他Cocoa/Cocoa Touch API.

逐行处理这些问题是一种疯狂的可靠方法.将项目移动到Swift 3时,首先要做的是从菜单栏中选择" 编辑">"转换">"转换为当前Swift语法 ".这将同时应用所有更改,包括一行代码受多个更改影响的情况(因此单独解决它们可能无法让您达到您认为的目的).

*我在引号中加上"替换",因为相应的NS类仍然适用于您可能需要它们的情况,但任何使用它们的API都会引用新的值类型:例如,tableView(_:cellForRowAt:)现在需要一个IndexPath,而不是一个NSIndexPath.