Swift 将字典保存为默认值

Swift 将字典保存为默认值,swift,xcode6,Swift,Xcode6,对上述代码的解释: My tableView应用程序从[String:[Element]](Element是自定义类)类型的字典接收数据,该字典是从UserDefault加载的。在第二个viewController中,您可以填写一些文本字段,最后按UIBarButtonItem。从textFields的数据中创建了类“Element”的一个新实例,并将其添加到“theDict”中“newElement”属性之一的键处。当我使用控制台输出进行检查时,所有这些都可以正常工作,但我最终无法将编辑过的字

对上述代码的解释:

My tableView应用程序从[String:[Element]](Element是自定义类)类型的字典接收数据,该字典是从UserDefault加载的。在第二个viewController中,您可以填写一些文本字段,最后按UIBarButtonItem。从textFields的数据中创建了类“Element”的一个新实例,并将其添加到“theDict”中“newElement”属性之一的键处。当我使用控制台输出进行检查时,所有这些都可以正常工作,但我最终无法将编辑过的字典保存到userDefaults中。没有语法错误,但当我使用应用程序并尝试通过第二个viewController向字典添加另一个元素时,会显示以下错误:

错误消息:

NSForwarding:警告:类“\u TtC12myApp7Element”的对象0xdcb002c未实现methodSignatureForSelector:--前面有问题

研究没有帮助我理解错误信息

编辑

class AddElementVC: UIViewController {

    // textfields and some other functions are defined here 

    @IBAction func addElement(sender: UIBarButtonItem) {

        let newElement = Element(/* properties are defined here */)
        var theDict = NSUserDefaults.standardUserDefaults().dictionaryForKey(tableViewData) as [String: [Element]]

        if var theArray = theDict[newElement.someProperty] {
            theArray += newElement
            theDict[newElement.someProperty] = elementArray
        } else{
            theDict[newElement.someProperty] = [newElement]
        }

        NSUserDefaults.standardUserDefaults().setObject(theDict, forKey: tableViewData)

    }
}
从:

值参数只能是属性列表对象:NSData, NSString、NSNumber、NSDate、NSArray或NSDictionary。对于NSArray和 NSDictionary对象,其内容必须是属性列表对象。 再见

不能在字典中存储元素为
Element
的字典

一个选项是确保
元素
实现,然后使用将词典转换为NSData:

import Foundation

class Element: NSCoding {

enum State: String {
    case state1 = "state1"
    case state2 = "state2"
}

let state: State
// some more properties

init(state: String /* something more */ ){
    self.state = State.fromRaw(state)!
    // something more
}

init(coder aDecoder: NSCoder!) {
    self.state = aDecoder.decodeObjectForKey("state") // displays error: 'AnyObject' is not convertible to 'Element.State'
    // something more
}

func encodeWithCoder(aCoder: NSCoder!) {
    aCoder.encodeObject(self.state, forKey: "state") // displays error: Extra Argument 'forKey' in call
    // something more
}

}
您的协议实现如下所示:

// Storing the dictionary
var data = NSKeyedArchiver.archivedDataWithRootObject(theDict)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: tableViewData)

// Retrieving the dictionary
var outData = NSUserDefaults.standardUserDefaults().dataForKey(tableViewData)
var dict = NSKeyedUnarchiver.unarchiveObjectWithData(outData)

您不能存储枚举,但可以存储它的原始表示形式,即字符串。

非常感谢。但由于我对iOS开发人员还很陌生,我似乎无法正确地实现这个协议。请你看一下我在上述问题上的尝试,please@NickPodratz您在实现协议时遇到了什么错误/问题?state=state.fromRaw(aDecoder.decodeObjectForKey(“state”)作为字符串)!这样就行了。但初始错误消息仍然存在,应用程序崩溃。您必须与
@objc
桥接,请参阅备注:枚举的原始表示形式并不总是字符串。
init(coder aDecoder: NSCoder!) {
    self.state = State.fromRaw(aDecoder.decodeObjectForKey("state") as String)
}

func encodeWithCoder(aCoder: NSCoder!) {
    aCoder.encodeObject(self.state.toRaw(), forKey: "state")
}