V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
HoweGulf
V2EX  ›  iDev

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

  •  
  •   HoweGulf · 2015-05-18 23:25:30 +08:00 · 3247 次点击
    这是一个创建于 3478 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我需要使用 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 保存了用户的密码,但是必须发起认证才能得到用户数据,头一次写程序,没什么经验,想知道大家都用哪些保持登录状态的方法呢?

    9 条回复    2015-05-19 10:17:31 +08:00
    Sunnyyoung
        1
    Sunnyyoung  
       2015-05-18 23:57:28 +08:00
    用SQLite ORM写入不好么?现在还用plist来存登录状态??

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

    另外写到NSUserDefault的话,必须是NSDictionary的吧?先把一个对象的所有property&value转成Dictionary再存NSUserDefault好咯~
    hdbean
        2
    hdbean  
       2015-05-19 00:45:23 +08:00
    归解档储存方便一些
    mudkip
        3
    mudkip  
       2015-05-19 00:55:42 +08:00
    大概因为 User 是一个 struct,不是 AnyObject,所以不能使用 encodeObject
    LINAICAI
        4
    LINAICAI  
       2015-05-19 01:27:23 +08:00
    。。。
    如果不太讲究的话,就写一个customClass,继承于NSObject,再写一个Load和一个Save方法,分别从NSUserDefaults读写数据。
    canautumn
        5
    canautumn  
       2015-05-19 01:38:18 +08:00
    3楼正解。应该用NSValue把struct包装一下,再用encodeObject。
    xuan_lengyue
        6
    xuan_lengyue  
       2015-05-19 08:26:40 +08:00
    实现 NSCoding 协议即可
    nellace
        7
    nellace  
       2015-05-19 08:52:33 +08:00
    现在swift开发方便快捷吗?
    wayne1043
        8
    wayne1043  
       2015-05-19 09:11:39 +08:00
    为什么不用对象,要用结构体,这样更麻烦了。你要先包装成对象,在进行归档。
    HoweGulf
        9
    HoweGulf  
    OP
       2015-05-19 10:17:31 +08:00 via iPhone
    @wayne1043 User 结构体中也包含其他结构体,用于存储其他的信息,问题仍然存在
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:04 · PVG 12:04 · LAX 20:04 · JFK 23:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.