The Blog

What’s the difference between a singleton and a shared instance in Swift?

A common pattern on iOS, and in Swift, is to define an instance of an object that you can access from any place in your app. Common examples are URLSession.shared, FileManager.default, and UserDefaults.standard. These objects can all be considered shared instances, or globally available instances. Defining a shared instance is commonly done as follows: struct DataProvider { static var shared = DataProvider() // useful properties and methods } It’s common for developers to call this a singleton, or a singleton Read more…

An extensive guide to sorting Arrays in Swift

When you’re working with Arrays in Swift, it’s likely that you’ll want to sort them at some point. In Swift, there are two ways to sort an Array: Through the Comparable implementation for each element in your array By providing a closure to perform a manual/specialized comparison between elements If you have a homogenous array of elements, for example [String], you can rely on String’s implementation of Comparable to sort an array of String in some sensible manner. There are Read more…

Splitting a JSON object into an enum and an associated object with Codable

Decoding data, like JSON, is often relatively straightforward. For a lot of use cases, you won’t need to know or understand a lot more than what I explain in this post. However, sometimes you need to dive deeper into Codable, and you end up writing custom encoding or decoding logic like I explain in this post. In more advanced scenarios, you might need to have an extremely flexible approach to decoding data. For example, you might want to decode your Read more…

Writing custom JSON encoding and decoding logic

The default behavior for Codable is often good enough, especially when you combine this with custom CodingKeys, it’s possible to encode and decode a wide variety of JSON data without any extra work. Unfortunately, there are a lot of situations where you’ll need to have even more control. The reasons for needing this control are varied. You might want to flatten a deeply nested JSON structure into a single Codable object. Or maybe you want to assign a default value Read more…

Customizing how Codable objects map to JSON data

In the introductory post for this series you learned the basics of decoding and encoding JSON to and from your Swift structs. In that post, you learned that your JSON object is essentially a dictionary, and that the JSON’s dictionary key’s are mapped to your Swift object’s properties. When encoding, your Swift properties are used as keys in the encoded JSON output dictionary. Unfortunately, we don’t always have the luxury of a 1 to 1 mapping between JSON and our Read more…

An introduction to working with Codable in Swift

Virtually every modern application needs some way to retrieve, and use, data from a remote source. This data is commonly fetched by making a network request to a webserver that returns data in a JSON format. When you’re working with Javascript, this JSON data can be easily decoded into a Javascript object. Javascript doesn’t have strong typing, so a JSON object in Javascript is really just a JavaScript Object. Objects in Javascript are very comparable to dictionaries in Swift, except Read more…

Flattening a nested JSON response into a single struct with Codable

Often, you’ll want you Swift models to resemble JSON that’s produced by an external source, like a server, as closely as possible. However, there are times when the JSON you receive is nested several levels deep and you might not consider this appropriate or needed for your application. Or maybe you’re only interested in a couple of fields from the JSON response and these fields are hidden several levels deep in the JSON that’s returned by a server. In this Read more…

Preventing unwanted fetches when using NSFetchedResultsController and fetchBatchSize

This article covers a topic that is extensively covered in my Practical Core Data book. This book is intended to help you learn Core Data from scratch using modern techniques and every chapter features sample apps in SwiftUI as well as UIKit whenever this is relevant. When you use Core Data in a UIKit or SwiftUI app, the easiest way to do this is through a fetched results controller. In SwiftUI, fetched results controller is best used through the @FetchRequest Read more…

What does “atomic” mean in programming?

When you’re learning about databases or multithreaded programming, it’s likely that you’ll come across the term "atomic" at some point. Usually you’ll hear the term in the context of an operation. For example, an atomic read / write operation. Or atomic access to a property. But what does this mean? Generally, you can summarize atomic as "one at a time". For example, when accessing or mutating a property is atomic, it means that only one read or write operation can Read more…

10 things iOS developers should focus on in 2021

I know. This is a clickbaity title. And yes, I know that this list is not relevant for everybody. I know that not every iOS developer has to learn everything on this list. That said, this list is a list of technologies and skills that I think are either already important, or becoming increasingly important this year. It’s a list of technologies and skills that I have learned, plan to learn, or would like to learn this year. It’s also Read more…