One of the hardest things for me with SwiftUI is that it doesn’t let me be a perfectionist.

I find myself saying “well, that’s going to have to be good enough”.

Happened twice today, and that’s two times too many.

@chockenberry It reminds me of the web, and why I hate making anything for it.
@breadbin @chockenberry use HTML tables. Seems to be what everyone else does
@chockenberry right? It means you either have to trust Apple’s choices to be correct, or work against the framework.

@foon @chockenberry Perfection and correctness are one thing but it denies us to be masterful. The result looks like coming from an apprentice.

Zen Mind, Beginner’s Mind, My Ass.

@chockenberry This is a shame. To extend a cliché: Frameworks should make easy things easy, difficult things possible, and perfection achievable by those who give enough of a damn to try for it.

@chockenberry I feel this way too but I'm starting to wonder if the difference is really that the easy things have gotten easier and not that the hard things have gotten harder.

Like, the janky version is so much jankier that instead of being 4× the work to finish it it's like 10× the work but is the total amount of work in the end any worse when the janky version was 3× faster to build?

@chockenberry This is the exact reason why I switched to Flutter over SwiftUI. You have full control over 100% of the UI in Flutter, whereas I always felt like SwiftUI (and even AppKit) only let me control 85%.

@chockenberry I've found the same thing, and it's a mixed blessing.

It significantly deepens rabbit holes, making it FAR more work than before to actually dive into them to tweak some little thing or make something work "right".

And that increased gap between "leave it alone, it's good enough” and “put in a bunch of work to get it 'right'" also makes me take the latter path far less often.

And that leads to simpler, less-buggy, more-easily-maintained code in the long run!

@marcoarment it's a bit like when you hire a cleaner. You have to divorce yourself from the result to some extent.
@marcoarment I’d bet that how we ended up with the LG Ultra Fine 5k, or Siri, or the developer documentation. “We could put in the effort to make it right… buuuuut it will do.”

@marcoarment @chockenberry even as a junior iOS dev, this is how I feel about SwiftUI. I can build stuff super easily. Which is amazing for a junior. But when I want to tweak it, it’s a dead-end.

But UIKit I found unnecessarily hostile as a junior. It didn’t really make sense to me.

@marcoarment @chockenberry FWIW there’s nothing about the declarative model that makes this inevitable. Flutter exposes far more view lifecycle hooks as well as the layers beneath the declarative API; it’s far rarer to run into a wall where you just can’t do something.

Apple is, as always, very slow to expand the public API of their frameworks.

@jjoelson @marcoarment @chockenberry but Flutter’s goal is “pick a style, then let people customize that style and run it on multiple platforms”. SwiftUI’s is “use whatever style is current and appropriate given the OS”. That’s in keeping with AppKit, which also managed to evolve from NeXT to Aqua (pinstripes!) to Yosemite to Big Sur. A Flutter app run in ten years will still look like it was built in 2023; a SwiftUI one presumably won’t.
@chucker @jjoelson @marcoarment Right. And you don’t fully appreciate this until you’re making an iOS and watchOS app with the exact same View hierarchy.
@chucker @marcoarment @chockenberry Yeah I agree; my point is that is a *choice* that Apple is making with SwiftUI rather than being a fundamental property of the declarative UI paradigm.

@marcoarment Yeah, I’m generally OK with SwiftUI layout defaults (especially when it comes to handling things like dynamic type). It’s faster to build AND maintain.

The issues that kill me are with the layout process. Views not appearing correctly because of bugs: and not being able to know why because the debugging sucks. After hours of struggle you eventually say “fuck it” or pull a feature.

@chockenberry “well hopefully Apple fixes this in iOS 19”
@chockenberry it does really suck to hit a brick wall and have to redo all of it