Skip to content

Commit

Permalink
Added example from @elmkretzer demonstrating Structs to README.md
Browse files Browse the repository at this point in the history
Also added to Tests
  • Loading branch information
madhavajay committed Apr 28, 2016
1 parent 2fa5350 commit 4625d5a
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 0 deletions.
49 changes: 49 additions & 0 deletions PalauTests/PalauTests.swift
Expand Up @@ -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)
}
}
}

// -------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -462,6 +473,11 @@ extension PalauDefaults {
get { return value("testEnumValueWithDidSet") }
set { }
}

public static var structWithTuple: PalauDefaultsEntry<Structy> {
get { return value("structy") }
set { }
}
}

public enum TestEnum: Int {
Expand All @@ -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
}
33 changes: 33 additions & 0 deletions README.md
Expand Up @@ -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<Structy> {
get { return value("structy") }
set { }
}
}
```

## Limitations for Swift 2.2
We are waiting for extensions on Generic types.... yay!

Expand Down

0 comments on commit 4625d5a

Please sign in to comment.