CocoaPods trunk is moving to be read-only. Read more on the blog, there are 14 months to go.
| TestsTested | ✓ | 
| LangLanguage | SwiftSwift | 
| License | MIT | 
| ReleasedLast Release | Sep 2016 | 
| SPMSupports SPM | ✗ | 
Maintained by Nick O'Neill.
Installation • Issues • License
Pantry is a lightweight way to persist structs containing user data, cached content or other relevant objects for later retrieval.
let someCustomStruct = SomeCustomStruct(...)
Pantry.pack(someCustomStruct, "user_data")
... later ...
if let unpackedCustomStruct: SomeCustomStruct = Pantry.unpack("user_data") {
  print("got my data out",unpackedCustomStruct)
} else {
  print("there was no struct data to get")
}You can store:
Check out the tests for a detailed look at the varied types you can easily store.
Pantry requires iOS 8+ and is compatible with Swift 3 projects. Please use release 0.2.2 for the final Swift 2.x supported version, or the swift2 branch. Objective-C support is unlikely.
Installation for Carthage is simple enough:
github "nickoneill/Pantry" ~> 0.3
As for CocoaPods, use this to get the latest release:
use_frameworks!
pod 'Pantry'And import Pantry in the files you’d like to use it.
Pantry provides serialization of some basic types (String, Int, Float, Bool) with no setup. You can use it as a simple expiring cache like this:
if let available: Bool = Pantry.unpack("promptAvailable") {
    completion(available: available)
} else {
    anExpensiveOperationToDetermineAvailability({ (available) -> () in
      Pantry.pack(available, key: "promptAvailable", expires: .Seconds(60 * 10))
      completion(available: available)
    })
}Use Swift’s get/set to automatically persist the value of a variable on write and get the latest value on read.
var autopersist: String? {
    set {
        if let newValue = newValue {
            Pantry.pack(newValue, key: "autopersist")
        }
    }
    get {
        return Pantry.unpack("autopersist")
    }
}
...later...
autopersist = "Hello!"
// restart app, reboot phone, etc
print(autopersist) // Hello!Add the Storable protocol to any struct you want stored and then ensure they comply by implementing an init method that gets each property from the warehouse, and a toDictionary method that converts the other way:
struct Basic: Storable {
    let name: String
    let age: Float
    let number: Int
    init(warehouse: Warehouseable) {
        self.name = warehouse.get("name") ?? "default"
        self.age = warehouse.get("age") ?? 20.5
        self.number = warehouse.get("number") ?? 10
    }
    func toDictionary() -> [String : AnyObject] {
        return [ "name": self.name, "age": self.age, "number": self.number ]
    }
}Getters always provide an optional value, leaving you the opportunity to fill in a default if a value isn’t available. This makes for hassle-free property additions to your structs.
Classes are also supported and can be setup the same way Structs are however the init method must be marked required in this case. Class inheritance and nested Storable properties are also possible:
class ModelBase: Storable {
    let id: String
    required init(warehouse: Warehouseable) {
        self.id = warehouse.get("id") ?? "default_id"
    }
    func toDictionary() -> [String : AnyObject] {
        return [ "id": self.id ]
    }
}
class BasicClassModel: ModelBase {
    let name: String
    let age: Float
    let number: Int
    required init(warehouse: Warehouseable) {
        self.name = warehouse.get("name") ?? "default"
        self.age = warehouse.get("age") ?? 20.5
        self.number = warehouse.get("number") ?? 10
        super.init(warehouse: warehouse)
    }
    func toDictionary() -> [String : AnyObject] {
        var dictionary = super.toDictionary()
        dictionary["name"] = self.name
        dictionary["age"] = self.age
        dictionary["number"] = self.number
        return dictionary
    }
}Pantry works great with network data when paired with a JSON struct decoder such as Unbox. Download JSON, decode it with Unbox, save it with Pantry and have it available for as long as you need. The architecture of Pantry is heavily influenced by Unbox, it’s worth a look in any case.
Pantry uses the MIT license. Please file an issue if you have any questions or if you’d like to share how you’re using this tool.
Pantry “can icon” by CDH from the Noun Project