简体   繁体   中英

How to save struct to NSUserDefaults in Swift 2.0

I have a struct named Jar and I would like to save an array of them to NSUserDefaults. Here is the jar struct code:

struct Jar {

    let name: String
    let amount: Int

    init(name: String, amount: Int){
        self.name = name
        self.amount = amount
    }
}

I belive that I will need to convert this to an NSObject to be able to save it. (Because you can't save a struct directly to NSUserDefaults). My questions are: How do I convert an array of structs to an NSObject? and How to convert an NSObject back at an array of structs.

This solution is inspired by @Duncan C. I wrote it more familiar way as we do in case Custom Class encoding and decoding.

public struct IRDriver {

  public var name: String?
  public var amount: Int?

  public init() {

  }

  // Decode
  public init(dictionary: Dictionary<String, AnyObject>){
    name = dictionary["name"] as? String
    amount = dictionary["amount"] as? Int
  }

  // Encode
  public func encode() -> Dictionary<String, AnyObject> {

    var dictionary : Dictionary = Dictionary<String, AnyObject>()
    dictionary["name"] = name
    dictionary["amount"] = amount
    return dictionary
  }

}

For saving to user defaults you have a couple of options: Have the object conform to NSCoding, or implement methods that convert it to/from an NSDictionary, and save that.

Something like this:

func dictionaryFromJar() -> NSDictionary
{
   let dictionary: [AnyObject: AnyObject] = ["name": name, "amount": amount]
   return dictionary
}

I think the automatic bridging between Swift dictionaries and NSDictionary would work here, but I'm not positive. My swift is getting a little rusty. :(

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM