我需要使用 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 保存了用户的密码,但是必须发起认证才能得到用户数据,头一次写程序,没什么经验,想知道大家都用哪些保持登录状态的方法呢?
![]() | 1 Sunnyyoung 2015-05-18 23:57:28 +08:00 用SQLite ORM写入不好么?现在还用plist来存登录状态?? 保持登录状态的话可以Cookie+SQLite 另外写到NSUserDefault的话,必须是NSDictionary的吧?先把一个对象的所有property&value转成Dictionary再存NSUserDefault好咯~ |
![]() | 2 hdbean 2015-05-19 00:45:23 +08:00 归解档储存方便一些 |
![]() | 3 mudkip 2015-05-19 00:55:42 +08:00 大概因为 User 是一个 struct,不是 AnyObject,所以不能使用 encodeObject |
![]() | 4 LINAICAI 2015-05-19 01:27:23 +08:00 。。。 如果不太讲究的话,就写一个customClass,继承于NSObject,再写一个Load和一个Save方法,分别从NSUserDefaults读写数据。 |
![]() | 5 canautumn 2015-05-19 01:38:18 +08:00 3楼正解。应该用NSValue把struct包装一下,再用encodeObject。 |
![]() | 6 xuan_lengyue 2015-05-19 08:26:40 +08:00 实现 NSCoding 协议即可 |
![]() | 7 nellace 2015-05-19 08:52:33 +08:00 现在swift开发方便快捷吗? |
8 wayne1043 2015-05-19 09:11:39 +08:00 为什么不用对象,要用结构体,这样更麻烦了。你要先包装成对象,在进行归档。 |