如何使用 NSUserDefaults 存储自定义对象

2015-05-18 23:25:30 +08:00
 HoweGulf

我需要使用 NSUserDefaults 存储一个自定义类来保持用户的登录状态,
这个类包含一个自定义结构体与一些其他参数
结构体用来存储用户的昵称,主页 url,头像,auth 等

在 StackOverflow 找到了使用 NSCoding 打包存储自定义对象的方法:

http://stackoverflow.com/questions/26469457/saving-custom-swift-class-with-nscoding-to-userdefaults

可是照着写出来之后在这里出现编译错误:

func encodeWithCoder(aCoder: NSCoder) {
    if let userData = self.userData {
        aCoder.encodeObject(userData, forKey: "userData")
    }
}

Cannot invoke 'encodeObject' with an argument list of type '(User, forKey: String)'

原因是这条声明

public var userData = User?()

其中 User 的定义如下:

public struct User {
    public var id = 0
    public var url = ""
    public var userName = ""
    public var nickName = ""
    ……
}

encodeWithCoder 函数应该怎么写才可以除掉编译错误呢?谢谢~

P.S.
现在使用 keyChain 保存了用户的密码,但是必须发起认证才能得到用户数据,头一次写程序,没什么经验,想知道大家都用哪些保持登录状态的方法呢?

3116 次点击
所在节点    iDev
9 条回复
Sunnyyoung
2015-05-18 23:57:28 +08:00
用SQLite ORM写入不好么?现在还用plist来存登录状态??

保持登录状态的话可以Cookie+SQLite

另外写到NSUserDefault的话,必须是NSDictionary的吧?先把一个对象的所有property&value转成Dictionary再存NSUserDefault好咯~
hdbean
2015-05-19 00:45:23 +08:00
归解档储存方便一些
mudkip
2015-05-19 00:55:42 +08:00
大概因为 User 是一个 struct,不是 AnyObject,所以不能使用 encodeObject
LINAICAI
2015-05-19 01:27:23 +08:00
。。。
如果不太讲究的话,就写一个customClass,继承于NSObject,再写一个Load和一个Save方法,分别从NSUserDefaults读写数据。
canautumn
2015-05-19 01:38:18 +08:00
3楼正解。应该用NSValue把struct包装一下,再用encodeObject。
xuan_lengyue
2015-05-19 08:26:40 +08:00
实现 NSCoding 协议即可
nellace
2015-05-19 08:52:33 +08:00
现在swift开发方便快捷吗?
wayne1043
2015-05-19 09:11:39 +08:00
为什么不用对象,要用结构体,这样更麻烦了。你要先包装成对象,在进行归档。
HoweGulf
2015-05-19 10:17:31 +08:00
@wayne1043 User 结构体中也包含其他结构体,用于存储其他的信息,问题仍然存在

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/192052

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX