Examples of Swift Property Wrappers

Swift’s property wrappers are a powerful tool that allows developers to change how properties are stored and manipulated while keeping their interfaces clean and consistent. This post will discuss some practical use cases for property wrappers. Let’s get started! 1. UserDefault Wrapper UserDefaults is a straightforward mechanism to store small amounts of data persistently. We can simplify UserDefaults interactions with a UserDefault property wrapper: @propertyWrapper struct UserDefault<T> { let key: String let defaultValue: T init(_ key: String, defaultValue: T) { self.key = key self.defaultValue = defaultValue } var wrappedValue: T { get { return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue } set { UserDefaults.standard.set(newValue, forKey: key) } } } You can now store and retrieve UserDefaults values effortlessly: ...

June 2, 2023 · Mike Gopsill ·  Swift

Swift Property Wrappers

Property Wrappers were introduced to Swift in 5.1. Initially, they can seem a bit mystifying. However, they’re a powerful tool, helping to streamline your code and make it more expressive. Today, we’ll demystify Property Wrappers and learn how to use them in Swift. What Exactly is a Property Wrapper? Think of a Property Wrapper as a special kind of structure, class, or enumeration that “wraps” around a property in your code. This wrapper can add extra behaviour to the property, making it easier to manage and modify. ...

June 1, 2023 · Mike Gopsill ·  Swift

Understanding Modularisation and Dependencies in iOS and Swift

As software projects grow, so does their complexity. Managing this complexity is one of the most critical aspects of software development. One way of handling this complexity is through the principle of modularisation. In this post, we’ll delve deeper into the concept of modularisation and its counterpart, dependencies, in the context of iOS development with Swift. Modularisation in iOS In its essence, modularisation is the process of dividing a software system into separate, independent modules. Each module encapsulates a specific part of the system’s functionality and exposes a well-defined interface that other modules can use. ...

The Power of UIAppearance - Styling iOS Apps

UIAppearance is an underappreciated gem in UIKit’s toolbox. It provides an elegant way to style UI elements globally across your app, thereby keeping your codebase DRY (Don’t Repeat Yourself) and maintainable. In this post, we’ll dive into UIAppearance and learn how to harness its power to style our iOS apps effectively. What is UIAppearance? UIAppearance is a protocol in UIKit that allows you to customise the appearance of all instances of a class. You can set global styles for user interface elements, which will be applied to all instances of that class. ...

May 28, 2023 · Mike Gopsill ·  UIKit

Understanding Task and Child Task in Swift's Structured Concurrency

In the realm of programming, the ability to handle concurrent tasks is vital to creating applications that are both performant and user-friendly. The introduction of Swift’s Structured Concurrency has revolutionised the way developers handle async operations. This post will delve into the intricacies of tasks and child tasks in Swift’s Structured Concurrency and provide a comprehensive understanding of their uses. The Power of Tasks In Swift’s Structured Concurrency model, tasks are the building blocks of asynchronous operations. Marked by the async keyword, these tasks denote computations that are performed asynchronously. ...

Introduction to Structured Concurrency in Swift

Structured concurrency is a programming paradigm aimed at improving multithreaded code’s clarity, efficiency, and robustness. It’s a fresh approach that allows you to manage concurrent tasks in a predictable, logical structure. Hence, “structured” concurrency. What is Structured Concurrency? Structured concurrency fundamentally means that the lifetime of concurrent tasks is bound and managed. In essence, when a block of code starts a concurrent task, that task is ensured to finish before the block of code concludes. This intrinsic tying of task lifetimes leads to code that is easier to reason about, more predictable, and less prone to bugs. ...