基本方法 UserDefaults可以保存简单的数据结构
使用UserDefaults.standard获取UserDefaults对象
保存数据方法
1 2 func set (_ value : Any ? , forKey defaultName : String )
获取数据方法
1 2 3 4 5 6 UserDefaults .standard.dictionary(forKey: name)UserDefaults .standard.array(forKey: arrayName)UserDefaults .standard.object(forKey: key)
删除数据
1 2 3 4 // 删除某个键 UserDefaults.standard.removeObject(forKey: key) // 删除所有 UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
保存自定义类 UserDefaults可以对内置基本类型有很好的支持,但我们有时需要保存自定义的数据结构。自定义的类型不能直接保存至UserDefaults,我们需要将其转化为Data。
这里,我们使用NSKeyedArchiver和NSKeyedUnarchiver对数据进行转化。因此,自定义的类需要满足以下条件:
作为一个例子,我们保存以下这个自定义的类至UserDefaults
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Storage : NSObject , NSCoding { var id: String init (id : String ) { self .id = id } func encode (with aCoder : NSCoder ) { aCoder.encode(id, forKey: "id" ) } required init? (coder aDecoder : NSCoder ) { id = aDecoder.decodeObject(forKey: "id" ) as! String } }
保存和读取时:
1 2 3 4 5 6 7 8 9 10 return UserDefaults .standard.set(NSKeyedArchiver .archivedData(withRootObject: storageObject), forKey: key)let data = UserDefaults .standard.object(forKey: key)if let data = data { return NSKeyedUnarchiver .unarchiveObject(with: data as! Data ) as! Storage } else { return nil }
进阶需求 可以对数组元素进行增删 可以对字典Key-Value进行增删 思路:类似于指针
在数组和字典的值保存为String 这个String作为Key,使用UserDefaults.standard.object获取具体的值,这样对数据的修改也不会对数组和字典进行修改。
2018-09-06