Matt Gallagher

@cocoawithlove
752 Followers
85 Following
318 Posts

If you want a roundtable panel discussion from some of the SwiftUI folks, talking about the history, recommendations, problems, Liquid Glass, generative AI, (how to pronounce 'detent'), etc, there's 30 mins of it here at the end of this new Meet with Apple session

https://www.youtube.com/watch?v=Z3vloOtZLkQ

SwiftUI foundations: Build great apps with SwiftUI | Meet with Apple

YouTube

Further testing with Xcode 26.3's MCP tools reveals:

1. They don't work with OpenCode (schema versus structureContent mismatch)
2. Is insanely irritating in the Claude desktop app (which constantly restarts the connection, causing Xcode to block waiting for authorisation again)
3. Is easy to get a mismatch between "navigator paths" and "disk paths" if your project structure doesn't literally match disk structure
4. The tabIdentifier parameter confuses LLMs and they usually get it wrong

@qnoid @stroughtonsmith Reactive programming (Combine) is for handling async observing, events and processing over streams of async values over time. Swift Observations, basic closures and AsyncSequence are pretty good matches for each of these. The expression is somewhat different — which is where swift-async-algorithms would bridge the gap if it were more fleshed out.

Xcode 26.3's new MCP integrations do seem to be a nice improvement for agents making traversal and building cleaner.

But XcodeUpdate tool makes diffs illegible when called from a CLI and I had to add a note to avoid it.

And GetTestList – which offers no filtering options – overflows the LLM's file limit with just 100 tests, forcing the LLM to write the output to a file and slowly walk through while looking for a single test, just so it can then use RunSomeTests. Definitely needs improvement.

@stroughtonsmith I think this has been obvious for a few years now. Combine really only got about 18 months of updates and has been in maintenance mode ever since.

I think this is mostly a good thing. Swift async is almost always easier to read, write and debug.

But core features like Observations being tied to OS 26 or later and the swift-async-algorithms library moving incredibly slowly do make it hard to fully replace Combine.

It claims to work with GPT Codex (although I can only find Codex 5.1 in the built-in model list right now).

Generally, OpenCode looks like it's copying the Codex agent (similar commands, at least). But for me the fun is in local models and some oddball new models and OpenCode seems to be the best way for these.

Still experimenting and hasn't been flawless (agents attempting commands that don't exist plus local models get themselves in quagmires all the time).

Thanks to those who suggested my particular preferences might be best aligned with OpenCode; it is the nicest environment I've tried so far.

I still find writing text prompts stressful (not sure why that would be unexpected from a career programmer) and I keep killing agents when I don't like the direction they start in. I think I really just prefer to draw the first couple circles before prompting to fill in the rest of the owl.

My blog article last week has had some of the most negative feedback of anything I've ever published. So many people emailing me to call me out for insulting AI. I'm not sure you need to defend AI, I hear it's doing fine.

But also, I gave all the major models 7/10 or better and said they're much better than last year. That's not a hit piece, calm down.

"Trimming" indentation from blank lines is the most widespread Swift formatting rule that I hate. All lines in a scope should be indented. Excepting blank lines creates hassle.

It's annoying to correct when adding new content, Xcode's "Trim-whitespace only lines" fails constantly so your linter's going to bug you, and it's visually annoying when "Invisibles" are on and you can see that your scopes are cut to shreds.

Regular hassle for zero benefit? Can't even turn it off in swift-format. Yuck.

@dandylyons @mattiem @steipete Haha! I get "skill issue" from my kids so often the words have lost all meaning 😆