Malcolm Hall

@malhal
128 Followers
134 Following
295 Posts
iOS developer, traveller, guitarist, home brewer, academic researcher with a Ph.D. in Computer Science from the University of Glasgow. #SwiftUI #SwiftData
Bloghttp://www.malcolmhall.com

Reported a terrible NSViewRepresentable animation bug which probably is why List and Table are so flakey on macOS.

FB22270146

https://github.com/feedback-assistant/reports/issues/776

#SwiftUI

Niki Tonsky (@[email protected])

New blog post! A close look at Tahoe menu icons. With 109 illustrations! https://tonsky.me/blog/tahoe-icons/

Mastodon

idk if i'm the minority in this, but i never liked the "icon for every item in menus"

it's extra noise to me.

Apple always felt like one of the hold outs on this. I could always reference them when I had this design argument.

But now with tahoe, they gave in and I feel increasingly isolated on my island of "exclude icons in context menus"

I also wrote a deep dive on the evolution of the project—from failed KeyPath experiments and memory leak traps to the final "Shadow Storage" design that powers the library today, read it here:

https://www.malcolmhall.com/2026/01/20/the-evolution-of-a-swift-macro-building-swift-streamable-actors/

The Evolution of a Swift Macro: Building Swift Streamable Actors – Malcolm Hall

🚀 I just released Swift Streamable Actors v1.0!

If you’ve ever wanted to observe changes to a Swift Actor's state as an AsyncStream without writing 30 lines of boilerplate for every property, this macro is for you.

Key highlights: ✅ 100% Type-safe (no type-erasure/AnyKeyPath) ✅ Memory safe (static factories avoid strong reference cycles) ✅ Clean API: @Streamable does it all.

Check out the code: https://github.com/malhal/swift-streamable-actors

#SwiftConcurrency #SwiftMacros #OpenSource

GitHub - malhal/swift-streamable-actors: Streamable Actors for Swift

Streamable Actors for Swift. Contribute to malhal/swift-streamable-actors development by creating an account on GitHub.

GitHub

This WWDC 2025 sample is really sad. It uses @State with a class (leaks heap memory) and the class's init is really heavy, creating AV objects.

Also it uses a ViewModel class instead of #SwiftUI @Binding.

The worst thing is it's using @Observable for view data (it's designed for model data) that has a func that has Combine code (pipelines should be in ObservableObject init).

Something has gone badly wrong at Apple that the devs don't know what tools to use for what.

https://developer.apple.com/documentation/AVFoundation/capturing-spatial-audio-in-your-ios-app

Capturing Spatial Audio in your iOS app | Apple Developer Documentation

Enhance your app’s audio recording capabilities by supporting Spatial Audio capture.

Apple Developer Documentation

🗣️ I do enjoy a good rumor, so I'll share this nugget:

I have heard that SwiftUI has been losing political capital, and credibility, internally at Apple because it has repeatedly failed to meet software engineering goals, and needs. It's no longer thought of as clear default choice for new stuff.

That might explain why it was deemphasized at WWDC compared to the past few years.

Comforting that Apple might finally be waking up to the reality of SwiftUI, 6 years in. Glad I waited that one out 😅

Xcode 26.1 beta 3 iOS Simulator is crashing constantly again!

-------------------------------------
Translated Report (Full Report Below)
-------------------------------------
Process: MercuryPosterExtension [31654]
Path: /Volumes/VOLUME/*/MercuryPosterExtension
Identifier: com.apple.MercuryPoster
Version: 1.0 (1)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd_sim [29890]
Coalition: com.

Here's a shocker from Building a workout app for iPhone and iPad https://developer.apple.com/documentation/HealthKit/building-a-workout-app-for-iphone-and-ipad

import Combine

@Observable final class CountDownManager {
var timeRemaining: TimeInterval = 3
var duration: TimeInterval = 3

private let timerFinishedSubject = PassthroughSubject<Void, Never>()
var timerFinished: AnyPublisher<Void, Never> {
timerFinishedSubject.eraseToAnyPublisher()
}

And the usual heap leak:
@State private var manager = CountDownManager()

#SwiftUI

Building a workout app for iPhone and iPad | Apple Developer Documentation

Start a workout in iOS, control it from the Lock Screen with App Intents, and present the workout status with Live Activities.

Apple Developer Documentation

I updated this post with a trick to still make $ work:

struct ChildView: View {
@Environment(\.appStorageToggle) var _isOn

var body: some View {
@Binding(projectedValue: _isOn) var isOn

Toggle("Toggle", isOn: $isOn)