From 4625d5a6664fb6cf6891c9cf0557958b48a2d245 Mon Sep 17 00:00:00 2001 From: Madhava Jay Date: Thu, 28 Apr 2016 14:34:10 +0200 Subject: [PATCH] Added example from @elmkretzer demonstrating Structs to README.md Also added to Tests --- PalauTests/PalauTests.swift | 49 +++++++++++++++++++++++++++++++++++++ README.md | 33 +++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/PalauTests/PalauTests.swift b/PalauTests/PalauTests.swift index 5ce54ec..e7b8510 100644 --- a/PalauTests/PalauTests.swift +++ b/PalauTests/PalauTests.swift @@ -342,6 +342,17 @@ class PalauTests: XCTestCase { let enumWithDidClear = enumWithDidSet.didSet(assertIsEqual(new: nil, old: TestEnum.CaseA)) enumWithDidClear.clear() } + + func testStructyValue() { + let arrayOfStructs = [ + Structy(tuple: ("Test1", "Test2")), + Structy(tuple: ("Test3", "Test4")), + Structy(tuple: ("Test5", "Test6")) + ] + for s in arrayOfStructs { + checkValue(&PalauDefaults.structWithTuple, value: s) + } + } } // ------------------------------------------------------------------------------------------------- @@ -462,6 +473,11 @@ extension PalauDefaults { get { return value("testEnumValueWithDidSet") } set { } } + + public static var structWithTuple: PalauDefaultsEntry { + get { return value("structy") } + set { } + } } public enum TestEnum: Int { @@ -473,3 +489,36 @@ public enum TestEnum: Int { extension TestEnum: PalauDefaultable { public typealias ValueType = TestEnum } + +// ------------------------------------------------------------------------------------------------- +// MARK: - Struct Example +// ------------------------------------------------------------------------------------------------- + +// example Struct called Structy for demonstrating we can save a Struct with Palau +public struct Structy { + let tuple: (String, String) +} + +// our Structy PalauDefaultable extension allowing the mapping between PalauDefaults and the Type +// here we just map the two values to two keys named "1" and "2" +extension Structy: PalauDefaultable { + public static func get(key: String, from defaults: NSUD) -> Structy? { + guard let d = defaults.objectForKey(key) as? [String: AnyObject] , + let t1 = d["1"] as? String, + let t2 = d["2"] as? String else { return nil } + return Structy(tuple: (t1, t2)) + } + + public static func set(value: Structy?, forKey key: String, in defaults: NSUD) -> Void { + guard let value = value else { return defaults.setObject(nil, forKey: key) } + defaults.setObject(["1": value.tuple.0, "2": value.tuple.1], forKey: key) + } +} + +// make our struct equatable for our test +extension Structy: Equatable {} + +// we need a global == infix operator that supports Structy == Structy +public func == (lhs: Structy, rhs: Structy) -> Bool { + return lhs.tuple.0 == rhs.tuple.0 && lhs.tuple.1 == rhs.tuple.1 +} diff --git a/README.md b/README.md index 172cb72..41aaa0f 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,39 @@ extension UIColor: PalauDefaultable { } ``` +## Look Mum, even Structs! + +```swift +// example Struct called Structy for demonstrating we can save a Struct with Palau +public struct Structy { + let tuple: (String, String) +} + +// our Structy PalauDefaultable extension allowing the mapping between PalauDefaults and the Type +// here we just map the two values to two keys named "1" and "2" +extension Structy: PalauDefaultable { + public static func get(key: String, from defaults: NSUD) -> Structy? { + guard let d = defaults.objectForKey(key) as? [String: AnyObject] , + let t1 = d["1"] as? String, + let t2 = d["2"] as? String else { return nil } + return Structy(tuple: (t1, t2)) + } + + public static func set(value: Structy?, forKey key: String, in defaults: NSUD) -> Void { + guard let value = value else { return defaults.setObject(nil, forKey: key) } + defaults.setObject(["1": value.tuple.0, "2": value.tuple.1], forKey: key) + } +} + +// now create a property on PalauDefaults +extension PalauDefaults { + public static var structWithTuple: PalauDefaultsEntry { + get { return value("structy") } + set { } + } +} +``` + ## Limitations for Swift 2.2 We are waiting for extensions on Generic types.... yay!