Give your simulator superpowers

RocketSim: An Essential Developer Tool
as recommended by Apple

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 content. Whether it’s a horizontal or vertical scrolling list, you can configure both directions using view modifiers in SwiftUI. There are common scenarios for us to build when it comes down to lists. You might … 

 

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 variables from any context, ensuring access is safe by removing mutability or conforming to Sendable is essential. As a developer, you must prevent data races since they can make your apps crash unexpectedly. When preparing … 

 

@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 to remove all published properties while still being able to redraw SwiftUI views when a change occurs automatically. I highly recommend replacing your ObservableObject instances since the new macro prevents unnecessary SwiftUI redraws. As part … 

 

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 language is moving fast, and new features appear every year. While you might be able to develop apps without adopting new features immediately, finding a structured way to keep yourself in the loop is necessary. … 

 

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 of achievements, international conferences, and many articles & newsletters. It’s also been the year of Apple Vision Pro, Xcode 15, and Swift 5.9. If you follow my newsletter, you’ll know I like working structured with … 

 

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 an app developer, it’s crucial to understand how users discover your app. For example, many new users find Daily via the web, primarily via organic search (Google Search), paid ads (Google Ads), social media (mainly … 

 

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, it’s essential to identify symbols and ensure you can fix a crash that potentially affects many of your app’s users. Many of us will benefit from an online platform like Firebase or Datadog, which will … 

 

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 controller works great for UIKit, getting it to work in a SwiftUI app might be challenging. Whenever you’re running into cases where a UIKit solution is available only, you want to know how to write … 

 

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. The proposals can tell you what changes are coming up next, which is excellent if you want to stay updated with the latest developments. Swift Evolution Proposals can also help you understand newly released features. … 

 

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 much from synchronous tests, there are a few crucial concepts to be aware of when validating asynchronous code. If you’re new to async/await, I encourage you first to read Async await in Swift explained with …