[HN Gopher] SwiftUI in 2022
       ___________________________________________________________________
        
       SwiftUI in 2022
        
       Author : mpweiher
       Score  : 270 points
       Date   : 2022-05-25 13:39 UTC (9 hours ago)
        
 (HTM) web link (mjtsai.com)
 (TXT) w3m dump (mjtsai.com)
        
       | tikimcfee wrote:
       | $0.02 on this is that I see a great many people doing the typical
       | "all or nothing" with SwiftUI. I think this is a mistake. Like
       | every single other engineering tool in existence, this one has
       | costs and benefits.
       | 
       | For the people saying it doesn't work: use UIKit for those
       | pieces.
       | 
       | Otherwise, use it where it makes sense, and no more. I see this
       | in Compose in Android too - lots of devs doing wholesale
       | refactoring to replace components. Bad move.
       | 
       | SwiftUI is powerful and offers a new way of defining the
       | interface that is focused on the expressiveness it offers to
       | devs. UIKit is just a modified version of that trade off : it
       | offers less expressiveness for more power and sometimes
       | correctness.
       | 
       | Mix your poisons, don't pick them.
        
         | tarentel wrote:
         | I think trying to re-tool an existing app to be swiftui is a
         | mistake. Replace swiftui with anything and it's a mistake. But
         | swiftui is marketed as a replacement for UIKit and it doesn't
         | seem to work. If I was starting a new app it still seems like a
         | bad idea. Every attempt my team has made to make even small
         | components in swiftui has been a disaster.
        
         | tolmasky wrote:
         | I think this hides the actual pitfalls: it is possible to be
         | lulled into thinking SwiftUI is the right tool, only to
         | discover that a minor UI change is impossible, leaving you with
         | little option than to dump it entirely for the component in
         | question and rewrite it from scratch in UIKit or AppKit. It is
         | a truism that you should "choose the best tool for the job".
         | Yes, of course. You definitely shouldn't choose the worse tool
         | for the job after all. The tricky bit has always been in
         | determining _which tool is best for the job_. Once upon a time
         | the answer was easy, there was only one tool, and critically,
         | it was the tool Apple themselves dogfooded for their own stuff,
         | so it was usually at least _capable_ of doing most things. In
         | the age of AppKit /SwiftUI/Catalyst, this is a significantly
         | more difficult question, and this is ignoring things like
         | Electron, etc. The problem with SwiftUi is precisely that if
         | often feels like you only know if it was the best tool for the
         | job _after the fact_. It requires being an expert in it before
         | you can predict its limitations (which often are bug-related
         | and not necessarily  "conceptual"). This would maybe be
         | excusable for a beta release, but SwiftUI is now around 4 years
         | old.
         | 
         | Arguably, its original sin is simply not being open source, and
         | on top of that is trapped behind one of the most opaque bug-
         | reporting mechanisms in the industry. Every minor hack involves
         | tremendous reverse-engineering, which may then have to be
         | replicated throughout the community, instead of being a GitHub
         | issue and PR request like in Electron for example. There are of
         | course upsides to the closed-source model, but in 2022, you
         | have to _deliver_ on those upsides if you want to make a strong
         | case for your framework. But as I 've mentioned above, SwiftUI
         | hasn't. It has none of the aura or magic of AppKit from the
         | 2000's: a framework _used by amazing apps at Apple_ that can
         | get just about anything done. In fact it is the poster child of
         | all the downsides of this model.
         | 
         | And this doesn't even touch on the fact that Apple seems to
         | repeatedly demonstrate that they don't take these technologies
         | very seriously:https://twitter.com/stroughtonsmith/status/15294
         | 383578346332...
        
         | ragnese wrote:
         | To be fair, though, I feel like the difference between SwiftUI
         | and UIKit or XIB is much bigger than the difference between
         | UIKit and XIB.
         | 
         | I don't have much practice with SwiftUI since I have to support
         | some older iOS devices, but how awkward is it to do navigation
         | between screens implementing with SwiftUI Views and those using
         | UIViewController and friends? How does UINavigationController
         | work into all of that?
        
           | jshier wrote:
           | XIB? xib files are used in UIKit apps, alongside storyboards,
           | but they're simply serialized views, not a different
           | architecture or paradigm.
        
             | ragnese wrote:
             | Yeah, sorry. I wasn't being precise. When I say "UIKit" I
             | mean what iOS devs usually refer to as "programmatic views"
             | where you do all the UI stuff in Swift code files rather
             | than the UI Builder and Storyboard tools that Xcode offers.
             | 
             | I'm sure SwiftUI is UIKit underneath, too, for what it's
             | worth.
        
           | happytoexplain wrote:
           | If you use SwiftUI at all, the app has to start with the
           | SwiftUI lifecycle (Edit: May not be true, see replies). But
           | then you can wrap any UIView or UIViewController in a SwiftUI
           | wrapper (UIViewRepresentable and
           | UIViewControllerRepresentable). So that view/controller will
           | be presented by SwiftUI's navigation logic, but inside that
           | view/controller, you can write a whole UIKit app if you want.
        
             | ragnese wrote:
             | Cool. Thank you for that. I've got through the SwiftUI
             | tutorials and stuff, but I've never tried to make a real
             | project that mixed both approaches, so I had no idea about
             | UIViewRepresentable, etc.
             | 
             | I think that adds to my point that SwiftUI isn't something
             | that's very amenable to "just use it where it's
             | appropriate", or "gradually try it out by migrating a small
             | part of your project", etc. It sounds like you have to
             | commit to "this is a SwiftUI app now, and we can integrate
             | with old stuff if/where/when we need to".
        
               | Willamin wrote:
               | You can absolutely slowly migrate a UIKit project to
               | begin using SwiftUI - it's part of what I've been doing
               | at work for the past 8 months.
               | 
               | The way to cross the boundary from UIKit to SwiftUI or
               | SwiftUI to UIKit (either direction) involves implementing
               | one or maybe two classes/structs and is not too difficult
               | to do.
        
               | ragnese wrote:
               | Fair enough. I saw your reply to the grandfather comment
               | and I asked some follow up questions there. Thank you. :)
        
             | Willamin wrote:
             | Part of that is untrue. You can add SwiftUI to an app that
             | starts with the UIKit lifecycle.
             | 
             | In fact, you can jump back and forth between UIKit and
             | SwiftUI as many times as you like throughout your app's
             | view hierarchy.
             | 
             | The current project I'm working on involves slowly porting
             | an older UIKit+Storyboard app over to SwiftUI, so I'm
             | seeing this in practice every day.
        
               | happytoexplain wrote:
               | Thanks, I didn't know that!
        
               | ragnese wrote:
               | What's involved in the "jumping back and forth"? Is it
               | pretty cumbersome or no? Do you use a
               | UINavigationController at all in your app, or do your
               | UIViewControllers do all of the navigating/presenting
               | themselves?
        
               | Willamin wrote:
               | We do use UINagivationController in our app, so that's no
               | issue.
               | 
               | Crossing the boundary from UIKit to SwiftUI involves
               | instantiating the SwiftUIView, handing that over to a
               | UIHostingController, then presenting that controller.
               | Something like this:                 let myView =
               | MySwiftUIView()       let hostingVC =
               | UIHostingController(rootView: myView)
               | navigationController.present(hostingVC, animated: true)
               | 
               | Crossing the boundary from SwiftUI to UIKit is slightly
               | more boilerplate to write, but it's not too bad. You have
               | to implement either a UIViewControllerRepresentable or a
               | UIViewRepresentable (depends on your needs). Those
               | protocols only needs two functions defined:
               | makeUIView/makeUIViewController and
               | updateUIView/updateUIViewController. For the simplest
               | views and view controllers, you can leave the update
               | definitions empty.
        
         | xbar wrote:
         | This is good advice that I should follow more.
         | 
         | But it doesn't address the part where devs find SwiftUI buggy
         | and non-functional where there is a promise of functionality.
        
         | zerkten wrote:
         | When you support a range of tools, or introduce a new one, you
         | often do it to support different audiences. I'm not an iOS dev.
         | Is it a case that SwiftUI is really intended for a different
         | audience and set of use cases with no expectation of a 100%
         | overlap with the UIKit use cases?
        
           | tarentel wrote:
           | It's marketed as a complete replacement of UIKit.
        
             | aaaaaaaaaaab wrote:
             | Trust me, noone at Apple believes that. Not even the
             | SwiftUI team.
        
               | zerkten wrote:
               | What do the folks in the know believe it is?
        
               | aaaaaaaaaaab wrote:
               | Mostly a shiny tool to lure in beginners and web
               | developers.
               | 
               | Kind of like Duplo vs Lego.
        
       | LeicaLatte wrote:
       | If your devs say they are faster with SwiftUI, your app is
       | probably dumber than you are willing to accept.
       | 
       | I have been writing ObjC, Swift for 7 good years. Me or my team
       | will never write anything important in SwiftUI until Apple starts
       | to adopt it non trivially. Blogs, Twitter threads != production
       | code. Teams hate workaround driven development.
        
       | tarentel wrote:
       | Is anyone using this really? My team is pretty excited about
       | using it but I've been a little more hesitant mostly because I've
       | not read of anyone using it at any sort of scale with success.
       | Even for smaller project it still doesn't seem production ready.
        
         | Willamin wrote:
         | I'm using SwiftUI extensively when I get the opportunity. The
         | team that I'm on has decided to shift our UIKit+Storyboards app
         | towards leveraging SwiftUI more. It won't work for 100% of the
         | app, but that's alright because there are easy-to-implement
         | escape hatches back into UIKit.
         | 
         | The worst part of the dev experience is that we are currently
         | supporting back to iOS 13 (which is when SwiftUI was
         | introduced). That means we can only really use the oldest
         | SwiftUI components and modifiers; it's not too bad, but finding
         | usable examples online is tricky sometimes (they often assume
         | the latest).
        
         | emehex wrote:
         | I just finished a contract on an app with 400K users.
         | 
         | It was in pretty bad shape when I got my hands on it. Last
         | update: February 2020. Targeting iOS 11+, mostly UIKit, powered
         | by Cocoapods with 25 dependencies, and 1.3M LOC.
         | 
         | It took me 3 months to rewrite everything from scratch in
         | SwiftUI, with 100% feature parity. Of the ~20 different
         | view/components that I had to write, just one required me to
         | dip into UIKit (with UIViewRepresentable to bridge).
         | 
         | Now the app is iOS 14+, 5 dependencies (all managed with Swift
         | Package Manager) and 6.5K LOC, with 0 crashes in the last
         | month.
         | 
         | SwiftUI is production ready.
        
           | tomovo wrote:
           | Wait, it went from 1.3M LOC to 6.5K? Was the UI layer really
           | that bloated or are you counting the 3rd party dependencies?
           | I envy you the 3 months without adding any "customer value"
           | (not joking, I'd love that).
        
             | emehex wrote:
             | Yeah. 1,300,000 to 6,500 (not counting the dependencies).
             | While the previous devs obviously had programming
             | experience, it was clear they were quite green in
             | Swift/iOS.
             | 
             | Customer value was that the OG app was crashing like 1 in
             | every 6 uses. Updated app was crash free. Plus, added two
             | new features during the rewrite.
        
         | rudedogg wrote:
         | It is frustrating at times, but I like writing UI in code and
         | it increases my productivity quite a bit. I'm using it to build
         | an IDE (https://austinrude.com/devlog/zig-ide-2022-04/).
         | 
         | I don't think I would have attempted a project this large
         | without it. I had to fall back to AppKit/NSViewRepresentable
         | for the tabview, text editor, and a couple other views. There
         | are probably over a hundred SwiftUI views though. And I am
         | hoping I can switch the tabview to SwiftUI after WWDC so it's
         | easier to extend.
         | 
         | About WWDC, I wonder if we'll see a CoreAnimation replacement
         | this year that is exposed to SwiftUI views? I don't know what
         | the implications would be, but it makes sense when you look
         | back at how they've refused to offer/expose the underlying
         | UIKit/AppKit APIs that SwiftUI is wrapping for some controls.
        
       | emehex wrote:
       | I'm an iOS contractor, and do most of my work in SwiftUI. Sure
       | the framework has it's warts, but I honestly love it.
       | 
       | Shameless plug -> I recently open-sourced an app showcasing how
       | to use effectively use SwiftUI + MVVM:
       | https://github.com/maxhumber/BreadBuddy
        
       | alexashka wrote:
       | If you like SwiftUI, I challenge you to a SwiftUI fizzbuzz:
       | 
       | a square, screen width, 10x padding, red background.
       | 
       | inside it, a little square, centered and a little square, top
       | left corner, 10px padding, blue background for both.
       | 
       | Tell me that was easy, so that I know you're lying :)
        
         | saagarjha wrote:
         | How's this? It's not quite "screen width" if you make the
         | screen wider than it is tall, but I could make it stick to that
         | if you really want I guess.                 struct ContentView:
         | View {           var body: some View {               ZStack {
         | Rectangle()                       .fill(Color.red)
         | Rectangle()                       .fill(Color.blue)
         | .frame(width: 100, height: 100)                   HStack {
         | VStack {                           Rectangle()
         | .fill(Color.blue)                               .frame(width:
         | 100, height: 100)                           Spacer()
         | }                       Spacer()                   }
         | .padding(10)               }               .aspectRatio(1,
         | contentMode: .fit)               .padding(10)           }
         | }
        
           | alexashka wrote:
           | Your answer is wrong. You've failed the fizzbuzz :)
        
             | emehex wrote:
             | Perhaps you can post a photo of what you're looking for?
             | Because your instructions aren't super clear :)
        
             | saagarjha wrote:
             | I generally expect interviewers to tell me what the problem
             | is ;)
        
               | alexashka wrote:
               | My apologies, you've successfully passed FizzBuzz, in a
               | rather unwieldy way by relying on nesting vstacks,
               | hstacks and adding spacers.
               | 
               | The larger point being - placing squares on a page went
               | from drag and dropping and setting a few constraints, to
               | now doing zstack/hstack/vstack/spacer wizardry.
        
         | emehex wrote:
         | Took me 5 minutes. Copy and paste this into a playground:
         | https://gist.github.com/maxhumber/1dbdf0d9c4539a8e145b3c630c...
        
           | b3morales wrote:
           | Now please see how it looks on a device:
           | https://postimg.cc/crtKHSTG
        
           | [deleted]
        
           | alexashka wrote:
           | Your answer is wrong. You've failed the fizzbuzz :)
           | 
           | Change frame (screen width) to 300, 500 to see why.
        
             | emehex wrote:
             | Good catch. Fixed with an extra ZStack.
        
               | alexashka wrote:
               | GeometryReader was not part of fizzbuzz. Replace
               | geo.size.width * 0.1 with 10 to see your code break.
               | 
               | Now tell me, _why_ did it break? Do you even know?
               | Because I don 't.
               | 
               | I don't know why half the shit works as it does, and I've
               | written non-trivial SwiftUI code for 6 months. I did not
               | have this problem with UIKit and interface builder.
        
               | emehex wrote:
               | GeometryReader is a pretty critical part of the SwiftUI
               | framework. I'd recommend getting familiar with it!
               | 
               | Saying "you can't use GeometryReader" would be like
               | saying you can't use UIKit's Auto Layout...
        
               | [deleted]
        
       | bze12 wrote:
       | Most of these negative comments are coming from veteran UIKit
       | developers who then tried out SwiftUI. Of course they're only
       | going to notice the things that are overwhelmingly harder
       | compared to UIKit - they have years of bias. Imagine if SwiftUI
       | came out first, then Apple released UIKit. Wouldn't there be
       | another long complaint list from these developers?
       | 
       | I started developing with UIKit for a year, hated it, then
       | switched to SwiftUI and have built multiple apps over the past
       | few years. IMO the "last 10%" bugs are not that big of a
       | detractor compared to the benefits. Of course some of this is my
       | bias; I'm more likely to spend time trying Stack Overflow hacks
       | on SwiftUI bugs when the UIKit solution is better. I have to
       | "work with the grain" sometimes if something just isn't possible
       | in SwiftUI, but I'm fine making that tradeoff. I feel lucky not
       | having the bias of years of UIKit, it's hard to let go of
       | something when you're so used to it. I'm also lucky to not be
       | working on apps with backwards compatibility issues, but I do
       | think SwiftUI is the way to go for new consumer startups.
        
       | makecheck wrote:
       | Lots of great and specific points in these threads, many of which
       | I have personally seen.
       | 
       | SwiftUI was _really_ promising at first, and even fun to use
       | (nothing like ripping out entire UI files or pages of code). Yet,
       | issues were almost immediately apparent.
       | 
       | A major concern is that it seems to take Apple a really long time
       | to address even basic issues, e.g. years go by and things still
       | broken since day 1 are there, while other things are randomly
       | introduced. And of course, "Feedbacks" have the usual dice-roll
       | effect: will you even _get_ a response, much less see any
       | indication that the reported bug will ever be fixed? (Or will
       | Apple just wait 2 years, close your bug as "probably fixed in
       | this OS update, please confirm", and repeat the whole thing?)
       | 
       | And the thing is, this is not hard to believe. If you auto-
       | complete in SwiftUI (what else can you do, there is rarely good
       | documentation?), some of the APIs are truly scary: levels of
       | complexity and variation that really make me wonder if they can
       | _truly_ test, much less _support_ , every variation of every API.
       | I would strongly argue that some things just have _way_ too many
       | options instead of a handful of clear starting points.
       | 
       | SwiftUI also occasionally changes behaviors (e.g. subtle or gross
       | layout differences). Worse, it is easy for Apple to not call any
       | of these changes "breaking" because apparently you are just
       | supposed to let SwiftUI figure out what is needed in any
       | situation. Except that kind of "trust us, we'll come up with
       | something" approach is not great for writing stable production
       | software.
       | 
       | The auto-generated hierarchies can do truly weird things. For
       | example I realized at one point that an "auto-saved" window
       | layout auto-generated preference names based not on a simple
       | string but _the entire SwiftUI view hierarchy_ , which was _huge_
       | and indecipherable and of course would become a _different_ value
       | if _any_ part of the window or view hierarchy was modified. So I
       | discovered I had dozens of preference settings scattered
       | throughout my defaults, 99% of which were completely obsolete
       | because they were based on previous incarnations of the view I
       | was developing, _and_ they all had names that were almost
       | impossible to type (so how do I delete them while preserving the
       | rest?). What do you even do with that?
       | 
       | Yet _another_ major concern is that SwiftUI is very dependent on
       | Combine which is not _necessarily_ the future given other
       | developments in the Swift language. So what if they just decide
       | to, say, deprecate Combine and move further toward actors and
       | async APIs? How much of SwiftUI might just fundamentally change
       | in, say, WWDC this year, completely invalidating years of effort
       | people have put into it?
        
         | Willamin wrote:
         | > deprecate Combine and move further toward actors and async
         | APIs
         | 
         | Combine is an abstraction to encapsulate changes in state over
         | time, while actors and async APIs are abstractions to
         | encapsulate concurrent behavior. I think these are orthogonal
         | concerns, so they wouldn't likely drop one in favor of the
         | other.
         | 
         | > SwiftUI is very dependent on Combine
         | 
         | As someone who's been writing SwiftUI a lot over the last year
         | or two, I've only touched Combine a few times. Even then, I
         | only tried it because I wanted to see how it compares to
         | RxSwift, not because it was something I needed.
        
           | saagarjha wrote:
           | Yeah I've never used Combine and I've written a decent amount
           | of SwiftUI. My impression is that Swift Concurrency is the
           | future and will slowly get more and more adoption in the
           | APIs.
        
         | kitsunesoba wrote:
         | > Yet another major concern is that SwiftUI is very dependent
         | on Combine which is not necessarily the future given other
         | developments in the Swift language. So what if they just decide
         | to, say, deprecate Combine and move further toward actors and
         | async APIs? How much of SwiftUI might just fundamentally change
         | in, say, WWDC this year, completely invalidating years of
         | effort people have put into it?
         | 
         | If you're talking about Combine vs async/await, I think they'll
         | continue to coexist because they fill different niches. In the
         | UIKit app I'm responsible for I use both -- async/await for
         | things like network calls and Combine for keeping UI state in
         | sync with data.
        
       | Larrikin wrote:
       | My team has two green field apps that we started a few weeks ago.
       | The leads on the iOS team and Android team both spent a week
       | evaluating the new UI systems in each platform, SwiftUI and
       | Jetpack Compose.
       | 
       | The conclusion was that Apple made a huge mistake tying it the
       | iOS version and effectively limiting updates and it's real world
       | use for years at a time.
       | 
       | Both leads liked the design paradigms, but we are only going to
       | use Jetpack Compose since it's made of multiple libraries that
       | are all backwards compatible with our minimum supported version.
       | iOS will stick to UIKit since it works and is backwards
       | compatible
        
         | sethd wrote:
         | > The conclusion was that Apple made a huge mistake tying it
         | the iOS version and effectively limiting updates and it's real
         | world use for years at a time.
         | 
         | Exactly this. SwiftUI on iOS 13.x is practically unusable for
         | anything above simple implementations, with some fairly major
         | bugs that weren't fixed until iOS 14-15. Bugs aside, the lack
         | of StateObject in SwiftUI (iOS) 13.x makes it a non-starter.
        
         | jamil7 wrote:
         | Yeah iOS is one thing as you can generally wait it out as Apple
         | is pretty aggressive about upgrades there but on macOS I think
         | this limitation has really killed it's viability, people just
         | don't update their desktop OS.
        
           | NonNefarious wrote:
           | Not to mention that Apple just orphaned a shitload of
           | perfectly viable computers (first-gen Retina iMacs, for
           | example).
           | 
           | I was also baffled to find that TestFlight can't be installed
           | on pre-Monterey Macs. I mean... WTF? That makes no sense.
           | Sure, we can pass DMGs around, but my company is new to Macs
           | and standardizing our QA team on TestFlight on all devices
           | would've been simple.
        
       | seanalltogether wrote:
       | I really wish Apple had spent more time updating the limitations
       | of UIKit before introducing SwiftUI. Stylesheets are the most
       | obvious piece missing, but even adding a simpler layout model
       | would be a big quality of life improvement. I'm often faced with
       | a storyboard where i have to blow away half the constraints to
       | add in a new feature to the existing layout. On android I've
       | never had to do this.
        
       | bsaul wrote:
       | i don't see how apple think swiftui can compensate for not being
       | cross platform.
       | 
       | At thid point, unless you really need to reach the absolute top
       | of UX, there is no reason not to go for react native, or flutter.
       | 
       | Knowing that videogames are already developped in cross platform
       | tools, it only leave a very very small market IMHO.
       | 
       | I had hopes that swiftui would be cross-platform ( or at least
       | ios + web, since apple don't want to facilitate android
       | adoption), but i don't think it's going to happen now..
        
       | dgellow wrote:
       | I looked a bit of the posts on Twitter, and wow, it's really
       | polarized. People seem to either love it or hate it. Is SwiftUI
       | still that controversial, or is it just an effect of people
       | posting on Twitter?
        
         | ben_w wrote:
         | My experience of SwiftUI is that all of the love _and_ all of
         | the hate is simultaneously correct.
         | 
         | It makes some tasks much much easier, e.g. low vision users
         | really benefit from variable font sizes, which Storyboards can
         | do but it feels unnecessarily hard to do in a non-fragile way.
         | 
         | I can also see the benefits of reactive UI over the Storyboard
         | approach, especially with UICollectionView and UITableView.
         | 
         | But...
         | 
         | The code examples, even from WWDC slides and Apple docs, don't
         | even always compile; the widgets are different enough it's not
         | always clear how to get to the desired UI when you're starting
         | from UIKit, and the integration between UIKit and SwiftUI (in
         | both directions) isn't as easy as I'd like, and you have to
         | keep resuming the canvas view because it's not smart enough to
         | figure out for itself when the code now represents a valid
         | view.
        
           | kitsunesoba wrote:
           | > It makes some tasks much much easier, e.g. low vision users
           | really benefit from variable font sizes, which Storyboards
           | can do but it feels unnecessarily hard to do in a non-fragile
           | way.
           | 
           | Code-only UIKit (no storyboards or XIBs) with autolayout
           | handles this case pretty well in my experience. There's a few
           | gotcha's but no more than with SwiftUI. You mainly just need
           | to remember to use UIFont's preferredFont(forTextStyle:) when
           | setting up labels and controls.
        
         | viktorcode wrote:
         | It's new and requires different mindset than UIKit. Many times
         | I was thinking "it must be broken!" only to find out later that
         | I was doing things wrong. I suspect many posts on Twitter
         | follow the same pattern.
         | 
         | My advise is to try it, and learn along the way. After a while
         | the idea of going back to UIKit will become scary.
        
         | wussboy wrote:
         | It's not just the effect of Twitter. It's the whole point of
         | Twitter.
        
         | [deleted]
        
         | draw_down wrote:
        
         | ragnese wrote:
         | > People seem to either love it or hate it. Or is that just an
         | effect of people posting on Twitter?
         | 
         | I'm sure that a big part of that is the effect of it being
         | Twitter. How often do we feel the urge to post something online
         | that we have no strong feelings about?
         | 
         | More on topic, though: I'm a SwiftUI hater still. It's a cool
         | concept, but there are two big problems with it, IMO:
         | 
         | 1. It's totally out of place with the rest of the Swift
         | programming language. They had to add new crap to the language
         | to accommodate its declarative style, when Swift is (was)
         | unapologetically imperative syntax-wise. It's an obvious bolt-
         | on and leaves a really bad taste in my mouth.
         | 
         | 2. It's still a very leaky abstraction, in that there's still a
         | lot of stuff you have to reach into UIKit for, whether it's for
         | uncommon UI design parts or for performance reasons. As a
         | polyglot dev for my day job, I loathe leaky abstractions. I
         | refuse to learn two "frameworks"/"paradigms"/whatever when I
         | could just use one of them and ignore the other. I feel largely
         | the same way about ORMs: it's guaranteed that I'm going to have
         | to be considerate of the generated SQL queries regardless, so
         | why do I have to be an expert at SQL _and_ whatever complexity
         | is in the ORM around caching, flushing, transactions, default
         | values, etc? Ain 't nobody got time for that.
        
           | throwaway1777 wrote:
           | Not to be super rude, but why are you a polyglot dev if you
           | don't like learning multiple frameworks?
        
             | ragnese wrote:
             | I don't find that to be a rude question at all.
             | 
             | I love being a polyglot dev and I love learning and using
             | different programming languages, frameworks, and app
             | platforms. The issue I have is with learning _redundant_
             | frameworks that don 't actually give me more power.
             | 
             | To continue berating ORMs, I am in charge of several
             | different projects at work that communicate with SQL
             | databases. The set of programming languages that span these
             | projects is: Kotlin, PHP, Rust, and JavaScript (being
             | phased out). I love getting to switch between these
             | languages (just not _too_ frequently, lest the context
             | switching kills my brain), and I feel like it helps me to
             | see the strengths and flaws in each, and it 's just really
             | fun to find effective patterns in each.
             | 
             | Whether I use an ORM in all or none of those projects, I'm
             | going to have to be competent with SQL. But if I decided to
             | use an ORM for all four, I'd have to learn _five_ different
             | ways to get data in and out of our databases. Rather than
             | learning four redundant, _incomplete_ , data retrieval
             | "languages" that sit on top of SQL, I rather learn...
             | almost anything else.
             | 
             | I have used lots of ORMs: The Symfony one for PHP whose
             | name I can't recall, Magento's weird one for PHP, Hibernate
             | (Java), Sequelize (JavaScript), and a few others in other
             | languages. They all have subtle issues. And they _are_
             | "issues" and not just different design choices- I'll never
             | _ever_ accept that Hibernate /JPA/JDBC returning a `(int)
             | 0` when it encounters a null result from a nullable integer
             | SQL value is anything short of lunacy when Java has a
             | native null value. And they all have stupid things like
             | that. Learning those gotchas, bugs, abstraction leaks,
             | performance problems, etc, is not the fun kind of learning
             | for me- it's just tedious and frustrating.
             | 
             | So, to bring it back to SwiftUI, I love that I manage an
             | iOS app. I like learning about how iOS works, and I like
             | working with Swift. It's still required that we know how to
             | use UIKit APIs for non-trivial stuff, so why would I learn
             | SwiftUI (and its problems and gotchas) so that I can do 75%
             | of my work with SwiftUI and 25% with UIKit APIs? It's
             | possible that it would make me an even better iOS dev, but
             | I doubt it (at this point). I think my time is better spent
             | learning something that will allow me to accomplish tasks
             | with computers that I don't already know how to do.
        
       | draw_down wrote:
       | > Conundrum: do I spend the hours required to try different
       | combinations of SwiftUI modifiers to hopefully find a fix for
       | this layout issue, with potential of it breaking again in the
       | future, or do I spend same hours porting to UIKit knowing I'll
       | likely never have to touch it again
       | 
       | Absolute no-brainer if you ask me. Set it and forget it. Use the
       | cool stuff when it works, let others beta test.
        
       | jmull wrote:
       | This has pretty much been my experience:
       | 
       | > "Hey I got 90% of what I wanted really quick! Neat!" "...oh
       | turns out that last 10% is basically impossible, eh?"
       | 
       | (Not impossible, but it's like transitioning from a pleasant
       | stroll on a comfortable downhill trail to slogging through mud,
       | and dense brush, with mosquitos and biting flys everywhere.)
        
       | czhu12 wrote:
       | Genuine question: is there still a good reason to build CRUD type
       | apps in Kotlin / Swift in 2022 with stuff like React Native and
       | Flutter out there?
       | 
       | Not talking about award winning, unique apps that may require
       | more device specific capabilities, rather the 90% of apps out
       | there that just want to offer users an easier way to CRUD into a
       | database.
        
         | topspin wrote:
         | Another genuine question: is there a good reason to use a
         | closed source UI framework in 2022? Given the number of high
         | quality, cross platform UI frameworks available today this
         | should be a consideration.
         | 
         | Inevitably, while developing a UI, I find it necessary to
         | investigate some part of the framework implementation. This is
         | impossible with a closed source framework. Indeed, many of the
         | complaints that appear on this site seem like exactly the sort
         | of mysterious behavior one faces and might be resolved with
         | access to the source.
         | 
         | SwiftUI is closed source, correct? I made an effort to discover
         | the source and it doesn't appear to be available.
        
       | JohnDeHope wrote:
       | I've written architecture astronaut code of my own, so I saw this
       | coming. Swift the language, and SwiftUI the gui toolkit, have a
       | classic over-engineered magnum opus style to them. The generality
       | and generic-ness just leak out all over the place. I also saw a
       | bit of this early on in Dart and Flutter. From what I can tell
       | they seem to have charted a better course and avoided getting
       | stuck too deeply in their own perfection vision.
        
         | [deleted]
        
       | dep_b wrote:
       | I just delivered a medium complexity CRUD driven module using
       | SwiftUI for a very large application.
       | 
       | Worked perfect for me, besides issues around navigation,
       | especially showing alerts. Would use SwiftUI screens using UIKit
       | navigation next time.
       | 
       | Also more complex scenarios that sing combine can get a bit more
       | hairy. The most important issue is that all changes are emitted
       | at didSet so the new value is not known anywhere outside of the
       | closure.
        
       | akmarinov wrote:
       | Has anyone gotten SwiftUI previews to work at all with a project
       | that has more than 20 files or some dependencies?
       | 
       | My project utilizes Firebase as the backend and as soon as you
       | add that dependency - SwiftUI previews never compile, due to
       | build time outs.
        
         | mamcx wrote:
         | > Has anyone gotten SwiftUI previews to work ... has more than
         | _1_
         | 
         | Not JetPack or SwiftUI works for even a simple view!. Is
         | _incredible slow_ and still not true to how it will show up!
         | 
         | I miss the way Delphi do it...
        
         | tarentel wrote:
         | Nope. We have a fairly complicated project, 20+ frameworks, the
         | preview feature doesn't work. We're not using firebase either.
        
         | bryansum wrote:
         | Yes, I recently built an entire app with 70+ frameworks that
         | works fine in Previews. The key is to isolate dependencies into
         | their own modules, and also split those into interface / live
         | implementation modules if needed if the live impl causes
         | preview crashes. See
         | https://www.pointfree.co/episodes/ep171-modularization-part-...
        
         | emehex wrote:
         | Are you using MVVM and mocking out your ViewModels?
        
         | gh123man wrote:
         | You are probably pulling firebase into your preview code
         | somewhere. You should structure your previews to depend on mock
         | implementations of your model (or mock data). It will make the
         | previews much faster and more reliable.
         | 
         | My app also uses firebase and SwiftUI with hundreds of files
         | (views, view models, and more) with no problems.
        
           | emllnd wrote:
           | +1 on this
           | 
           | Got working SwiftUI previews on a 50-100k LOC project with
           | many big libs as dependencies, must be hundreds of files but
           | havent counted. SwiftUI code is gaining share of the total UI
           | code, probably around 20-30% now
           | 
           | Mock data is a must.
           | 
           | Need to be mindful of the preview build (+ preview simulator
           | startup) time too, sometimes it will timeout but just
           | building again (now warmer) will make it work
           | 
           | Had some initial issues around processor arch (Intel vs
           | M1/arm), think I'm still running XCode under rosetta
           | otherwise it wouldnt work.
        
       | ChrisMarshallNY wrote:
       | I'm really looking forward to what comes of it, but I have chosen
       | to do my current major project in UIKit.
       | 
       | A couple of reasons:
       | 
       | 1) The documentation for SwiftUI, when I started (about two years
       | ago) was _awful_. I was shocked at how bad it was. I believe that
       | it has since improved.
       | 
       | 2) I knew of no major apps (even Apple ones) that had been done
       | with it.
       | 
       | I already knew that UIKit was up to the task, and held my nose,
       | while I set things up. It's working out extremely well, but (of
       | course) I'd like to rewrite the whole thing (a sure sign that I'm
       | approaching ship).
       | 
       | I like things like the MVVM pattern, but it's been my experience
       | that it's really not such a good idea to implement it in UIKit,
       | because UIKit was designed explicitly for MVC. I have learned
       | that those ugly-ass UIViewControllers are really important, and I
       | circumvent them at my peril.
       | 
       | I'm able to release fairly basic Apple apps in UIKit, in just
       | hours, so speed of development isn't compelling.
       | 
       | What is compelling, is the ability to design a reactive system
       | for a complex app (like the one I'm writing now). AppKit has
       | allowed this for some time, and it's possible to force UIKit to
       | do it (but it isn't really designed for that).
       | 
       | I really wish that SwiftUI had been a bit more mature, when I
       | started this system, but I would have also needed to rewrite the
       | two server SDKs I use, anyway. It wouldn't have worked, no matter
       | how hard I bang my heels together.
       | 
       | But I'm looking forward to it.
       | 
       | One thing that I've learned, is that it's really OK to wait for
       | things to mature. Companies always screech about how we need to
       | jump on the bandwagon, but that's all hype. I have taken OpenDoc
       | courses at Apple DU. I also busted my ass, getting my app ready
       | for Copland. I have _scars_ from Apple hype.
       | 
       | I did take a big chance, by jumping directly into Swift, but that
       | has turned out to be a good decision.
        
         | JamesSwift wrote:
         | > I like things like the MVVM pattern, but it's been my
         | experience that it's really not such a good idea to implement
         | it in UIKit, because UIKit was designed explicitly for MVC. I
         | have learned that those ugly-ass UIViewControllers are really
         | important, and I circumvent them at my peril.
         | 
         | I dont understand this. MVVM is an extremely abstract pattern.
         | It transcends the technology stack. How it is implemented on
         | the platform differs, and yes you are not going to avoid the
         | UIViewController when doing it on iOS. But you are still doing
         | MVVM even if your V is actually a UIViewController.
         | 
         | I use MVVM almost exclusively now, and I usually do it in a
         | cross-platform framework (Xamarin/MAUI). The codebase is
         | portable across both iOS and Android with no re-architecting of
         | the high-level architecture pattern.
        
           | ChrisMarshallNY wrote:
           | I liked the "cut with the grain" comment, someone made
           | earlier.
           | 
           | The UIViewController _must_ be present in a UIKit app. Most
           | classic UIKit apps have the lions ' share of code in
           | UIViewControllers.
           | 
           | It's entirely possible to basically use a "skeletal" one, and
           | have the main code in the linkages between the Model and the
           | View, but that makes the Storyboard Editor useless.
           | 
           | I use the Storyboard Editor _a lot_. It is not my favorite
           | editor, but it allows me to work incredibly quickly, and to
           | make a really reflowable UI.
           | 
           | I know that the app I'm working on now, is larger than any
           | I've seen from SwiftUI (around 40 screens, and communicating
           | with three servers in realtime, using a couple of SDKs). I am
           | able to make it all work.
           | 
           | I feel as if MVVM would make the parts of the app that link
           | the UI to the servers a _lot_ more graceful (it 's a nasty
           | state engine, right now -ick). I feel as if this kind of app
           | is the kind of thing they had in mind, with SwiftUI.
           | 
           | I do know that it's really important to derive subclasses,
           | and extend ObjC classes, when using UIKit/AppKit/WatchKit,
           | and I feel sorry for folks that avoid inheritance like the
           | plague. It must be a fair bit of work. Looks like SwiftUI
           | doesn't really need that at all, but I haven't spent enough
           | time with it, yet, to know for sure.
           | 
           | I have no doubt that I'll end up mastering it. I'm a quick
           | study. I've spent 35 years, surfing the tech wave.
        
         | cageface wrote:
         | Yeah UIKit is deeply MVC. It may not be the most conceptually
         | elegant but in my experience you're almost always better off
         | cutting with the grain of the underlying platform's
         | abstractions instead of trying to superimpose a new leaky
         | abstraction on top of them.
         | 
         | I worked on one large iOS codebase that went all in on the
         | VIPER architecture and it was one of the most unweildy and
         | baroque codebases I've ever had the misfortune to work in.
        
           | bsaul wrote:
           | i've been developping for 20 years, and 10 years on iOS as a
           | freelance.
           | 
           | I've seen all the horrors, and i can now safely claim that
           | all the problems i've seen on iOS development come from not
           | designing the model layer properly in their MVC app. Because
           | most developers start by coding UIs and later end up
           | wondering where to put that business logic and make it
           | reusable.
           | 
           | And now every time i see another pattern that claim to
           | facilitate refreshing the UI upon model change ( and vice
           | versa), i know it's going to be a failure.
        
           | jkubicek wrote:
           | > better off cutting with the grain of the underlying
           | platform's abstractions
           | 
           | That's a great little turn-of-phrase that I plan on stealing
           | in the future. Apple's APIs will absolutely reward you for
           | taking the time to step back, figure out how Apple _wants_
           | you to use them, and try your hardest to use them in that
           | way.
           | 
           | An example from the olden days of iOS development: many of
           | the apps I worked on went out of their way to avoid
           | subclassing UIView, filling their view controllers with
           | layout and interface updates that would have made much more
           | sense in a view. If only they had read all the docs for
           | UIView would they know that doing something like subclassing
           | a button and tweaking a few methods would have done exactly
           | what they wanted with a minimal amount of work.
        
           | ChrisMarshallNY wrote:
           | _> the VIPER architecture_
           | 
           |  _< Takes out a foil blanket. Hands you a flask.  >_
        
             | emehex wrote:
             | VIPER is horrific at scale. Don't. Just don't.
        
           | quux wrote:
           | Could be worse, they could have adopted RIBs
           | 
           | https://github.com/uber/RIBs
        
             | throwaway1777 wrote:
             | Or ComponentKit
        
             | nyanpasu64 wrote:
             | One recurring issue I see on native Android navigation is,
             | when you open an image in a file manager, switch back to
             | the file manager and open a second image in the same
             | viewer, sometimes pressing Back takes you to the first
             | image. As a specific example, in Foxy Droid, if you
             | download 3 apps in the background, get 3 "app downloaded"
             | notifications, and click each one in sequence, you have to
             | press Back 3 times to get back to Foxy Droid's home screen.
             | What's the best way to avoid this issue without
             | reimplementing your own navigation system replacing
             | activities?
        
               | tadfisher wrote:
               | Basically, don't use Intent flags you don't need to use.
               | FLAG_ACTIVITY_NEW_TASK will launch the external activity
               | in its own back stack according to its `launchMode`
               | rules. If you just launch the Intent with no flags, the
               | default behavior is to add the activity to your own task,
               | which is usually what you want.
               | 
               | The other half of the equation is: don't override Back
               | behavior unless you "own" the current task (it's rooted
               | at one of your activities). When handling "Up" navigation
               | and deep-links, you want Back to behave like "Up" and go
               | to the logical parent of the current screen. When being
               | launched in someone else's task, "Up" should launch a new
               | task at the logical parent and "Back" should perform the
               | default behavior (usually, Activity.finish()).
        
           | tarentel wrote:
           | I apologize to the people who bought into this pattern but
           | what was anyone thinking? Just reading through how it was
           | supposed to be done set off so many red flags I never even
           | considered it. There is so much useless abstraction it makes
           | no sense.
        
             | ChrisMarshallNY wrote:
             | I think it was designed to break up app development into
             | large, relatively unskilled, teams. The traditional UIKit
             | model (and, I suspect, the SwiftUI model) is for small
             | (maybe single IC), skilled, teams.
        
             | cokeandpepsi wrote:
             | It's sometimes impossible to fight the architecture
             | astronauts, they can be deeply appalled at how software
             | maps to their thinking and wish to bend it towards nonsense
             | until it does
        
         | madeofpalk wrote:
         | > 2) I knew of no major apps (even Apple ones) that had been
         | done with it.
         | 
         | Probably not 'major' as in 'complex', but I believed the Apple
         | Pay sheet is now Swift UI
        
           | ChrisMarshallNY wrote:
           | I think that most of the smaller Apple apps are now SwiftUI
           | (and Catalyst).
           | 
           | But the app I'm writing is a good deal more complex than most
           | of the utility apps, and I seriously doubt that the complex
           | apps are SwiftUI. I would not be surprised if many of them
           | are still ObjC.
        
         | tarentel wrote:
         | > I like things like the MVVM pattern, but it's been my
         | experience that it's really not such a good idea to implement
         | it in UIKit, because UIKit was designed explicitly for MVC. I
         | have learned that those ugly-ass UIViewControllers are really
         | important, and I circumvent them at my peril.
         | 
         | I agree with everything you've said but this. I've worked on 3
         | very large app, one which is 85% using mvvm, the two others
         | were still in experimentation phases with it and I am not sure
         | where they've ended up. It's been a joy. The app is designed in
         | a very reactive way and the data flow paths are very clearly
         | defined and easy to follow.
         | 
         | Don't get me wrong the other two apps were heavily MVC with a
         | lot of delegation and that was fine. I could easily switch back
         | to an architecture like that but it's very possible and quite
         | easy to switch over to an mvvm pattern.
        
           | ChrisMarshallNY wrote:
           | I have heard many state that. It has not been my experience.
           | 
           | It may be because I want a "pure" MVVM, and it has to be sort
           | of "impure" to work with UIKit apps. In that case, it just
           | adds more code. I'm a "the best code I write, is the code I
           | don't write" kind of guy.
        
         | kitsunesoba wrote:
         | I've been dabbling in SwiftUI in an existing UIKit app from
         | time to time for a while now and have similar feelings. Even if
         | you get past the lack of docs, SwiftUI is missing just enough
         | bits and pieces to make it a pain. I can usually get things
         | about 90% to where they're supposed to be, and then I rewrite
         | it in UIKit because that's the only way to get the fine details
         | right without convoluted hackery. Lack of backwards
         | compatibility doesn't help here -- several times something I've
         | needed has only been available for iOS 14/15+.
         | 
         | I think it has massive potential regardless, but yes it's going
         | to need some time to fully bake (much as UIKit did).
         | 
         | It's too bad that Cocoa Bindings never found their way from
         | AppKit into UIKit. I understand their exclusion was likely due
         | to CPU power limitations early on, but that hasn't been a
         | problem for many years at this point.
        
       | [deleted]
        
       | catchclose8919 wrote:
       | ...no comparison with Flutter or at least remarks of what would
       | also apply to it?
        
         | frou_dh wrote:
         | Wouldn't be surprised if no one quoted there has ever used
         | Flutter. The Apple dev comment-sphere is quite insular.
        
           | pornel wrote:
           | It's not a surprise there's zero overlap. The type of people
           | who develop native Apple-only apps _really care_ about having
           | proper first-class native UI down to every detail, not merely
           | something close enough. As you can see, for many even Apple
           | 's own SwiftUI isn't "native" enough, so at this level of
           | detail using Google's generic UI framework is completely
           | unthinkable.
           | 
           | For cases where portability or development time is valued
           | more than having perfect Apple-HIG-compliant UI polish, there
           | are lots of better options. Since Apple has flattened their
           | Aqua interface out of existence down to mostly just gray text
           | labels, even Electron apps started looking good-enough.
        
             | hdjjhhvvhga wrote:
             | > there are lots of better options
             | 
             | Could you give some examples? Most people I talked to
             | really hate React Native, for example. Ionic doesn't seem
             | to have gained enough momentum. You mention Electron, but
             | the last time I checked it's only for the desktop, not
             | mobile. Each year new options appear, but I'm not sure they
             | are that great.
        
               | pornel wrote:
               | I had mostly desktops in mind where there are more widget
               | toolkits to choose from. On mobile it's not so great
               | indeed. Cordova is a mobile equivalent of Electron, but
               | often you can get away with your own native app shell +
               | WebView.
        
         | finiteseries wrote:
         | Flutter is almost exclusively used by web developers in my
         | professional and personal experience which is odd considering
         | the lack of JS.
         | 
         | The types of companies that hire iOS developers and build iOS
         | apps also hire android developers and build android apps,
         | again, IME.
        
           | MrDresden wrote:
           | Work for a financial institution which hired iOS and Android
           | developers and had them rewrite everything in Flutter.
        
             | finiteseries wrote:
             | It's the natural move, it's just odd I've mostly seen
             | adoption using web developers so far.
        
       | lonelyasacloud wrote:
       | Lept onto it from React Native when it first came out. Really
       | like the core approach to layout and you get a lot of stuff for
       | very little effort (if you do it Apple's way). Whether it makes
       | sense I think depends on the platforms being targetted.
       | 
       | On recent versions of iOS it's capable of doing 99% of the stuff
       | I'll ever want to do and it will look nice. Just as long as I
       | don't want to step too far outside of what Apple thinks is the
       | right way (tm).
       | 
       | macOS - on the other hand - is far more more buggy/inconsistent
       | e.g. Focus with List's of TextFields. It is also missing a lot
       | pretty basic macOS functionallity e.g. no way to implement drag
       | 'n' drop in Finder'eque recursive outline views, open tabs or
       | windows - in fact window management and routing is just not much
       | fun.
       | 
       | So for iOS I'd not hesitate. It's good, better than React Native
       | and getting better. It does't really feel like a half baked
       | abstraction layer over the top of UIKit.
       | 
       | For macOS on the other hand; it's much less clear. It's missing
       | so much. And then there is the Catalyst auto-translate iOS app's
       | stuff, which is kind of a worry that the grand plan is the moment
       | it's feasible to dump it on macOS, it'll be dumped. So still not
       | sure I'd use it for anything sizeable. Hopefully though will have
       | a clearer picture of Apple's intents for the platform after the
       | next WWDC.
        
       | robert-boehnke wrote:
       | I'm writing a component library[1] on top of SwiftUI and while
       | there are ton of unsolved problems in SwiftUI, the separation of
       | concern allows for much more productive workflows than were ever
       | commonplace in UIKit.
       | 
       | We're dropping into UIKit land quite frequently but for the user
       | of the API, that remains implementation detail and while likely
       | change as SwiftUI advances.
       | 
       | Ironically, a "Stock iOS" style app like Mail or Contacts is much
       | harder to pull off with SwiftUI than an app like AirBnB that
       | brings has its own design aesthetic and establishes its own
       | conventions - cooperating closely with your designers and keeping
       | them aware of what's easy/hard is a much better use of your time
       | than trying to rewrite a pixel perfect `UISearchController`
       | clone.
       | 
       | That said, navigation remains a complete mess and I hope that's a
       | top priority for iOS 16.
       | 
       | [1]: You might find this relevant to your interest if you write
       | SwiftUI for a living: https://movingparts.io/variadic-views-in-
       | swiftui
        
       | PStamatiou wrote:
       | You could write an opposite article featuring people using
       | SwiftUI that have never touched UIKit or iOS code before and it
       | would be nothing but glowing praise.
       | 
       | That's kinda like my story. Covid started and I wanted to learn
       | something new so I started with Swift/SwiftUI. 2 years later I've
       | been doing tons of crazy custom stuff in my portfolio tracker app
       | https://stocketa.com (not launched yet) - I kept a thread with my
       | progress since the first day I started my journey:
       | https://twitter.com/Stammy/status/1527288954935922688 (scroll
       | up).
       | 
       | This was last june but I wrote about my experience with SwiftUI
       | at the time: https://paulstamatiou.com/getting-started-with-
       | swiftui/
        
         | tarentel wrote:
         | It's quite a bit different experience working on an app by
         | yourself and working on an app that has several hundred
         | thousand lines of code that 10+ people are working on
         | simultaneously. I've worked with a bunch of people that are
         | complaining in this and the problems you face are quite a bit
         | different.
         | 
         | Your app looks sharp though I like it.
        
         | lapcat wrote:
         | > You could write an opposite article featuring people using
         | SwiftUI that have never touched UIKit or iOS code before and it
         | would be nothing but glowing praise.
         | 
         | How can one properly evaluate it with no point of comparison?
         | 
         | If you've never tasted chocolate, then vanilla might seem like
         | the greatest flavor ever.
        
           | PStamatiou wrote:
           | The point of comparison is that it has given people the
           | ability to develop their own iOS apps from scratch, when
           | previously they could not as UIKit was too daunting and the
           | tools were not as advanced (live preview with swiftui/etc).
        
             | bowsamic wrote:
             | SwiftUI is not less daunting than UIKit. In fact I would
             | say that the SwiftUI "magic" is far scarier for beginners
             | than IBOutlets and UIViewControllers
        
               | rileyphone wrote:
               | Beginners love magic, it lets them do things they
               | otherwise couldn't do.
        
               | bowsamic wrote:
               | I don't agree, magic is confusing and scary. Especially
               | in SwiftUI where it literally looks like it's invalid
               | syntax if you're used to basic Swift.
        
               | PStamatiou wrote:
               | I watched a youtube video about VStacks and Spacers and I
               | was having fun making real layouts my first hour in -
               | with a fast, live preview environment. That was my "oh
               | wow" moment. What's the equivalent with UIKit? Interface
               | Builder is nothing like what's now possible with SwiftUI.
               | I've tried IB in the past and it was not for me.
        
               | b3morales wrote:
               | > What's the equivalent with UIKit?
               | 
               | UIStackView
               | 
               | > I was having fun making real layouts my first hour in
               | 
               | Good. Now take a pixel-perfect mockup of a new screen
               | from your designer at work and implement that.
        
               | saagarjha wrote:
               | UIStackView is much more boilerplate to use than just a
               | HStack/VStack. And I do a lot of design work in SwiftUI-
               | it's really easy to get stuff on the screen and directly
               | how you want it to look, even for a design mockup. I'll
               | just not hook up interactivity and it works just fine for
               | that kind of storyboarding. If you have a designer that
               | wants you to follow their lead "to the pixel" then
               | they're probably not doing their job of UI design very
               | well-a good process works both ways, where you provide
               | insight into what works well on the platform and they
               | provide their own suggestions until you meet in the
               | middle.
        
               | PStamatiou wrote:
               | > Good. Now take a pixel-perfect mockup of a new screen
               | from your designer at work and implement that.
               | 
               | I'm also a designer and have built many detailed screens
               | with custom components/interactions in SwiftUI.
        
               | tahnhnxfl wrote:
               | I have been watching your progress on Stocketa and as an
               | experienced iOS engineer who uses SwiftUI at work, I have
               | been amazed by the speed with which you were able to
               | build the app. The fact that you were able to ship a real
               | app (with custom graph and polished animations) really
               | speaks to how accessible SwiftUI is to new developers
               | compared to UIKit.
               | 
               | I work for mid size company with a fairly big app with
               | millions of users and we did a complete re-write of the
               | app in SwiftUI and I can say with confidence that once a
               | SwiftUI view layer is built out, building features on top
               | of that is incredibly fast compared to UIKit.
        
             | spike021 wrote:
             | >(live preview with swiftui/etc)
             | 
             | I have a similar experience (started working from scratch
             | on an iPhone app back in January with SwiftUI). Live
             | preview is really awful. I had to basically disable it
             | throughout my project. It'll crash for no reason and
             | require a manual click on a button to reload, errors it
             | spits out tend to be unintelligible, etc. I definitely
             | wouldn't use live preview as an example of SwiftUI being
             | advanced and not being daunting to use.
        
             | [deleted]
        
             | lapcat wrote:
             | Fair enough. In fairness to the blog author, iOS developers
             | with more experience are more likely to be known to him and
             | others.
        
             | b3morales wrote:
             | It may have a easier ramp-up, but it also has a huge cliff
             | at the end of the ramp. Once you step off the happy path
             | you're in for an even more daunting experience than UIKit,
             | because SwiftUI doesn't give you much to get below the
             | magic when you need to. Also, previews are fairly
             | constantly broken in my experience. Interface builder has
             | its problems too, but at least it renders the nib every
             | time.
        
       | [deleted]
        
       | yen223 wrote:
       | I've tried both SwiftUI and Jetpack Compose (the equivalent
       | framework for Android). While conceptually they are very similar
       | frameworks, in practice I found that Jetpack Compose + Kotlin had
       | a far superior development experience than SwiftUI + Swift.
       | 
       | I genuinely cannot think of a single thing that SwiftUI does
       | better than Jetpack Compose.
       | 
       | There are a lot of fundamental design decisions in SwiftUI that
       | are questionable, like their reliance on two-way binding (which
       | makes non-trivial event handling very difficult to implement), or
       | having Views be structures rather than functions (which then
       | necessitated special ForEach views, because you can't use regular
       | control flow mechanisms).
        
         | emehex wrote:
         | You can do control flow on SwiftUI Views? Checkout
         | @ViewBuilder...
        
       | C123Q wrote:
        
         | [deleted]
        
       | ChildOfChaos wrote:
       | I haven't done much programing as a kid and i'm just starting to
       | learn Swift/SwiftUI through the hacking with swift course,
       | interesting to read the comments here as I didn't realize it was
       | so hated?
       | 
       | Seems fine to me for building apps but I don't really know
       | enough.
        
         | jeffreyrogers wrote:
         | SwiftUI is good enough to make apps with. All tools/libraries
         | have problems. You'll advance much faster by learning to work
         | with their limitations than you will be trying to find the
         | perfect framework to use at the start (it doesn't exist
         | anyways).
        
         | dcow wrote:
         | I don't think it's hated.. don't get the wrong idea. You're
         | just reading different anecdotes about how well it's worked for
         | people in various different scenarios. There's no perfect
         | solution.
        
       | allenleein wrote:
       | As a consumer social startup founder, iOS dev. We use 100%
       | SwiftUI in our production app. We absolutely love it. It's way
       | easier to maintain.
       | 
       | App demo: https://www.notion.so/ale0sx/Miurror-
       | Demo-62eaeed2679d4756a0...
        
       | jkirsteins wrote:
       | I recently wrote a full app (Wordle clone) in SwiftUI using the
       | iPad Playgrounds app as a personal challenge. I didn't have a lot
       | of experience with UIKit, and literally 0 with SwiftUI.
       | 
       | There was definitely a lot of time spent looking why basic things
       | are not working as expected. There are many counterintuitive
       | things to it, I think, and some bugs.
       | 
       | But overall, as a newbie to iOS development, it was a fairly nice
       | experience. I am skeptical I could've iterated/developed
       | something complete (despite the issues) as fast with UIKit.
       | 
       | I only wish they made it open source. It feels like it would
       | really benefit from being run more like the open source Swift
       | frameworks, rather than this opaque update-once-a-year thing.
        
       | samirsd wrote:
       | built this https://mixtape.ai entirely in swiftui. some hiccups
       | along the way but overall i don't regret it. the speed of
       | iteration with swiftui is just incredible. you can A/B feature
       | and ui combinations like there's no tomorrow.
        
       | Shadonototra wrote:
       | The complains sounds like people don't like to put the effort
       | 
       | SwiftUI is the best UI/app framework on the market, nothing come
       | close to it
       | 
       | Fun fact, Miguel de Icaza (gnome/mono/MS) fell in love with it
       | 
       | https://twitter.com/migueldeicaza/status/1372551091905236999
        
       | dagmx wrote:
       | I'm confused by this post. Is it just a random smattering of
       | Twitter sentiment collected into one place?
        
         | lapcat wrote:
         | Yes. It's more or less a "link blog" with some commentary and
         | always has been.
        
         | emdowling wrote:
         | You're not wrong; that is the blog's style. I enjoy the format
         | for exposing me to a cross-section of opinions from across the
         | internet, on topics I find interesting, with very little work
         | on my part. That's probably more an indictment on Twitter's
         | product stagnation than a shower of praise on this blog and
         | it's author.
        
           | b3morales wrote:
           | Additionally, it's not always just Twitter: it can be news,
           | or something from another blog as well.
        
       | stasy wrote:
       | From my understanding, you have to use SwiftUI differently than
       | it is eventually intended. First, you build 90% of the app in
       | SwiftUI, then you use UIKit for the other 10% that can't be done
       | in SwiftUI. Eventually you will be able to do everything in
       | SwiftUI, but for now, this strategy works pretty well.
        
       | mark_l_watson wrote:
       | I wrote a simple app last summer using SwiftUI and put it in the
       | AppStore. Fairly easy after taking a short online class.
       | 
       | I agree with many of the negative comments in the article and
       | Apple should get busy resolving issues.
       | 
       | That said, I really like the idea of Swift and SwiftUI and
       | especially Apple's awesome deep learning support in apps.
        
       | gh123man wrote:
       | SwiftUI has been a game changer for me as a solo dev. Sure - you
       | have to make tradeoffs like backwards compatibility, and some
       | strange things are missing/don't work. But - it's been a force
       | multiplier. You can break apart complex views into components by
       | copy/pasting its body into a new `View` struct. It's so much
       | simpler than ripping apart a storyboard into a XIB or fighting
       | with layout constraints. The simplicity lets you try things and
       | fail fast without too much of an investment in design complexity.
       | 
       | I find that I can deliver features and iterate much faster and
       | that makes up for the time I spend fixing edge case bugs or
       | bridging to UIKit when I need an unsupported feature.
        
         | ragnese wrote:
         | I hear you, even though I've chosen to just deal with fighting
         | the layout constraints. For what it's worth, I just use a
         | zillion nested UIStackViews when I'm in "try things and fail
         | fast" mode and it tends to work okay for just seeing if the
         | overall thing works like I want. Then I go back and do more
         | precise design work fiddling with spacing, alignment,
         | compression pressure, etc.
        
         | konschubert wrote:
         | Another solo dev, and I can second your sentiment.
         | 
         | I would like to add that I found SwiftUI to be extremely robust
         | against developer mistakes. Things either work, or they give
         | error messages. It's rare that a view is subtly broken.
        
       | vimy wrote:
       | Things were easier when it was just Objective-C and UIKit /
       | AppKit. Swift killed my joy of making iOS apps.
        
         | adamnemecek wrote:
         | How is Objective-C easier than Swift.
        
           | nicky0 wrote:
           | Once you get past the square brackets notation, ObjC is a
           | really delightfiul language to code in largely because of
           | it's message-passing object system. In many ways Swift was a
           | step forward, and more approachable for beginners, but for me
           | it's also a few steps backwards for programmer happiness.
        
           | woadwarrior01 wrote:
           | If you know C, Objective-C is very little syntax on top of
           | it. I learnt it over a weekend ~12 years ago by mostly
           | reading Apple's programming guide[1] and then the Objective-C
           | runtime reference[2] and just playing with some code and GDB.
           | That was enough for me to lead a small team of iOS devs and
           | we built slew of popular apps for the next two years. My
           | background prior to that was in desktop GUI development using
           | Qt and C++.
           | 
           | I don't work in the iOS/macOS dev field anymore, but I've
           | tried learning Swift in a similar fashion over weekends, to
           | no avail. Incidentally, do you have any recommendations for
           | learning Swift for someone coming from a C/ modern C++
           | background?
           | 
           | [1]: https://developer.apple.com/library/archive/documentatio
           | n/Co... [2]: https://developer.apple.com/documentation/object
           | ivec/objecti...
        
           | kitsunesoba wrote:
           | Objective-C can feel easier to different types of developers
           | for different reasons.
           | 
           | For disciplined developers who always dot their I's and cross
           | their T's, it feels easier because they can write code with
           | full "trust" from the compiler that the developer knows what
           | they're doing.
           | 
           | For undisciplined developers, it can feel easier because the
           | compiler isn't calling them out on code smells and
           | inattentiveness to nullability and types.
           | 
           | I'd like to think I'm somewhere in the middle (as I suspect
           | most devs are) and for me Swift feels easier in most
           | respects, even with its everything-and-the-kitchen-sink
           | nature compared to Objective-C's more spartan approach.
        
           | DANK_YACHT wrote:
           | Swift is very strict. Objective-C lets you get away with
           | more. E.g. optionals in Swift are kind of annoying. if let,
           | guard let, blah blah blah. I like Swift more than Obj-C, but
           | Obj-C is a fine language in its own right. Definitely easier
           | to write once you get a hang of the notation. Swift may have
           | a more familiar syntax, but it forces you to think about more
           | things when writing code.
        
           | vimy wrote:
           | Objective-C has an unusual syntax but is easy to master.
           | Swift has an easy syntax but is hard to master.
        
           | lapcat wrote:
           | Some reasons:
           | 
           | Objective-C compiles much faster. Fewer compiler errors.
           | Fewer compiler crashes. Older projects still compile. The
           | debugger is much more reliable. The entire Objective-C
           | toolchain is more solid, because it's older, mature, and
           | changes less.
           | 
           | Also, easier compatibility with cross-platform C and C++
           | source.
        
         | [deleted]
        
       | robertwt7 wrote:
       | Looking at the documentation, it's just scary to jump in and put
       | most of your effort on swiftUI
        
         | emehex wrote:
         | Yeah, the documentation isn't amazing... but the example apps
         | and tutorials are great!
         | https://developer.apple.com/tutorials/swiftui/
        
       | mromanuk wrote:
       | I'm doing an app integrally with SwiftUI, as always happen with
       | new frameworks, if you stay in the happy path everything is nice
       | and easy, but if you start tweaking things, you are lost in the
       | forest really fast.
       | 
       | To give you an example, it's quite easy to add the swipe to
       | delete function (within a list) just adding .onDelete() but if
       | you want to add swipe to delete to a LazyVStack (similar to a
       | List) you need to implement the gesture detection and a few more
       | things [0].
       | 
       | From my POV, SwiftUI IS the future, declarative UIs are awesome,
       | I'm confident that Apple will reach a point where all the
       | quirkiness are mostly gone.
       | 
       | 0: https://stackoverflow.com/questions/67585037/swiftui-
       | ondelet...
        
         | fatboy wrote:
         | I'm probably just getting a bit old, but I like to layout my
         | views manually. I've got a few helpers so I can write
         | `view.left = otherView.right + 8` or `view.moveLeftEdge(to:
         | margins.left` etc. I find it just so clear and easy to
         | understand.
         | 
         | I've not tried SwiftUI yet because my app needs to work on
         | older devices than this allows, but it's also a solution for a
         | problem I don't really have. It can't be as bad as AutoLayout
         | at least.
        
           | NonNefarious wrote:
           | Except that doesn't scale for different devices, and will
           | look ridiculous on the Mac when the user resizes the window.
           | 
           | Non-Apple programmers are probably shocked to learn that to
           | this day there's still no graceful way to scale an Apple UI
           | up. You can't just set "scale symmetrically" on a view. It
           | comes down to positioning things with multiplication factors
           | and literally trying and retrying those decimal numbers on
           | every goddamned control/label combo. Over and over and
           | over...
           | 
           | Then we needed to build a cross-platform desktop app, and
           | went with Qt and QML. I expected to dislike QML, but no; it's
           | really nice to work with, and our app looks great. QML has
           | been around for years, so it's disappointing that SwiftUI has
           | turned out to be such an apparent fiasco.
        
       | anonymouse008 wrote:
       | [Edit: Everyone read ChrisMarshallNY's comment, it's a less terse
       | and more eloquent version of this :)]
       | 
       | My humble belief is that once one understands the inner workings
       | of UIKit, Swift UI is about half of the interactivity of UIKit
       | (read interactivity not as animations or formatting, but actual
       | user controls and inferences from intended actions).
       | 
       | I had requirements to fully understand UITextView, then TextKit
       | and NSLayout, then new ways to interact with text that I have no
       | earthly idea how I would build my interactions in SwiftUI.
       | 
       | In SwiftUI, you get a lot of bang for your buck, but if you want
       | to build something truly remarkable, you need to get your hands
       | dirty and codify your opinions with UIKit.
        
       | fbanon wrote:
       | SwiftUI was a mistake.
       | 
       | The jury is still out on Swift itself.
        
         | emehex wrote:
         | Swift is a phenomenal language. Generics, Protocols, Protocol
         | Extensions... all a delight to work with
        
         | travisgriggs wrote:
         | Some days I agree, some days definitely not. Would you care t
         | elaborate in a meaningful way on your sentiment?
        
         | kitsunesoba wrote:
         | As someone who got his start in programming with Obj-C and
         | AppKit, I'm totally sold on Swift. I'll still do small tools
         | and the like with Obj-C sometimes but for projects with any
         | complexity, Swift is my go-to. The number of stupid mistakes
         | the Swift compiler catches and little QoL things like not
         | having to maintain header files make it worth its comparative
         | downsides.
        
       | bowsamic wrote:
       | The problem with SwiftUI is what Apple seems to consider its
       | advantage: that it hides complexity from the developer (see their
       | "Avocado toast maker" analogy in one of the WWDCs). The reason
       | this is a problem is because sometimes you do need to break out
       | of the paradigm, and doing so is basically always painful. At
       | least with UIKit and AppKit you are always in full control.
       | Complex apps will break out of the SwiftUI box all over the
       | place, destroying the benefits. You can usually hack things to
       | make it play with SwiftUI nicely, but it always feels like a
       | hack.
       | 
       | One example I had was trying to put an ObservableObject into
       | UserDefaults for persistent storage. There's not really a nice
       | way to do this. SwiftUI only knows how to store basic scalar
       | values in UserDefaults. That kind of makes sense, because
       | UserDefaults is only meant for small amounts of data, but what if
       | I want to save a struct that has two fields? Trying to do this in
       | SwiftUI is actually quite painful and that is a very simple
       | example. Another pain point is app navigation which basically
       | does not work properly at all.
       | 
       | Though one very nice thing is that it's quite easy to use a
       | SwiftUI view from UIKit
       | 
       | Overall though, somehow a far worse experience than using
       | something like React
        
         | emehex wrote:
         | Apple tried to solve this with @AppStorage, but if you lean on
         | MVVM... it doesn't really work. Hoping we get some new CoreData
         | + UserDefaults stuff this upcoming WWDC
        
           | bowsamic wrote:
           | No, @AppStorage just does scalars, as I said
        
             | emehex wrote:
             | "tried" being the operative word. But you really shouldn't
             | be persisting an ObservableObject. You should extract what
             | you need into a model and use Codable...
        
               | bowsamic wrote:
               | Why shouldn't I try and persist an ObservableObject? Has
               | some Apple guru given you this secret information in a
               | WWDC, or personally? It seems totally reasonable to do
               | so. Observability is something you bestow upon a model,
               | it shouldn't exclude it from persistence. You are talking
               | nonsense to defend Apple's lazy approach. They simply
               | have not covered this base, that's the actual non-Apple-
               | fanboy explanation. Get it together
        
               | emehex wrote:
               | Observable/StateObjects help bridge between models and
               | views... I'd recommend watching this WWDC session:
               | https://developer.apple.com/videos/play/wwdc2020/10040/
        
       | pcr910303 wrote:
       | IMO SwiftUI feels limited b.c. it breaks itself away from the
       | UIKit world: React succeeded because it is the DOM with all of
       | raw HTML & CSS, a thin abstraction with official escape hatches.
       | Mixing imperative and declarative code is natural and more
       | abstractions can be built.
       | 
       | Instead, SwiftUI adopted a whole new set of primitives that
       | doesn't mix. Accessing the underlying UIView is discouraged, and
       | wrapping up UIKit in SwiftUI feels like a legacy feature. IMO
       | SwiftUI should have been a thin wrapper on UIKit.
        
         | Willamin wrote:
         | There are official escape hatches in SwiftUI to let you
         | leverage UIKit. As someone actively working on a slow migration
         | from UIKit to SwiftUI (where possible), it doesn't feel
         | discouraging to wrap a UIKit view to use it in SwiftUI if
         | necessary.
        
           | pcr910303 wrote:
           | That's more of a compatibility solution than an escape hatch.
           | An official SwiftUI escape hatch should have access to the
           | underlying imperative object, call methods on it, etc...
           | Unfortunately the underlying 'things' in SwiftUI is
           | implementation detail, inspecting the view hierarchy and
           | finding the UIViews that implement a SwiftUI view is a hack.
        
             | eunoia wrote:
             | As I understand it, what you're asking for is fundamentally
             | incompatible with the paradigm itself (at least in a clean
             | way).
             | 
             | The whole programming experience of declarative UIs is
             | predicated on the fact that you're manipulating lightweight
             | structs (really just state representations) that are
             | rendered into heavyweight views by the system only where
             | necessary (determined by diffing the state changes).
             | 
             | React's refs are an attempted answer to this very problem,
             | and they get nasty fast.
        
               | pcr910303 wrote:
               | > you're manipulating lightweight structs that are
               | rendered into heavyweight views by the system
               | 
               | Yes, and I'm arguing that not exposing the 'heavyweight
               | views' to the programmers at all is a mistake.
        
               | eunoia wrote:
               | Yup, and my understanding of the problem is that if you
               | expose the heavy weight views to the state layer
               | (structs) and allow direct manipulation, render calls
               | lose incompetency, the structs are no longer the source
               | of state truth and the whole abstraction gets terribly
               | leaky.
               | 
               | Edit: once again I think it's important to look at the
               | limitations and advantages of prior work in this area and
               | I believe React refs to be a good case study in that.
        
               | eunoia wrote:
               | Oops autocomplete. Incompetency should be idempotency.
        
       | hdjjhhvvhga wrote:
       | > how I shipped an amazing full-featured cross-platform SwiftUI
       | app in 10 minutes
       | 
       | For anyone wondering: "cross-plaftorm" means Apple platforms, not
       | real multiplatform like Flutter.
        
       | austinl wrote:
       | > "Hey I got 90% of what I wanted really quick! Neat!" "...oh
       | turns out that last 10% is basically impossible, eh?" Adam Kaump
       | 
       | I've been working on an app that's mostly SwiftUI for about a
       | year now. It feels magical when it works, but I don't think I've
       | saved time vs. using UIKit at this point due to all of the
       | workarounds that I've needed to find.
       | 
       | Particularly, SwiftUI List views are still loosely supported, and
       | in some cases broken. Unfortunately for devs, lists are the
       | cornerstone of many apps.
       | 
       | For example, it's very difficult to get the content offset of
       | list. You cannot put multiple buttons in a list row without
       | breaking their tap targets. You can't change the background color
       | of a grouped list without changing it globally (and it's very
       | difficult to customize many SwiftUI components, like the
       | navigation bar). It's difficult to control the spacing between
       | sections in grouped lists. I could go on.
       | 
       | Developers are stuck in a hard place right now. If you're
       | starting an iOS app today, do you go with UIKit (and accept that
       | your code will soon be considered legacy by Apple and many
       | engineers?) Or do you go with SwiftUI, and accept that many
       | things will be broken or impossible to make right?
        
       | apozem wrote:
       | As a solo, hobbyist iOS & macOS dev, I like SwiftUI. It's much
       | easier to learn than all of UIKit and AppKit. Feels like React.
       | 
       | That said, I find myself dipping down into AppKit and UIKit quite
       | often. Any kind of complex views or UI interactions outside the
       | happy path, just grab that UIViewRepresentable.
        
       | joshuawright11 wrote:
       | Context: I've been working with iOS full time since a few years
       | before Swift came out.
       | 
       | A few startups ago we built our app using SwiftUI 1.0. At that
       | time, while 90% of it was fantastic, 10% was either unworkable or
       | extremely unreliable, causing for some maddening bugs. The
       | documentation was laughable so for these reasons I chose to do
       | the app for a subsequent startup in UIKit.
       | 
       | Fast forward to my most recent company; decided to give SwiftUI
       | another shot (targeting iOS 14 & SwiftUI 2). I am 100% glad we
       | did. It's been pretty incredible; we've built a reasonably
       | complex banking app at a pace not possible with UIKit. The
       | animations in particular are crazy good to work with; we've got
       | some very complex animated flows that would have taken weeks and
       | thousands of lines with UIKit... with SwiftUI it was about 5
       | days.
       | 
       | It's definitely not without its downsides; documentation is still
       | slim at best, but there's plenty of blogs and resources
       | (https://swiftui-lab.com/ is the most helpful IMO) available now.
       | There are also still some maddening bugs that appear in
       | production and take a day or two of head scratching only to
       | discover it's a bug in the framework (most recently; using
       | #available causes code to crash on the platform it's protecting
       | against lol), but there are always workarounds. Still, time
       | wasted on these has been vastly outweighed by the weeks / months
       | of time saved.
       | 
       | Finally, you can always use UIKit as an escape hatch through
       | UIViewRepresentable.
       | 
       | iOS 15 is at 85% adoption, so we plan to drop support for 14
       | somewhat soon, which will give us an even more robust framework
       | as well as async await APIs. Not feasible for most companies I
       | know, but even supporting 14+ Will be pretty reasonable when iOS
       | 16 drops in September.
        
         | emehex wrote:
         | I'm targeting iOS 14+ for most projects and planning to drop
         | when iOS 16 drops as well. Thankfully async/await was back-
         | ported to iOS 13 (can't live without it!)
        
           | aplummer wrote:
           | What kind of work are you doing with async/await that is so
           | improved? Very interested in what kind of code on the client
           | that is.
        
             | cvwright wrote:
             | I'm not the OP, but I'm updating my iOS app now to use
             | async/await instead of callback hell for all of its
             | networking code. It is much, much nicer.
             | 
             | I also recently did some work with Vapor on the server
             | side. Night and day difference there. The old Vapor
             | EventLoop stuff was doable, if you squinted just right and
             | concentrated really hard. The async/await version is as
             | delightful as anything else I've ever used. Nearly as easy
             | as writing Python.
        
               | aplummer wrote:
               | This is what I was expecting. I think for Vapor for
               | example it's incredible because you are always in async
               | land. For client code, because you are returning to the
               | main thread quite a lot - I'm not seeing so many
               | benefits.
        
             | tarentel wrote:
             | Same. I toyed with a bit for a networking stack but outside
             | of that I haven't found anything super useful. I never went
             | into production with it, the code I re-wrote was definitely
             | cleaner but it wasn't really mind blowingly better that I
             | felt the need to pursue it further.
        
         | anonymouse008 wrote:
         | Do you mind explaining exactly what animations would take that
         | much work? I'm struggling to see how animations could ever take
         | as long as estimated for UIKit
        
           | ketzo wrote:
           | The parent said "animated flows" and mentioned a banking app,
           | so I'm betting a multi-page form with lots of transitions
           | between a _lot_ of different state combinations.
           | 
           | Again, just guessing, but I would imagine that it's managing
           | that state and animating it in a sane way which requires LOTS
           | of code, less so the animations themselves.
        
           | NonNefarious wrote:
           | How about explaining why you have a bunch of animations in a
           | UI to begin with?
           | 
           | Animations are so often an ill-advised, interaction-slowing
           | pain in the ass for users that I'm curious about beneficial
           | and non-annoying use cases.
        
             | joshuawright11 wrote:
             | Good question! I'm very much in alignment that most non-
             | system animations get in the way / are just annoying.
             | 
             | I think it depends on what the goal of the screen is. If
             | the goal is to simple provide information to the user, it
             | makes sense to have clean, simple, and snappy animations.
             | 
             | However, I think there are also situations where the
             | experience itself is the goal. i.e. give the user a
             | visually pleasing graphic, animation, interaction, etc. In
             | this case going a little wild with animations can be a good
             | thing.
             | 
             | Most in app situations should be the first (snappy, clean,
             | useful). But selectively sprinkling a few instances of the
             | second throughout your app can bring the experience to the
             | next level.
             | 
             | In our case, we wanted the rewards flow (it's a
             | banking/brokerage app) to be a fun, gamified experience to
             | separate us from typical banks. So we opted to add a very
             | visual, interactive experience in this single part of the
             | app. There's a demo video above. While it's certainly
             | extra, I think it makes the core flow of the app a unique
             | experience.
        
           | joshuawright11 wrote:
           | Here's a part of the flow I'm talking about; for context it's
           | a debit card that rewards users with stock as they use it.
           | The entire flow is SwiftUI (though the top of the pack
           | ripping is PNG sequences so we did cheat a bit).
           | 
           | https://streamable.com/56pha0
           | 
           | (shameless plug; check us out at https://www.withapollo.com
           | we're YCS21, just launched last week, and are hiring an iOS
           | engineer!)
        
             | anonymouse008 wrote:
             | Ok, wow, yeah impressive!
             | 
             | [Edit]: Thank you kind stranger.
        
               | dean177 wrote:
               | > though the top of the pack ripping is PNG sequences so
               | we did cheat a bit
        
       | saagarjha wrote:
       | I just finished writing a little Mac app in SwiftUI for my
       | personal use yesterday:
       | https://github.com/saagarjha/EffectivePower
       | (https://twitter.com/_saagarjha/status/1528937319171887104 for a
       | slightly out-of-date screenshot). Here are my thoughts.
       | 
       | The good:
       | 
       | * Making all the graphs (they're drawn by hand!) was very nice
       | and easy. The speed at which I could iterate with them was
       | incredible, and I could just move code around and lay things out
       | in a way that AppKit (or UIKit) would not allow, at all.
       | 
       | * I could keep the code very clean, with each component being
       | very specific and isolated. Plumbing bindings through made things
       | very natural and I can imagine taking the code I made there and
       | just plopping it into another project as-is.
       | 
       | * The result is actually kind of nice, IMO? There's a lot of
       | focus on whether SwiftUI works and stuff but not much focuses on
       | what the end result is. I had an app in my mind that I wanted to
       | make, and it was mostly possible to make it in SwiftUI. In some
       | places I was pleasantly surprised that things I would have been
       | hesitant to try before (slider in a toolbar!) "just worked".
       | 
       | The middling:
       | 
       | * I initially supported macOS 12.0 only. Someone asked me to
       | backdeploy to 11.0, which was a little painful mostly because
       | Material didn't exist back then and neither did support for
       | initializing a color from a NSColor. I did kind of a lazy stab at
       | it and the end result being fairly simple, but took about an hour
       | to write:
       | https://github.com/saagarjha/EffectivePower/blob/main/Effect....
       | If I had to support 10.15 I think I would honestly rewrite large
       | parts of the app in AppKit, maybe keeping just the graphs as view
       | representables.
       | 
       | * My data model has tens of thousands of elements. Ensuring the
       | "reactivity" didn't cause a bunch of things to be recalculated
       | when they shouldn't was a bit of a challenge. The place I have it
       | now is very nice (I have them defined in such a way that they
       | will never update unless they need a redraw) but this definitely
       | does not come "for free", you'll find out about it after
       | profiling and need to figure out how to fix it.
       | 
       | * I wrote simple versions of things that don't seem to exist in
       | SwiftUI but AppKit provides for free, such as magnification
       | bouncing. It was like three lines of code to get something that
       | seems reasonable, but with SwiftUI I'm never sure if this is a
       | "we just didn't add it yet" thing or a "oh this is so simple in
       | the framework that you should just write it yourself".
       | 
       | The bad:
       | 
       | * Things are broken and I don't know why. If you use
       | magnification gestures the callbacks stop getting called. No
       | indication why. I have some commented out code that would've used
       | a table in the sidebar, but I had to use a List instead because
       | it seems like SwiftUI does not properly update the table and it
       | crashes with an assertion.
       | 
       | * Documentation sucks but that's nothing new. There's a lot of
       | things that work but you need to be clever at arriving to getting
       | to that point. It's a fun challenge for a toy project but for a
       | production thing I can see this being super frustrating.
       | 
       | * If you mismatch a type somewhere the compiler is just going to
       | time out rather than telling you what is wrong. Thankfully you
       | can just go through and comment out large parts of the app to
       | reduce the scope of where the error is coming from, but the fact
       | that this is necessary is kind of annoying.
        
       | bryansum wrote:
       | One point that's not being discussed enough -- using SwiftUI
       | (since it's heavily value-typed / struct-based) prevents a whole
       | host of problems around retain cycles, typically the bugbear of
       | iOS dev. I recently built an iOS app from scratch with recent
       | grads with zero Swift experience (but had done React).
       | 
       | It was ~2mo before they even had to _learn_ what a retain cycle
       | was, and that was from using UIKit.
       | 
       | Of course you still eventually see this if / when you use
       | `@ObservedObjects` and their implementation, but in our case we
       | were also using https://github.com/pointfreeco/swift-composable-
       | architecture which hides this away as well.
        
       | vxNsr wrote:
       | > _Adam Kaump:
       | 
       | "Hey I got 90% of what I wanted really quick! Neat!" "...oh turns
       | out that last 10% is basically impossible, eh?"_
       | 
       | This seems to be the story of apple in general. Very beautiful
       | and easy to use as long as you stay on the path and don't go too
       | far along lest you discover the 2nd mile is still under
       | construction.
        
         | Willamin wrote:
         | That last 10% is easily accessible by reaching into UIKit.
         | Crossing that boundary is much easier in practice than one
         | might expect at a first glance of the docs for doing so.
        
       ___________________________________________________________________
       (page generated 2022-05-25 23:02 UTC)