• Coming Soon on App Store
  • Home
  • Contents
    • Articles
    • Videos
  • Channels

Nav Menu

  • Home
  • Articles
  • Videos
  • Channels

Copyright By SoftSky App LTD - 2025

  • Contact Us
  • Terms of Use
  • Privacy Policy

Developing iOS apps since 2009. Former Staff iOS Engineer at WeTransfer, Amsterdam. - Blogging weekly at avanderlee.com - Former Staff iOS Engineer at wetransfer.com, leading the development of the iOS apps with millions of monthly active users. - Tweeting daily about Swift, iOS, and Xcode at twitter.com/twannl - Curating articles for the SwiftLee Weekly Newsletter - Courses via courses.avanderlee.com

RSShttps://www.avanderlee.com/feed
  • beginner
  • By Antoine van der Lee
  • Nov 24

Black Friday: SwiftLee Courses & RocketSim

SwiftLee’s Black Friday: 50% off the Swift Concurrency Course (updated for Swift 6.2, 73+ lessons) and RocketSim Pro. RocketSim adds 30+ Simulator tools—URLSession inspector, network throttling, UserDefaults editor, push permission reset, camera testing. Discounts Nov 24–30.

  • intermediate
  • By Antoine van der Lee
  • Nov 17

Approachable Concurrency in Swift 6.2: A Clear Guide

Swift 6.2’s Approachable Concurrency is an Xcode build setting that eases async/await: progressive disclosure and @MainActor‑by‑default. Migrate flags individually; in SwiftPM use .enableUpcomingFeature. Note: nonisolated async run on the caller’s actor unless @concurrent.

  • intermediate
  • By Antoine van der Lee
  • Nov 10

MainActorMessage & AsyncMessage: Concurrency-safe notifications

Introduces NotificationCenter’s MainActorMessage and AsyncMessage for concurrency-safe, strongly typed notifications (iOS 26+). Shows migrating addObserver/post, defining custom messages with Subject, main-actor synchronous delivery vs async arbitrary isolation, and threading changes.

  • beginner
  • By Antoine van der Lee
  • Nov 3

Simulator Camera: Test your app without a physical device

RocketSim streams your Mac (or Continuity Camera) to Xcode’s iOS Simulator so you can test camera flows without a device. Uses your existing AVCaptureSession—no code changes. Works for barcodes/Vision. Install, grant permissions, add RocketSimConnect, and run.

  • intermediate
  • By Antoine van der Lee
  • Oct 27

Build performance analysis for speeding up Xcode builds

Speed up Xcode builds by measuring first: Build Timeline and Build Timing Summary (xcodebuild -showBuildTimingSummary). Gate slow Run Script phases by CONFIGURATION, enable Swift type-check warnings (-warn-long-*), tune build settings, try Eager Linking/parallel scripts, audit SwiftPM plugins. Faster incremental builds.

  • intermediate
  • By Antoine van der Lee
  • Oct 21

SwiftUI Architecture: Structure Views for Reusability and Clarity

SwiftUI bodies often bloat as features grow. Instead of hiding code in extensions, extract dedicated Views, build reusable ViewModifiers for common styling, and add generic View extensions to compose sections. Rule of thumb: extract when a UI piece has a clear purpose and reuse potential.

  • intermediate
  • By Antoine van der Lee
  • Oct 14

Why Swift Migration Tooling Matters

Use Swift’s migration tooling to adopt upcoming features via Xcode’s 'Upcoming feature' Migrate builds with fix‑its. Enabling nonisolated(nonsending) by default can push work to the main thread—add @concurrent to keep prior behavior. Avoid manual migration.

  • intermediate
  • By Antoine van der Lee
  • Oct 7

The 5 biggest mistakes iOS Developers make with async/await

Highlights 5 common Swift Concurrency mistakes when moving to Swift 6: treating async for-loops as normal, assuming async runs off the main thread, ignoring Task cancellation, risky manual migrations, and spawning tasks in onAppear—leading to UI hangs, dup calls, battery drain.

  • intermediate
  • By Antoine van der Lee
  • Sep 29

Derived Data: 5 Things iOS Developers Do Wrong

Many iOS devs misuse Xcode’s Derived Data. Learn what it stores, open it fast via Settings → Locations, and delete only a project’s folder (not all). Mine Logs/Build for metrics (XCLogParser, RocketSim), compare incremental vs clean builds, and inspect Build/Products .app to prune bloat and speed up teams.

  • intermediate
  • By Antoine van der Lee
  • Sep 23

App Store Optimization: Real-world Best Practices

