Skip to content

Commit 4727671

Browse files
authored
Merge pull request #9 from rizwankce/add-userDefaults
Create a new storage type called userDefaults
2 parents f7379f9 + ab840e4 commit 4727671

File tree

4 files changed

+80
-41
lines changed

4 files changed

+80
-41
lines changed

Storage/Classes/Storage.swift

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
//
2-
// Storage.swift
3-
// Storage
4-
//
5-
// Created by Rizwan on 02/11/17.
6-
// Copyright © 2017 Rizwan. All rights reserved.
7-
//
8-
91
import Foundation
102

113
public final class Storage<T> where T: Codable {
@@ -21,23 +13,42 @@ public final class Storage<T> where T: Codable {
2113
public func save(_ object: T) {
2214
do {
2315
let data = try JSONEncoder().encode(object)
24-
try data.write(to: fileURL)
16+
switch type {
17+
case .cache, .document:
18+
try data.write(to: fileURL)
19+
case .userDefaults:
20+
UserDefaults.standard.set(data, forKey: type.userDefaultsKey)
21+
}
2522
} catch let e {
2623
print("ERROR: \(e)")
2724
}
2825
}
2926

3027
public var storedValue: T? {
31-
guard FileManager.default.fileExists(atPath: fileURL.path) else {
32-
return nil
33-
}
34-
do {
35-
let data = try Data(contentsOf: fileURL)
36-
let jsonDecoder = JSONDecoder()
37-
return try jsonDecoder.decode(T.self, from: data)
38-
} catch let e {
39-
print("ERROR: \(e)")
40-
return nil
28+
switch type {
29+
case .cache, .document:
30+
guard FileManager.default.fileExists(atPath: fileURL.path) else {
31+
return nil
32+
}
33+
do {
34+
let data = try Data(contentsOf: fileURL)
35+
let jsonDecoder = JSONDecoder()
36+
return try jsonDecoder.decode(T.self, from: data)
37+
} catch let e {
38+
print("ERROR: \(e)")
39+
return nil
40+
}
41+
case .userDefaults:
42+
guard let data = UserDefaults.standard.data(forKey: type.userDefaultsKey) else {
43+
return nil
44+
}
45+
do {
46+
let jsonDecoder = JSONDecoder()
47+
return try jsonDecoder.decode(T.self, from: data)
48+
} catch let e {
49+
print("ERROR: \(e)")
50+
return nil
51+
}
4152
}
4253
}
4354

@@ -62,7 +73,12 @@ public final class Storage<T> where T: Codable {
6273
try? fileManager.createDirectory(at: folder, withIntermediateDirectories: false, attributes: nil)
6374
}
6475

65-
private func clearStorage() {
66-
try? FileManager.default.removeItem(at: type.folder)
76+
public func clear() {
77+
switch type {
78+
case .cache, .document:
79+
try? FileManager.default.removeItem(at: type.folder)
80+
case .userDefaults:
81+
UserDefaults.standard.removeObject(forKey: type.userDefaultsKey)
82+
}
6783
}
6884
}

Storage/Classes/StorageType.swift

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
1-
//
2-
// StorageType.swift
3-
// Storage
4-
//
5-
// Created by Rizwan on 02/11/17.
6-
// Copyright © 2017 Rizwan. All rights reserved.
7-
//
8-
91
import Foundation
102

113
public enum StorageType {
124
case cache
135
case document
6+
case userDefaults
147

158
public var searchPathDirectory: FileManager.SearchPathDirectory {
169
switch self {
17-
case .cache: return .cachesDirectory
18-
case .document: return .documentDirectory
10+
case .cache: return .cachesDirectory
11+
case .document: return .documentDirectory
12+
case .userDefaults: return .cachesDirectory
1913
}
2014
}
2115

2216
public var folder: URL {
17+
2318
guard let path = NSSearchPathForDirectoriesInDomains(searchPathDirectory, .userDomainMask, true).first else {
2419
fatalError("Cannot find the path directory for storage")
2520
}
2621
let subfolder = "com.rizwankce.storage"
2722
return URL(fileURLWithPath: path).appendingPathComponent(subfolder)
28-
}
23+
}
24+
25+
public var userDefaultsKey: String {
26+
return "com.rizwankce.storage.\(self)"
27+
}
2928
}

Tests/StorageTests.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class StorageTests: XCTestCase {
1111

1212
let retrievedData = storage.storedValue
1313
XCTAssertEqual(retrievedData, testData, "Stored and retrieved data should be equal")
14+
storage.clear()
1415
}
1516

1617
func testRetrieveNonExistentFile() {
@@ -29,5 +30,37 @@ class StorageTests: XCTestCase {
2930

3031
let retrievedData = storage.storedValue
3132
XCTAssertEqual(retrievedData, newData, "Stored and retrieved data should be equal after overwrite")
33+
storage.clear()
34+
}
35+
36+
func testSaveAndRetrieveUserDefaults() {
37+
let storage = Storage<[String]>(storageType: .userDefaults, filename: "testUserDefaults")
38+
39+
let testData = ["item1", "item2", "item3"]
40+
storage.save(testData)
41+
42+
let retrievedData = storage.storedValue
43+
XCTAssertEqual(retrievedData, testData, "Stored and retrieved data should be equal for user defaults")
44+
storage.clear()
45+
}
46+
47+
func testRetrieveNonExistentUserDefaults() {
48+
let storage = Storage<[String]>(storageType: .userDefaults, filename: "nonexistentUserDefaults")
49+
let retrievedData = storage.storedValue
50+
XCTAssertNil(retrievedData, "Retrieving non-existent data from user defaults should return nil")
51+
storage.clear()
52+
}
53+
54+
func testOverwriteUserDefaultsData() {
55+
let storage = Storage<[String]>(storageType: .userDefaults, filename: "testUserDefaults")
56+
let initialData = ["item1", "item2"]
57+
storage.save(initialData)
58+
59+
let newData = ["item3", "item4"]
60+
storage.save(newData)
61+
62+
let retrievedData = storage.storedValue
63+
XCTAssertEqual(retrievedData, newData, "Stored and retrieved data should be equal after overwrite in user defaults")
64+
storage.clear()
3265
}
3366
}

Tests/StorageTypeTests.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,4 @@ class StorageTypeTests: XCTestCase {
1313
let folder = storageType.folder
1414
XCTAssertTrue(folder.path.contains("Documents"), "Document directory path should contain 'Documents'")
1515
}
16-
17-
func testFolderCreation() {
18-
let storageType = StorageType.document
19-
let folder = storageType.folder
20-
let fileManager = FileManager.default
21-
var isDir: ObjCBool = false
22-
let exists = fileManager.fileExists(atPath: folder.path, isDirectory: &isDir)
23-
XCTAssertTrue(exists && isDir.boolValue, "Folder should be created and be a directory")
24-
}
2516
}

0 commit comments

Comments
 (0)