SF Symbol: How to for Swift & SwiftUI
Apple introduced SF Symbols during WWDC 2019 as a big present for developers, as they're straightforward and free to use ...
Enum explained in-depth with code examples in Swift
Enum usage in Swift: If case, guard case, fallthrough, associated values, and the CaseIteratable protocol. These terms could sound familiar if ...
Black Friday: 50% discount on RocketSim & Going Indie Course
It's that time of year when once-a-year discounts are offered on all kinds of products, including RocketSim and my Going ...
Contingent pricing for in-app subscriptions
Contingent pricing for in-app subscriptions creates a new way to retain and attract customers by providing discounted subscription prices to ...
MainActor usage in Swift explained to dispatch to the main thread
MainActor is a new attribute introduced in Swift 5.5 as a global actor providing an executor that performs its tasks ...
How to Use URLSession with Async/Await for Network Requests in Swift
URLSession allows you to perform network requests and becomes even more powerful with its async/await APIs. You can request data ...
Using the #require macro for Swift Testing
Swift Testing is Apple's modern replacement library for XCTest and introduces new macros like #require. We've covered the #expect macro ...
Vapor and Swift Testing: Running tests in parallel
Swift on the Server and Vapor go hand in hand, but using Swift Testing can be challenging initially. Tests run ...
Security-scoped bookmarks for URL access
Security-scoped bookmarks allow you to store access to a given user-selected URL. They are commonly used on macOS to store ...
The Going Indie Podcast with Antoine van der Lee
After creating my course, "From Side Project to Going Indie", I proudly announce a new podcast: "Going Indie with Antoine ...
Using the #expect macro for Swift Testing
Swift Testing is Apple's Swift framework for writing tests and introduces several macros, including the #expect macro. Where we had ...
Indie Development: Full Course now Available
Many engineers dream of indie development, leaving a full-time job behind, embracing freedom, and solely focusing on personal apps. While ...
Using Traits to annotate and customize test behavior
Traits allow you to customize or annotate tests using the Swift Testing framework announced at WWDC 2024. They also allow ...
Swift Testing: Validate your code using expressive APIs
Apple announced the Swift Testing framework during WWDC 2024. It transforms the way we write tests in Swift. A new ...
App onboarding funnel optimization to increase conversions
An app onboarding can be seen as a funnel full of steps toward the key action of your application. A ...
Designing Apps: 5 Methods to improve your workflow
Designing apps can be challenging if you don't have a design background. Many of you who read my blog are ...
JSON Parsing in Swift explained with code examples
JSON parsing in Swift is a common thing to do. Almost every app decodes JSON to show data in a ...
@Entry macro: Creating custom environment values in SwiftUI
The @Entry macro in SwiftUI allows you to define custom environment values without writing boilerplate code. While introduced in Xcode ...
App design: 5 benefits of using system components
Building custom elements and ignoring the sometimes boring system components during app design can be appealing. However, these boring elements ...
Going Indie: From Side Project to Going Independent
Switching careers from having a full-time job to going fully independent after transforming multiple side projects into six-figure revenue. In ...
Memory consumption when loading UIImage from disk
Memory consumption can quickly increase if you load many images from the disk using UIImage. You'll generally load images from ...
Why macOS Development is Perfect for Indie Developers
Building apps for macOS offers developers a fantastic opportunity to expand their skills, create useful utilities to solve their problems, ...
Inspect network traffic using the Xcode Simulator
Inspecting network traffic is an essential skill for app developers. Several tools allow you to monitor requests going in and ...
Typed throws in Swift explained with code examples
Typed throws are new since Xcode 16 and allow you to define the type of error a method throws. Instead ...
Async await in Swift explained with code examples
Async await is part of the new structured concurrency changes that arrived in Swift 5.5 during WWDC 2021. Concurrency in ...
Swift 6: Incrementally migrate your Xcode projects and packages
Apple announced Swift 6 during WWDC 2024 as a major release of their programming language. It aims to create a ...
@Previewable: Dynamic SwiftUI Previews Made Easy
Xcode 16 introduced the @Previewable macro for SwiftUI Previews, allowing you to use dynamic properties inline in previews. You'll be ...
Swift Package Manager framework creation in Xcode
Swift Package Manager (SPM) is Apple's answer for managing dependencies. We're all familiar with tools like CocoaPods and Carthage, but ...
ChatGPT for Swift: Top 5 code generation prompts
Using ChatGPT for Swift code generation can drastically increase your productivity. While I'm uncertain whether AI will take over our ...
MVVM: An architectural coding pattern to structure SwiftUI Views
MVVM (Model-View-ViewModel) is an architectural coding pattern for structuring SwiftUI views. The goal of the pattern is to separate the ...
Repository design pattern in Swift explained using code examples
The repository design pattern allows you to create an accessible data layer that's easy to mock for tests. By using ...
Xcode Build Insights: Keep track of project compilation times
Xcode Build Insights lets you keep track of compilation times to ensure your project doesn't suddenly become slow to build ...
Solve Missing API declaration using required reason (ITMS-91053)
Apps submitted to the App Store must define API declarations using the required reasons. Apps that don't will be rejected ...
Using @Environment in SwiftUI to link Swift Package dependencies
The @Environment property wrapper in SwiftUI allows you to read values from a view's environment. You're able to configure an ...
Bar Chart creation using Swift Charts
Apple introduced Swift Charts during WWDC '22, allowing you to visualize data into bar charts. Before this framework, we had ...
Statistical significance and its importance with app experiments
Statistical significance tells you whether the result from an experiment is likely attributable to the specific change you did. It's ...
Identifiable protocol in SwiftUI explained with code examples
The Identifiable protocol in SwiftUI allows you to add a unique object identity. The protocol requires a single ID property ...
Key press events detection in SwiftUI
Key press events detection in SwiftUI allows you to respond to a keyboard key like return (enter), shift, command, and ...
The power of consistency in side projects
The success of your side projects can be mixed, but consistency brings power to your results. It's often easier to ...
Test-Driven Development (TDD) for bug fixes in Swift
Test-driven development (TDD) is a technique that requires you first to write a failing test before you start implementing a ...
Optionals in Swift explained: 5 things you should know
Optionals are in the core of Swift and have existed since the first version of Swift. An optional value allows ...
Third-party libraries acknowledgments using a Settings bundle
Third-party libraries help developers build apps faster but often come with a license. The MIT license is likely the most ...
Extensions in Swift: How and when to use them
Extensions in Swift allow you to extend an existing class, struct, enumeration, or protocol with new functionality. Whether it's a ...
How to use @ScaledMetric in SwiftUI for Dynamic Type support
The @ScaledMetric property wrapper in SwiftUI allows you to adopt custom values to dynamic type settings. Your custom values will ...
App Preview Videos Capturing using the Xcode simulator
App Preview Videos allow you to increase the visibility of your app in the App Store. While it's best to ...
Status bar overrides in the iOS Simulator
Status bar overrides in the iOS Simulator allow you to change the appearance of the network, cellular, time, and battery ...
ScrollView Bounce Behavior configuration in SwiftUI
A ScrollView bounce behavior configuration allows you to define whether a scrollable view bounces when reaching the end of its ...
Concurrency-safe global variables to prevent data races
Concurrency-safe global variables help you prevent data races and allow you to solve strict-concurrency-related warnings. Since you can access global ...
@Observable Macro performance increase over ObservableObject
The @Observable Macro was first introduced during WWDC 2023 to replace ObservableObject and its @Published parameters. The macro allows you ...
Swift Newsletters: How to stay up to date as an app developer
Following the Swift Evolution can be time-consuming, but Swift newsletters enable you, as an app developer, to stay current. The ...
SwiftLee 2023: A Year in Review
Time flies when you're having fun, and 2023 has definitely been one of those years. It's been a year full ...
Using campaign links to track impressions, downloads, and sales
Campaign links open your App Store product page and allow you to track the performance of your marketing channels. As ...
Symbolicate crash logs with Xcode
When you receive an unreadable crash report, you can symbolicate crash logs with the help of Xcode. As a developer, ...
SFSafariViewController in SwiftUI: Open webpages in-app
SFSafariViewController can be used to let your users open webpages in-app instead of in an external browser. While the view ...
Swift Evolution: Reading and learning from proposals
The Swift Programming Language constantly evolves, and most of its changes result from public proposals inside the Swift Evolution repository ...
Unit testing async/await Swift code
Unit tests allow you to validate code written using the latest concurrency framework and async/await. While writing tests doesn't differ ...
Debugging SwiftUI views: what caused that change?
Debugging SwiftUI views is an essential skill when writing dynamic views with several redrawing triggers. Property wrappers like @State and ...
RocketSim 12.0: Builds Apps Faster
RocketSim is a developer tool that gives your Xcode Simulator extra functionalities to increase day-to-day development productivity. A floating window ...
Promotional offers: Increase App Revenue using discounts
Promotional offers allow you to increase the revenue for your app by promoting a user's subscription to a new offer ...
User Defaults reading and writing in Swift
User Defaults are the go-to solution for Swift applications to store preferences that persist across launches of your app. It's ...
Thread dispatching and Actors: understanding execution
Actors ensure your code is executed on a specific thread, like the main or a background thread. They help you ...
@preconcurrency: Incremental migration to concurrency checking
The @preconcurrency attribute is part of the tools that help you incrementally migrate to strict concurrency checking. When async/await was ...
Picking your minimum iOS version to support
When a new iOS version arrives, it's oftentimes a moment to reflect on the supported iOS versions and see to ...
Value and Type parameter packs in Swift explained with examples
Type parameter packs and value parameter packs allow you to write a generic function that accepts an arbitrary number of ...
App Intent driven development in Swift and SwiftUI
App Intent driven development can help you architect your code for reusability. An app intent allows you to define an ...
If and switch expressions in Swift
Swift 5.9 introduced if and switch expressions that allow you to write shorter code by omitting the return keyword. The ...
Predicate Macro in Swift for filtering and searching
#Predicate is a new Macro available since Swift 5.9 and Xcode 15, allowing you to filter or search a data ...
SwiftSyntax: Parse and Generate Swift source code
SwiftSyntax is a collection of Swift libraries that allow you to parse, inspect, generate, and adjust Swift source code. It ...
Build performance analysis for speeding up Xcode builds
Build performance can be analyzed in Xcode to speed up your builds. This can quickly speed up your workflow and ...
Xcode Debug Console Tour: Exploring All Options
The Xcode Debug Console allows you, as a developer, to explore logs and debug issues with your apps. All your ...
Localization testing in Xcode
Localization testing becomes vital if your apps are localized in multiple languages. You want to ensure your UI looks good ...
OSLog and Unified logging as recommended by Apple
OSLog is a replacement for print, and NSLog and Apple's recommended way of logging. It has different logging levels, like ...
@backDeployed to extend function availability to older OS releases
The @backDeployed attribute in Swift allows you to extend function availability back to older OS versions. It's beneficial for framework ...
App Intents Spotlight integration using Shortcuts
App Intents have been new since iOS 16 and offer a programmatic way to service your app's content and functionality ...
#Preview SwiftUI Views using Macros
Starting with Xcode 15 and Swift 5.9, you can create previews for your SwiftUI view using the new #preview Macro ...
Xcode Bookmarks: Save code landmarks & organize tasks
Xcode Bookmarks were introduced during WWDC 2023 as part of the significant Xcode 15 release. They are a new feature ...
Swift Macros: Extend Swift with New Kinds of Expressions
Swift Macros got introduced in the WWDC 2023 release of Swift 5.9. They are a new way for you to ...
ContentUnavailableView: Handling Empty States in SwiftUI
ContentUnavailableView is a SwiftUI view introduced in iOS 17 during WWDC 2023. It allows you to handle cases of networking ...
Share Swift Code between Swift On Server Vapor and Client App
Sharing Swift code between a backend and client app is one of the benefits you'll get when working with Swift ...
10 Tips to Get Your App Featured on the App Store
Getting your app featured on the App Store allows you to gain organic growth and more reach. Users can find ...
Ranges in Swift explained with code examples
Ranges in Swift allow us to select parts of Strings, collections, and other types. They're the Swift variant of NSRange ...
Universal Links implementation on iOS
Universal Links allow you to link to content inside your app when a user opens a particular URL. Webpages will ...
Optimizing your app for Network Reachability
Network Reachability is a vital aspect of apps that use some networking capabilities. Your users won't always have a good ...
Deeplink URL handling in SwiftUI
Deeplinks allow you to open your app and navigate into a specific location right after launch. An example could be ...
Network Extension Debugging on macOS
A Network Extension on macOS allows you to create content filters, DNS proxies, and more. They integrate nicely into the ...
Running Xcode on top of iPad
Using the latest Xcode 14.3 and the iPad Pro (12.9 Inch) with iOS 16.4 beta, I've been able to run ...
Location Simulation in Xcode’s Simulator
Location Simulation is a critical feature for apps that provide location access. You want to mimic the environment of real ...
The operation couldn’t be completed: solving errors in Swift
"The operation couldn't be completed" is a common error to receive from Apple's standard SDKs or 3rd party libraries. The ...
Equatable conformance in Swift explained with code examples
Equatable conformance allows you to compare one object with another. Based on whether the objects match, you can perform a ...
View Composition using ViewModifiers in SwiftUI
View Composition allows you to create reusable components to create enriched views. You can extract logic into reusable components using ...
Introducing Roadmap: Offer Public Feature Voting
Roadmap is a new open-source framework written completely in Swift and SwiftUI, allowing you to integrate feature voting functionality for ...
Detached Tasks in Swift explained with code examples
Detached tasks allow you to create a new top-level task and disconnect from the current structured concurrency context. You could ...
Xcode Simulator Directories Exploration
Xcode Simulator directories allow you to find related files for your app. Unlike on a real device, you can access ...
Testing push notifications on the iOS simulator
Testing push notifications in the iOS simulator make adding support for remote notifications much more effortless. You often must iterate ...
Task Groups in Swift explained with code examples
Task Groups in Swift allow you to combine multiple parallel tasks and wait for the result to return when all ...
Engineering goals: How to become a more successful developer
Engineering goals create focus and help you achieve the milestones of becoming a successful developer. You'll know better what you've ...
SwiftLee 2022: A Year in Review
Another year passed by, and we're close to getting into 2023. It's been a year with a single Swift 5.7 ...
OptionSet in Swift explained with code examples
OptionSet in Swift allows you to define a set of options for configurations. It's the Swift variant of the well-known ...
How to use FormatStyle to restrict TextField input in SwiftUI
A custom FormatStyle can help you control the allowed characters of a SwiftUI TextField. You might want to allow numbers ...
Sheets in SwiftUI explained with code examples
Sheets in SwiftUI allow you to present views that partly cover the underlying screen. You can present them using view ...
@dynamicCallable in Swift explained with code examples
It's all in the name: @dynamicCallable in Swift allows you to dynamically call methods using an alternative syntax. While it's ...
Binary Targets in Swift Package Manager
Binary Targets in Swift Package Manager (SPM) allow packages to declare xcframework bundles as available targets. The technique is often ...
Result builders in Swift explained with code examples
Result builders in Swift allow you to build up a result using 'build blocks' lined up after each other. They ...
Getting started with Unit Tests in Swift
Unit tests in programming languages ensure that written code works as expected. Given a particular input, you expect the code ...
Refactoring Swift: Best Practices to succeed
Refactoring code is part of the journey toward building sustainable apps. Whether you're experienced or not: every developer refactors their ...
Announcing the SwiftLee Talent Collective
Today I'm excited to introduce you to the SwiftLee Talent Collective — an initiative to connect engineers with exciting companies ...
Alternate App Icon Configuration in Xcode
Adding alternate app icons to your app allows users to customize their home screen with an app icon that fits ...
Never keyword in Swift: return type explained with code examples
The Never type in Swift allows you to tell the compiler about an exit point in your code. It's a ...
Side Projects: 10 Tips for being successful
It's common to have a side project as an engineer since we can build our ideas. At the same time, ...
Deadlocks in Swift explained: detecting and solving
Deadlocks in Swift can make your app hang, causing a frustrating situation for both you and your users. Your app ...
Variable WidgetBundle configuration based on conditions
The WidgetBundle protocol inside WidgetKit allows you to configure supported widgets for your apps. Whenever you add one or more ...
Accessibility in SwiftUI explained for UIKit developers
Adding accessibility support in SwiftUI will be more approachable for you compared to UIKit. But still, if you’ve been sharpening ...
VoiceOver navigation improvement tips for SwiftUI apps
VoiceOver navigation support in your apps comes with the same requirements as navigating through touch controls. When navigating apps with ...
@ViewBuilder usage explained with code examples
The @ViewBuilder attribute is one of the few result builders available for you to use in SwiftUI. You typically use ...
Faster StoreKit testing by syncing in-app purchase products
StoreKit testing in the Simulator allows you to speed up testing in-app purchases for your app. You can test in-app ...
Shared with You implementation and testing explained
iOS 16 introduced Shared with You allowing you to showcase content shared in Messages inside your app. Users can find ...
Sendable and @Sendable closures explained with code examples
Sendable and @Sendable are part of the concurrency changes that arrived in Swift 5.5 and address a challenging problem of ...
UIViewRepresentable explained to host UIView instances in SwiftUI
Adopting the UIViewRepresentable protocol allows you to host UIView instances in SwiftUI. Your SwiftUI code is converted to UIKit views ...
URLSessionConfiguration: Exploring opt-in configurations
URLSessionConfiguration can be used to initialize URLSession instances in Swift. While in most cases, you'll likely use the default configuration, ...
App Store Connect API SDK in Swift: Creating Developer Tools
The new App Store Connect API was announced during WWDC 2018 and made it possible to write applications for App ...
Generics in Swift explained with code examples
Generics in Swift allows you to write generic and reusable code, avoiding duplication. A generic type or function creates constraints ...
Existential any in Swift explained with code examples
Existential any allows you to define existential types in Swift by prefixing a type with the any keyword. In short, ...
Some keyword in Swift: Opaque types explained with code examples
The some keyword in Swift declares opaque types, and Swift 5.1 introduced it with support for opaque result types. Many ...
Using NavigationLink programmatically based on binding in SwiftUI
NavigationLink in SwiftUI allows pushing a new destination view on a navigation controller. You can use NavigationLink in a list ...
App Icon Generator is no longer needed with Xcode 14
An App Icon Generator generates all required app icon sizes based on a single-size icon input file. Creating and dragging ...
Increase App Ratings by using SKStoreReviewController
SKStoreReviewController allows asking your users for App Store ratings from within the app. Positive ratings can help your app stand ...
Markdown rendering using Text in SwiftUI
SwiftUI comes with built-in markdown support for text, making it easy to transform the text into bold, italic, and other ...
Memory leaks prevention using an autoreleasepool in unit tests
Memory leaks often happen without notice. Although best practices like using a weak reference to self inside closures help a ...
AsyncSequence explained with Code Examples
AsyncSequence is part of the concurrency framework and the SE-298 proposal. Its name implies it's a type providing asynchronous, sequential, ...
AsyncThrowingStream and AsyncStream explained with code examples
AsyncThrowingStream and AsyncStream are part of the concurrency framework introduced in Swift 5.5 due to SE-314. Async streams allow you ...
Downloading and Caching images in SwiftUI
Downloading and caching images is an essential part of building apps in Swift. There are several ways of downloading images ...
Using MetricKit to monitor user data like launch times
The MetricKit framework allows us to collect all kinds of data from our end users, including launch times and hang ...
Disable animations on a specific view in SwiftUI using transactions
Animations in SwiftUI look great and make your app shine, but sometimes you want to disable animations on a specific ...
Error alert presenting in SwiftUI simplified
Presenting error alerts in apps is essential to communicate failures to your end-users. The happy flow of apps is often ...
AnyObject, Any, and any: When to use which?
AnyObject and Any got a new option any as introduced in SE-355, making it harder for us developers to know ...
How to use the #available attribute in Swift
Marking pieces of code as available or unavailable per platform or version is required in the ever-changing landscape of app ...
@Published risks and usage explained with code examples
@Published is one of the property wrappers in SwiftUI that allows us to trigger a view redraw whenever changes occur ...
@StateObject vs. @ObservedObject: The differences explained
The @StateObject and @ObservedObject property wrappers tell a SwiftUI view to update in response to changes from an observed object ...
How to use the Redacted View Modifier in SwiftUI with useful extensions
The redacted view modifier in SwiftUI allows us to create a so-called skeleton view while our data is loading. Using ...
@EnvironmentObject explained for sharing data between views in SwiftUI
@EnvironmentObject is part of the family of SwiftUI Property Wrappers that can make working with SwiftUI views a little easier ...
Self-documenting code in Swift to increase readability
Self-documenting code helps explain a piece of code to other developers on a project without the need for actual documentation ...
Tasks in Swift explained with code examples
Tasks in Swift are part of the concurrency framework introduced at WWDC 2021. A task allows us to create a ...
Guard statements in Swift explained with code examples
Guard statements in Swift allow us to implement checks into our code that prevents the current scope from continuing. When ...
Writing Swift Articles: Tips to become a better writer
Writing Swift articles is a great way to become a better engineer and is often seen as a required skill ...
Swift in 2021: A Year in Review
One of the best years for Swift is close to reaching its end. Time flies when you're having fun, and ...
Reflection in Swift: How Mirror works
Reflection in Swift allows us to use the Mirror API to inspect and manipulate arbitrary values at runtime. Even though ...
RunLoop.main vs DispatchQueue.main: The differences explained
RunLoop.main and DispatchQueue.main are often used as schedulers within Combine. During code reviews, I often encounter inconsistency in using one ...
Creating an App Update Notifier using Combine and async/await
An app update-notifier promotes a new app update to your users. Using a notifier will get better adoption rates with ...
Non-fatal errors vs fatal crashes: The differences explained
Non-fatal errors happen in every application that's developed and have a close relationship with fatal errors. Most of us know ...
Composition vs. Inheritance: code architecture solutions explained in Swift
Composition and inheritance are both fundamental programming techniques when working in object-oriented programming languages. You've likely been using both patterns ...
Property Wrappers in Swift explained with code examples
Property Wrappers in Swift allow you to extract common logic in a distinct wrapper object. This new technique appeared at ...
Increasing development effectiveness by recognizing repetition
Development effectiveness determines how fast and efficient you can work as an engineer. The more efficient you can make your ...
Presentation tips for performing professional Swift talks
Presentation tips can help you perform professional Swift talks by making sure you're well prepared and professional-looking. Last week, I ...
Nonisolated and isolated keywords: Understanding Actor isolation
SE-313 introduced the nonisolated and isolated keywords as part of adding actor isolation control. Actors are a new way of ...
EXC_BAD_ACCESS crash error: Understanding and solving it
Building apps all goes well in the beginning. You're developing an app from scratch; it's stable and runs perfectly fine ...
Race condition vs. Data Race: the differences explained
Race conditions and data races are similar but have a few significant differences you should know. Both terms are often ...
Thread Sanitizer explained: Data Races in Swift
The Thread Sanitizer, also known as TSan, is an LLVM based tool to audit threading issues in your Swift and ...
PassthroughSubject vs. CurrentValueSubject explained
PassthroughSubject and CurrentValueSubject are two types from the Combine framework that conforms to the Subject protocol. Both are very similar ...
@AppStorage explained and replicated for a better alternative
The @AppStorage Property Wrapper was introduced in SwiftUI to allow easy access to the user defaults. When property wrappers were ...
How to use throwing properties to catch failures in Swift
Throwing properties allow defining computed properties that throw an error on failure. SE-310 introduced this feature in Swift 5.5 and ...
Unwrap or throw: Exploring solutions in Swift
Unwrap or throw is a scenario in which we want to throw an error if an optional returns a nil ...
Async let explained: call async functions in parallel
Async let is part of Swift's concurrency framework and allows instantiating a constant asynchronously. The concurrency framework introduced the concept ...
Development Assets in Xcode to enrich SwiftUI Previews
Development Assets in Xcode allow you to provide test data to use within SwiftUI previews and other code during development ...
Dependency Injection in Swift using latest Swift features
Dependency Injection is a software design pattern in which an object receives other instances that it depends on. It's a ...
Actors in Swift: how to use and prevent data races
Swift Actors are new in Swift 5.5 and are part of the big concurrency changes at WWDC 2021. Before actors, ...
Flaky tests resolving using Test Repetitions in Xcode
Flaky tests can be frustrating to deal with. You're ready to open your PR until you realize your tests fail ...
Improve discoverability using Static Member Lookup in Generic Contexts
Static Member Lookup is extended to Generic Contexts since the release of SE-0299. It might seem to be a minor ...
Presenting sheets with UIKit using a UISheetPresentationController
WWDC 2021 introduced iOS 15 with many API changes, including improvements to presenting sheets in UIKit with the new UISheetPresentationController ...
WWDC 2021 Events, Parties, and Panels you don’t want to miss
WWDC 2021 is around the corner and will bring a ton of (home)work for all of us. A new Xcode, ...
Swift Jobs: How to make the right career move
Swift jobs are something we're all interested in. Companies are hiring remotely more than ever since everybody is working from ...
Fileprivate vs private in Swift: The differences explained
Fileprivate and private are part of the access control modifiers in Swift. These keywords, together with internal, public, and open, ...
URLSession: Common pitfalls with background download & upload tasks
URLSession enables you to download and upload files while the app is in the background. Basic instructions to get it ...
NSPredicate based XCTestExpectations for conditional checks
NSPredicate allows us to write predicates for validating a certain outcome. They're often used combined with Core Data fetch requests ...
How to observe NSManagedObject changes in Core Data using Combine
Observing changes in Core Data NSManagedObject instances with Combine publishers can be a great solution to keep your user interface ...
How to create a Conditional View Modifier in SwiftUI
Conditional View Modifier creation in SwiftUI allows you only to apply modifiers if a certain condition is true. Whether it's ...
Getting started with the Combine framework in Swift
Combine was introduced as a new framework by Apple at WWDC 2019. The framework provides a declarative Swift API for ...
How to test optionals in Swift with XCTest
Optionals types in Swift either have a value or not, and there are several ways to test optionals using the ...
How to use the rethrows keyword in Swift
Rethrows in Swift allows forwarding a thrown error by a given function parameter. It's used a lot in methods like ...
How to use @autoclosure in Swift to improve performance
@autoclosure in Swift is a type of closure that allows to omit braces and make it look like a normal ...
How to create a Dynamic Pager View for onboardings
A pager view in SwiftUI like we know UIPageViewController in UIKit didn't exist until iOS 14 and macOS 11.0. Using ...
How and when to use Lazy Collections in Swift
Lazy collections are similar to a regular collection but change the way how modifiers like map, filter, and reduce are ...
How to use Variadic parameters in Swift
Variadic parameters make it possible to pass zero or more values of a specific type into a function. It can ...
XCTExpectFailure: Expected test failures explained with code examples
XCTExpectFailure was introduced in Xcode 12.5 and allows marking test failures as expected. The first time I read about this ...
Lazy var in Swift explained with code examples
A lazy var is a property whose initial value is not calculated until the first time it's called. It's part ...
Closures in Swift explained with Code Examples
Closures in Swift can be challenging to understand with types like trailing closures, capturing lists, and shorthand syntaxes. They're used ...
What is a Computed Property in Swift?
Computed properties are part of a family of property types in Swift. Stored properties are the most common which save ...
SwiftLee 2020 In Review: Most read blog posts
Every year I'm looking back at what I achieved with SwiftLee as well as what I want to achieve in ...
Getting started with associated types in Swift Protocols
Associated types in Swift work closely together with protocols. You can literally see them as an associated type of a ...
Result in Swift: Getting started with Code Examples
The Result enum is available since Swift 5 and allows us to define a success and failure case. The type ...
Xcode Mark Line to improve readability using // Mark: comments
Xcode Mark Lines allows us to create a better overview of sections within our classes or structs. A so-called mark ...
App Launch Time: 7 tips to increase performance
App Launch Time is the time it takes before your app becomes responsive after startup. As the first experience of ...
Data validation on insertion, update, and deletion in Core Data
Data validation in apps is important to make sure we save data conforming to the business rules. A name should ...
Derived Attributes to improve Core Data Fetch Performance
Derived attributes are available since iOS 13 and aim to improve fetch performance in many different scenarios. Although we have ...
Constraints in Core Data Entities explained
Constraints in Core Data are part of an entity configuration. Settings like the entity name and Spotlight display name might ...
NSManagedObject events: handling state in Core Data
An NSManagedObject lifecycle goes from insertion and updates until deletion in the end. All those events come with their own ...
Try Catch Throw: Error Handling in Swift with Code Examples
Try catch in Swift combined with throwing errors make it possible to nicely handle any failures in your code. A ...
Overriding UserDefaults for improved productivity
UserDefaults within apps are used to store data related to user configurations. It's an easily accessible data store for saving ...
How-to use Diffable Data Sources with Core Data
Diffable Data Sources were introduced at WWDC 2019 as a replacement for UICollectionViewDataSource and UITableViewDataSource. The API is available on ...
Diffable Data Sources Adoption with Ease
Diffable Data Sources were introduced at WWDC 2019 and are available since iOS 13. They're a replacement of the good ...
Persistent History Tracking in Core Data
WWDC 2017 introduced a new concept available from iOS 11 which is persistent history tracking. It's Apple's answer for merging ...
withAnimation completion callback with animatable modifiers
SwiftUI is great when it comes down to animations as it does a lot for you with methods like withAnimation ...
Write-Ahead Logging (WAL) disabled to force commits in Core Data
Write-Ahead Logging is the default journaling mode for Core Data SQLite stores since iOS 7 and OS X Mavericks. Journaling ...
How to combine text weights in SwiftUI
Combining multiple text weights in SwiftUI might not look straight forward at first. If you're used to using UIKit you ...
Adding a closure as a target to UIButton and other controls in Swift
The target-action pattern is used in combination with user interface controls as a callback to a user event. Whenever a ...
Launch screens in Xcode: All the options explained
Launch screens appear when your app starts up and give the user the impression that your app is fast and ...
ValueTransformer in Core Data explained: Storing absolute URLs
ValueTransformers in Core Data are a powerful way of transforming values before they get inserted into the database and before ...
Full-screen development with Xcode and the Simulator
While developing apps it's important to create focus to get in your flow and speed up development. Full-screen mode can ...
SVG Assets in Xcode for Single Scale Images
Xcode 12 introduced support for using Scalable Vector Graphic (SVG) image assets in iOS, macOS, and iPadOS. It's one of ...
WWDC 2020: 7 Tips to prepare yourself
In less than a week we will know what WWDC 2020 has brought to us. Apple has been working hard ...
@discardableResult in Swift explained: Ignoring return values
While writing methods in Swift you're often running into scenarios in which you sometimes want to ignore the return value ...
Core Data Performance: 6 tips you should know
Writing Core Data code with performance in mind helps to prepare your app for the future. Your database might be ...
Introducing GitBuddy: Changelog and Release manager for GitHub
It's been a few months since we released the initial version of GitBuddy but it's the right time now to ...
Expressible literals in Swift explained by 3 useful examples
Expressible literals allow you to initialize types by making use of literals. There are multiple protocols available in the Swift ...
String Interpolation in Swift explained using 4 useful cases
Swift 5 introduced a decent version of string interpolation with SE-228 and updated the old version of the ExpressibleByStringInterpolation protocol ...
Using Custom debug descriptions to improve debugging
Custom debug descriptions can help you debug your own custom objects, structs, errors, and other types. Whenever you print out ...
URLs in Swift: Common scenarios explained in-depth
URLs are everywhere in an app we built. We reference local files using bundle paths, we fetch data from a ...
SwiftUI Previews: Validating views in different states
SwiftUI Previews allow us to develop a lot faster as we can now preview our views live in Xcode. Whenever ...
Custom Operators in Swift with practical code examples
Custom operators in Swift can make your code easier to read and simpler to maintain. Code can be written less ...
Custom subscripts in Swift explained with code examples
Custom subscripts in Swift allow you to write shortcuts to elements from collections or sequences and can be defined within ...
NSFetchedResultsController extension to observe relationship changes
Apple provides us with great classes like the NSFetchedResultsController to interact with Core Data databases in our apps. The API ...
Testing private methods and variables in Swift
Testing private methods and variables is often something we run into when writing tests for our applications. You could think ...
How to mock Alamofire and URLSession requests in Swift
Mocking data requests that are triggered by either Alamofire or URLSession is something we all run into when we start ...
Creating a command line tool using the Swift Package Manager
A command-line tool can be very useful for automating common tasks to boost developer productivity. While developing iOS applications we ...
Authentication with signed requests in Alamofire 5
With more than 30k stars on Github, you can tell that Alamofire is a popular framework to use for iOS ...
Unique values in Swift: Removing duplicates from an array
Removing duplicates to get unique values out of an array can be a common task to perform. Languages like Ruby ...
SwiftLee 2019 in review: Top Swift Development blog posts
You know it's been a great year if you have the feeling that it went really fast. After looking back ...
No space left on device: Testing low storage scenarios
No space left on device is an error message that starts to show up more lately. Over the years, storage ...
4 Tips to make it easier to fix crashes and bugs
Each app comes with performance issues, crashes, and bugs to fix. Although we try our very best we will always ...
Advanced asynchronous operations by making use of generics
Asynchronous operations allow you to write long-running tasks in a distinct matter while being able to add dependencies between several ...
Asynchronous operations for writing concurrent solutions in Swift
Asynchronous operations allow executing long-running tasks without having to block the calling thread until the execution completes. It's a great ...
Getting started with Operations and OperationQueues in Swift
Operations in Swift are a powerful way to separate responsibilities over several classes while keeping track of progress and dependencies ...
Concurrent vs Serial DispatchQueue: Concurrency in Swift explained
Concurrent and Serial queues help us to manage how we execute tasks and help to make our applications run faster, ...
Dark Mode: Adding support to your app in Swift
Dark Mode was introduced in iOS 13 and announced at WWDC 2019. It adds a darker theme to iOS and ...
Core Data and App extensions: Sharing a single database
Core Data got better and better over the years with improved APIs that make it easier to work with. The ...
Auto Layout in Swift: Writing constraints programmatically
Auto Layout constraints allow us to create views that dynamically adjust to different size classes and positions. The constraints will ...
Mastering the assistant editor in Xcode 11
Xcode 11 was introduced during WWDC 2019 and contained improvements in the way the assistant editor works. If you're using ...
5 Xcode breakpoints tips you might not yet know
Xcode breakpoints allow us to debug and find out solutions for nasty bugs. Without breakpoints, it would be a fun ...
Rich notifications on iOS explained in Swift
Rich notifications on iOS allow us to make the boring default notification just a little nicer by adding images, GIFs, ...
Struct vs classes in Swift: The differences explained
Swift brings us classes and structs which both can look quite similar. When should you use a struct and when ...
Xcode Instruments usage to improve app performance
Xcode Instruments is a developer tool that comes for free with Xcode. It has a lot of useful tools to ...
Error handling in Combine explained with code examples
Once you get started with Combine you'll quickly run into error handling issues. Each Combine stream receives either a value ...
Array vs Set: Fundamentals in Swift explained
An Array and a Set seem to be quite the same in the beginning. They're both collection types and have ...
Xcode refactoring options explained with examples
A brand new Xcode refactoring engine was introduced in Xcode 9. Although this is quite a few Xcode versions ago ...
Unused images and resources clean up in Xcode
Unused images can exist as a result of iterations in a project. Once a feature is no longer needed and ...
UIKeyCommand how-to add keyboard shortcuts & speed up your workflow
The UIKeyCommand class allows you to add keyboard shortcuts to your app. Although they might seem useful for iPad only, ...
Combine debugging using operators in Swift
Combine debugging can be hard with long stack traces which don't help at all. Asynchronous callbacks follow up on each ...
Creating a custom Combine Publisher to extend UIKit
A Custom Combine Publisher can add missing functionalities to UIKit elements you use every day. A lot of boilerplate code ...
Using Xcode Previews with existing UIKit views without using SwiftUI
Xcode Previews have been added in Xcode 11 and allow you to quickly preview the current state of your view ...
Dynamic Member Lookup combined with key paths in Swift
Dynamic member lookup has been introduced in Swift 4.2 with SE-195 and already allowed some pretty nice solutions to for ...
Using NSBatchDeleteRequest to delete batches in Core Data
An NSBatchDeleteRequest can be used to efficiently delete a batch of entries from a Core Data SQLite persistent store. It ...
Weak self and unowned self explained in Swift
Weak self and unowned self in Swift for many of us are hard to understand. Although Automatic Reference Counting (ARC) ...
Typealias usage in Swift
A typealias in Swift is literally an alias for an existing type. Simple, isn't it? They can be useful in ...
Developer productivity boost with Google Search Tips & Tricks
Developer productivity is important to deliver your project on time. There's a lot you can do as I already described ...
@unknown default usage with enums in Swift
@unknown default has been introduced in Swift 5 with SE-0192. It's a new addition to the way we can work ...
Swift 5.0: How to migrate your project and frameworks
Swift 5.0 has been released in March 2019 and is the first ABI stable Swift release. Although a lot of ...
WWDC First timer tips: How to get the most out of it
WWDC first timer tips help you to get the most out of Apple's World Wide Developer Conference. This conference takes place ...
Blog about Swift: Tips and ideas to start your own
How to start your own Swift blog? It's a question I get asked more and more. I've given some tips ...
Unused localized strings clean up from a Strings file
Strings files are used for localization in iOS and MacOS apps. These files can grow over time and make it ...
Required keyword usage in Swift classes and structs
The required keyword in Swift can be used in front of initializers in Swift. Its usage is simple and it's ...
Speeding up development: a collection of tips
Speeding up development to increase productivity can bring you a lot. You'll work more efficient, deliver faster, and you'll feel ...
Danger plugins to speed up code reviews
Danger plugins can help improve something we do every day: code reviews. Code reviews inside pull requests help you to ...
Alamofire vs URLSession: a comparison for networking in Swift
Alamofire and URLSession both help you to make network requests in Swift. The URLSession API is part of the foundation ...
How to use for loop, for each, while, and repeat in Swift (in-depth)
For loop, for each, and repeat are examples of control flow statements in Swift. Although most of them look similar, ...
QR Code generation with a custom logo and color using Swift
A QR Code is used a lot to share content or to add a new user in apps like Twitter ...
Cheat sheet examples for Xcode and Swift development
A cheat sheet can be a handy tool to quickly reference Xcode, Swift or iOS logic from a compact overview ...
SwiftLee 2018 in review: Top Swift Development blog posts
With 2019 coming closer it's time to review SwiftLee in 2018 and list the top swift development blog posts of ...
Implementing Siri support using NSUserActivity, intents and shortcuts
Siri support can be added using an Intent and an IntentUI extension. This adds quite some overhead and is not ...
Speeding up with Xcode Behaviors
Xcode behaviors can change the way how Xcode responds to certain events. Default behaviors help you already by showing for ...
Shortcuts essentials in Xcode to speed up your workflow
Making use of essential shortcuts in Xcode can speed up development and keep you in your flow. Xcode allows you ...
Measure the performance of code in Swift
It's important in any type of programming language to know how to measure the performance of code as there are ...
Performance, functional programming and collections in Swift
Functional programming is often done in Swift and so easy that it could easily hit performance. Iterating over large collections ...
SwiftLint valuable opt-in rules to improve your code
SwiftLint is a tool by Realm to enforce Swift style and conventions. It's proven to be adopted by a lot ...
Updating to Swift 4.2
Swift 4.2 is a major release and shipped with Xcode 10. It comes with a lot of code improvements for ...
Command-click on code options and possibilities in Xcode
Command-click no longer jumps to definition by default since Xcode 9 is introduced. It opens up a handy menu instead ...
Defer usage in Swift
Although the defer keyword was already introduced in Swift 2.0, it's still quite uncommon to use it in projects. Its ...
CompactMap vs flatMap: The differences explained
CompactMap and flatMap, what are the differences and when do you use each? Swift 4.1 introduced this new method with ...
Effective development by improving the daily routine as a developer
Effective development can be achieved by learning more skills, but also by improving the daily routine for you as a ...
Compiler Diagnostic Directives using a hashtag in Swift
The Swift standard library brings quite some compiler diagnostic directives by default. Although this might not ring a bell at ...
Where usage in Swift
Where is a powerful keyword within Swift to easily filter out values. It can be used in many different variants ...
Debugging breakpoints as a replacement for prints
Debugging breakpoints in Xcode allows you to replace prints and reuse debugging statements in future debugging sessions. By simply enabling ...
Typed notifications using custom extensions
The Swift API contains a lot of notifications sent out by the system like NSManagedObjectContextObjectsDidChange in Core Data or the ...
Using the Network Link Conditioner Utility (how-to)
The Network Link Conditioner on iOS and macOS enables you to test your app in networking conditions like your users ...
Core Data Debugging in Xcode using launch arguments
Core Data is Apple’s object graph management and persistency framework for iOS, macOS, watchOS, and tvOS. It's around for a ...
Using Xcode custom file templates with GIT
Xcode custom file templates are a great way to develop just a bit faster and enable you to define a ...
Useful less known Xcode tips to improve your workflow
Xcode is the main IDE for developing software for macOS, iOS, watchOS, and tvOS. It contains a lot of well-known ...
App Store Optimization for your App Store Page
App Store Optimization can help people discover your app on the App Store for iPhone and iPad. With some useful ...
Enabling newly added opt-in features in Xcode 10
During WWDC 2018 Apple announced Xcode 10 with a lot of new features. Many of them are available for you ...
Printing data requests using a custom URLProtocol
Almost all apps contain some kind of data requests. Printing data requests could sometimes be handy for debugging purposes. This ...
Controlling Progress children by adding remove
Controlling Progress children by default makes it only easy to add children to a Progress instance, but removing is not ...
Share Extension UI Tests written in Swift
UI Tests are a great tool to validate your application. It is easy to create them for your main application, ...
Fixing crashes with Firebase Crashlytics
Using Firebase Crashlytics can help you to solve your crashes faster. In this example we're going to dive into a ...
Updating to Swift 4.1
Swift 4.1 is released on the 29th of March and will be shipped with Xcode 9.3. Although it's a minor ...
How to get iOS reviews with 4+ stars for your app
Last May the new Buienradar app went live. With over 2 million users each month, it's one of the biggest ...
Optional protocol methods in Swift
In Swift it's kind of unsupported to implemented optional protocol methods. You can, which is ugly, use the @objc syntax: ...
WWDC First timers tips collection top 10
Again, I'm very happy to be one of the few developers to visit WWDC this year. I'm a first timer ...
The start of a new blog
Hi there! After thinking a lot of starting my own blog, I've finally made the decision to create one! As ...