Give your simulator superpowers

RocketSim: An Essential Developer Tool
as recommended by Apple

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 back content they would otherwise lose in the history of a long conversation. Apps like Photos, Music, and Podcasts have already implemented support, and now it's time to add support ...
Swift

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 type-checking values passed between structured concurrency constructs and actor messages. Before diving into the topic of sendables, I encourage you to read up on my articles around async/await, actors, and ...
ConcurrencySwift

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, you'll also have the opportunity to create a custom configuration with non-default settings. The default URLSessionConfiguration uses standard configurations that work best for most apps. However, no configuration fits all, ...
Swift

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 Store Connect. You can use the API to fetch metadata for apps, TestFlight builds, download sales reports, and much more. Apple added new endpoints over the years, with most recently ...
Swift

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 for the current scope, requiring input values to conform to these requirements. You've probably been using generic implementations already since they're all over the place in the Swift standard library ...
Swift

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, an existential means "any type, but conforming to protocol X." Any and AnyView have different purposes, which I explain in my article AnyObject, Any, and any: When to use which? ...
Swift

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 engineers experience working with opaque types for the first time when writing a body of a SwiftUI view. Though, it's often unclear what some keyword does and when to use ...
Swift

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 out in the App Store and attract more users. Conversions can increase when you ask the user for a rating at the right time. While implementing rating requests is easy, ...
OptimizationSwift

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 lot, it's usually not enough to prevent you from finding a certain memory peak during the development of a project. We can use memory graph debugging or Xcode Instruments to ...
Swift

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, and iterated access to its elements. In other words: it's an asynchronous variant of the regular sequence we're familiar with in Swift. Like you won't often create your custom Sequence ...
ConcurrencySwift

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 to replace existing code that is based on closures or Combine publishers. Before diving into details around throwing streams, I recommend reading my article covering async-await if you didn't do ...
ConcurrencySwift

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 rates. MetricKit data can be explored by going into the Xcode organizer panel in which several metrics are listed. Several techniques exist to improve launch times, but it all starts ...
Swift