Welcome to CodableFiles, a simple library that provides an easier way to save, load or delete Codable objects in Documents directory. It’s primarily aimed to save Encodable objects as json string and loads back from string to Decodable object. It’s essentially a thin wrapper around the FileManager
APIs that Foundation
provides.
Features
- Modern, object-oriented API for accessing, reading and writing files.
- Unified, simple
do, try, catch
error handling. - Easily to find and interact with saved files.
- Unit test coverage over 95%.
Examples
Codable object
struct User: Codable {
let name: String
let lastName: String
}
CodableFiles shared reference.
let codableFiles = CodableFiles.shared
Save Codable object in default directory.
let user = User(name: "First name", lastName: "Last name")
let savePath = try? codableFiles.save(object: user, withFilename: "userModel")
Load Codable object from default directory.
let loadedObject = try? codableFiles.load(objectType: User.self, withFilename: "userModel")
Save array of Codable objects in default directory.
let user = User(name: "First name", lastName: "Last name")
let anotherUser = User(name: "Another first name", lastName: "Another last name")
let savePath = try? codableFiles.saveAsArray(objects: [user, anotherUser], withFilename: "usersArray")
Load array of Codable objects from default directory.
let loadedObjects = try? codableFiles.loadAsArray(objectType: User.self, withFilename: "usersArray")
Load Codable object from a file that is inside app bundle.
if let filePath = Bundle.main.path(forResource: "user", ofType: "json"),
let filePathUrl = URL(string: bundle) {
let loadedObject = try? codableFiles.load(objectType: User.self, atPath: filePathUrl)
}
Delete a file from default directory.
try? codableFiles.deleteFile(withFileName: "userModel")
Delete a file from given directory.
try? codableFiles.deleteFile(withFileName: "userModel", atDirectory: "directoryName")
Delete default directory.
try? codableFiles.deleteDirectory()
Delete a directory.
try? codableFiles.deleteDirectory(directoryName: "directoryName")
Copy a file with given name from Bundle to default documents directory.
try? sut.copyFileFromBundle(fileName: "user")
App bundle
AppBundle is Read-only, so you can not write anything to it programmatically. That’s the reason we are using Documents Directory always to read & write data. Read more:
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html
Installation
CocoaPods
CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate CodableFiles into your Xcode project using CocoaPods, specify it in your Podfile
:
pod 'CodableFiles'
Carthage
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate CodableFiles into your Xcode project using Carthage, specify it in your Cartfile
:
github "egzonpllana/CodableFiles"
Swift Package Manager through Manifest File
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler.
Once you have your Swift package set up, adding CodableFiles as a dependency is as easy as adding it to the dependencies
value of your Package.swift
.
dependencies: [
.package(url: "https://github.com/egzonpllana/CodableFiles.git", .upToNextMajor(from: "0.1.10"))
]
Swift Package Manager through XCode
To add CodableFiles as a dependency to your Xcode project, select File > Swift Packages > Add Package Dependency and enter the repository URL
https://github.com/egzonpllana/CodableFiles.git
As a file
Since all of CodableFiles is implemented within a single file, you can easily use it in any project by simply dragging the file CodableFiles.swift
into your Xcode project.
Backstory
So, why was this made? While I was working on a project to provide mocked URL sessions with dynamic JSON data, I found that we can have these data saved in a file in Document Directory or loaded from Bundle so later we can update, read or delete based on our app needs. The objects that have to be saved or loaded must conform to the Codable protocol. So, I made Codable Files that make it possible to work with JSON data quicker, in an expressive way.
Questions or feedback?
Feel free to open an issue, or find me @egzonpllana on LinkedIn.