Real-world ASO for RocketSim: choose relevant keywords, rewrite subtitle, and reorder first screenshots to scan & hook users. Measure impact in App Store Connect via daily averages; focus on App Store Browse, track conversion (not just impressions), and note featuring can skew data.

  • intermediate
  • By Antoine van der Lee
  • Sep 16

Introducing Diagnostics: Improved Debugging and User Support

Diagnostics is an open‑source library adding an in‑app issue reporter that attaches an HTML report with OS/app info, device/storage details, and full session logs with JS filtering. Smart Insights via SmartInsightsProvider detect patterns (e.g., update available, low storage) to speed up support and debugging.

  • beginner
  • By Antoine van der Lee
  • Sep 9

SwiftUI Toggle: A Complete Guide

Hands-on guide to SwiftUI Toggle: bind to a Bool, use custom labels or hide them, and add accessibilityLabel when labels are hidden. Explains .toggleStyle(.switch/.button/.checkbox/.automatic), grouping in Form/Section, and creating computed Binding(get:set:) (e.g., UserDefaults; prefer @AppStorage).

  • intermediate
  • By Antoine van der Lee
  • Aug 31

@ViewBuilder usage explained with code examples

Explains SwiftUI’s @ViewBuilder: why body uses it, how it resolves some View with conditionals, and how to apply it in initializers, properties, and methods. Implements a generic VHStack switching VStack/HStack via horizontalSizeClass. Notes if-conditions can affect performance/animations.

  • intermediate
  • By Antoine van der Lee
  • Aug 25

Swift Computed Property: Code Examples

Guide to Swift computed properties: read-only vs get/set, exposing model data safely, using in extensions, overriding in UIKit (prefersStatusBarHidden, setNeedsStatusBarAppearanceUpdate), and get throws/async. When to prefer methods and store heavy results to avoid repeated work.

  • intermediate
  • By Antoine van der Lee
  • Aug 19

Property Wrappers in Swift explained with code examples

Property Wrappers in Swift extract common logic into reusable wrapper objects, reducing boilerplate code. Introduced in Swift 5, they use @propertyWrapper with wrappedValue property. Examples include UserDefaults handling, projected values for Combine publishers, and debugging wrappers. Key features: custom initializers, optional handling, enclosing instance access, and function parameter usage. However, they face compatibility issues with Swift Concurrency's Sendable requirements in strict mode, making macros a potential alternative for new projects.

  • intermediate
  • By Antoine van der Lee
  • Aug 11

Async await in Swift explained with code examples

Intro to async/await and structured concurrency in Swift: replace completion handlers and Result with linear try/await flows. Shows calling async from sync via Task initializer and @MainActor, Xcode refactors, and bridging with withChecked(Throwing)Continuation. Notes Swift 6/6.2 migration impact.

  • intermediate
  • By Antoine van der Lee
  • Aug 5

Global actor in Swift Concurrency explained with code examples

Explains Swift global actors that provide actor isolation across functions, properties, and types. Shows @MainActor and a custom @globalActor (ImageProcessing with static shared) to serialize work. Advises private init to prevent extra executors. Takeaway: isolate domains safely.

  • intermediate
  • By Antoine van der Lee
  • Jul 28

Combine and Swift Concurrency: A threading risk

Combine + Swift Concurrency can crash under Swift 6.2: NotificationCenter publishers run on the poster’s thread and sink closures lack actor checks. Posting from a detached Task to a @MainActor observer fails. Prefer AsyncSequence notifications or start a Task in sink.

  • intermediate
  • By Antoine van der Lee
  • Jul 21

Threads vs. Tasks in Swift Concurrency

Clarifies Threads vs Tasks in Swift Concurrency: Tasks are scheduled on a cooperative thread pool, have no fixed thread; await suspends and yields. Swift caps threads to ~core count to prevent thread explosion and improve performance vs GCD. Demo with Task, Task.sleep, Thread.current.

  • intermediate
  • By Antoine van der Lee
  • Jul 14

Modern Swift Lock: Mutex & the Synchronization Framework

Introduces the Synchronization framework’s Mutex (iOS 18/macOS 15). Shows withLock for inout mutation, returning values, and throwing. Wrap non‑Sendable types to make enclosing types Sendable. When to use a mutex vs actors for synchronous access. Notes OS availability.

  • beginner
  • By Antoine van der Lee
  • Jul 8

Swift Concurrency & Swift 6 Course (Launch offer)

Flagship course to master Swift Concurrency and migrate to Swift 6’s strict checks. Learn async/await, tasks, Sendable, actors, priority inheritance, threading vs tasks, and how compiler checks prevent data races. Includes step-by-step migration habits, Swift 6.2 updates, and a migration build.