Under the Radar

204: Adopting SwiftUI


00:00:00   Welcome to Under the Radar, a show about independent iOS app development. I'm Marco Arment.

00:00:05   And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.

00:00:10   So David, non-null, how are you doing, nullable? This has been my date, non-null, for a very

00:00:15   long time, nullable. I would say I could rate my day as a, let's see, maybe an 8 CG float

00:00:23   out of 10 CG float. But can you cast that to a double?

00:00:27   Only explicitly. You've been having fun in Swift.

00:00:38   I am in deep. I'm in very deep now. I have un-fond memories of maybe three or

00:00:47   four years ago where this was my life, of just like going crazy with learning Swift

00:00:52   and getting used to all of its very opinionated feelings. You know, that you just have to,

00:01:00   like some of them I found that I was doing it wrong, and by doing it right it was easier.

00:01:05   But many of them you're just like, nope, that's just how Swift is. It really doesn't

00:01:08   want to think that a CG float is a double, and a double is a CG float, even though for

00:01:12   almost any situation they're totally fine to be the same.

00:01:16   So yeah, so my few years old iMac Pro is really not happy that I've switched to Swift.

00:01:24   And SwiftUI at that. Oh yeah, like every, like, my fan problem

00:01:28   is back where now I'm hearing the fan frequently. It's revving up and it's, yeah, everything

00:01:36   I'm doing is like crushing this computer and I'm hitting all the problems of like,

00:01:41   sometimes autocomplete just dies for a while, or sometimes I get bizarre error messages

00:01:47   that make no sense, but if I clean the build folder and rebuild or relaunch Xcode, the

00:01:51   messages go away. And I'm hitting all those rough edges that Swift programmers have been

00:01:56   hitting for, you know, five years or whatever it's been.

00:01:58   Because really, who needs a build process that's repeatable? You don't want that.

00:02:03   No. It's nice to have a build process where every

00:02:05   time you run it, sometimes you get different reactions.

00:02:07   Yeah, and I love the problems that I now have, you know, things like, like I'm having to

00:02:12   pay attention to build times for the first time in years. Because Swift just builds so

00:02:18   incredibly slowly compared to Objective C that it's like, I never really thought about

00:02:22   my build time before. And I thought for, you know, most of my career so far, my computer

00:02:29   is fast enough to be my development machine. And all that's out the window with Swift,

00:02:36   and it's, especially with SwiftUI, as you said, and the performance and error messaging

00:02:41   and diagnostic messaging. Like, I frequently hit that error message in SwiftUI where it

00:02:46   says something along the lines of like, "We can't evaluate this in reasonable time."

00:02:49   Yeah. Like, just, sorry. Consider breaking this expression into simpler

00:02:52   expressions, into sub-expressions. Yep, that's the one. And like, that makes

00:02:56   me infuriated, and also it makes me smile every time, because I'm like, that's, I love

00:03:00   how ridiculous this message is. So this is where I am. I took your advice, and I decided

00:03:08   to rewrite my entire watch app UI in SwiftUI. And so far, I don't regret that decision.

00:03:15   That's good. I was like, when you said the moment, I was like, hopefully, it's like,

00:03:19   and we still have a show, right? This isn't the—

00:03:21   Yeah, we can still be friends. I took your advice, and now this is the final

00:03:25   episode of Under the Radar. I'm never speaking to you ever again. I can't believe you did

00:03:29   this to me. No, so it's—I'm very glad I'm in this

00:03:33   world and learning this world, and of course, all these SwiftUI skills will come in handy

00:03:37   when I do soon tackle the widget for the iOS app.

00:03:40   Yeah. And it's, again, part of the reason why I'm

00:03:42   doing this. But having to learn SwiftUI is, first of all, the learning resources out there

00:03:49   are still terrible, because it's such a young language/framework/method of even thinking

00:03:56   about things. It's so young, and it changes so frequently, similar to the early days of

00:04:02   Swift, that a lot of the tutorials or sample code or Stack Overflow answers that are out

00:04:08   there are no longer even correct, because something has changed since when they were

00:04:13   written last year and now. Or the answer was posted during a beta, and then in a later

00:04:22   beta, even that same year, the name of a class changed, or the way you're supposed to do

00:04:26   something changed. And it's so early still. This is a time when you really feel how much

00:04:34   we need better documentation support from Apple. Like, one of the great things—I'm

00:04:38   going to annoy so many people right now—one of the great things about PHP is that PHP

00:04:46   has always had exceptional documentation on its website. On PHP.net, you search for any

00:04:52   function, and editors build in hotkeys, so like in TextMate I can hit Ctrl+H and it pops

00:04:57   up a documentation window from PHP.net about whatever function name I have my cursor on

00:05:02   at that moment. And there's always been great documentation there, because on the

00:05:05   documentation pages, in almost every function in the language, which is a lot, there are

00:05:11   example code snippets on the documentation page. And there's comments. And so even

00:05:19   if the example code doesn't quite get somewhere for you, or doesn't answer a question you

00:05:23   have, the comments usually do. And this is something that I really wish Apple's documentation

00:05:30   would have these little usage examples, because they really can help explain and show better

00:05:37   than just a pure API reference how to do something, or what a function is for. And as we move

00:05:43   into the land of SwiftUI, and combine, and all these higher-level concepts, a little

00:05:52   more complicated things—this is also going to apply similarly once Swift gets its whole

00:05:56   Async/Await thing, presumably in a year or two—it becomes harder to understand a lot

00:06:03   of these concepts, because they're so abstract, and they have really simple-sounding names,

00:06:10   and it's really hard to tell what this does, how to use it. And so we all end up having

00:06:15   to go to Stack Overflow and stuff, and tutorial blogs and things, because Apple's own documentation,

00:06:21   when it's even there, which is a big "when," is so barebones and minimal. It's like,

00:06:27   "Johnny, I've designed it."

00:06:28   It's a big white room.

00:06:30   Yeah, and it's a big white empty page, and it's like, "This type is to do this one

00:06:37   thing." And then there's no other context, there's no example of showing, "Well,

00:06:41   when would you use this? How do you use this? Do you call this in a certain way, like as

00:06:47   a constructor or whatever?" You can get so much value out of those little tiny snippets

00:06:52   on documentation pages, like what PHP does, of like, "Here's a four-line example of

00:06:56   how to use this thing." And I wish for that so much as I'm learning this stuff, because

00:07:00   I'm seeing—and I would imagine this is how beginners see almost all parts of programming.

00:07:08   And because I am such a beginner at Swift and SwiftUI and at these concepts that SwiftUI

00:07:15   is built upon, I'm seeing what it's like to be a beginner for the first time in a while.

00:07:21   And I would benefit so much from just better documentation. And to have, presumably at

00:07:28   Apple, to have a pretty strong effort to not only write the documentation, but then to

00:07:34   update the documentation as the language changes. Because this is the problem when you have

00:07:38   these young languages that are greatly in flux, or young frameworks that are greatly

00:07:43   in flux, that if you're relying on tutorial blog posts and Stack Overflow answers, well,

00:07:49   those go out of date pretty fast, as I was saying earlier. And so it's nobody's full-time

00:07:56   job at Apple to make sure that all these tutorial blog posts out there can be updated when the

00:08:04   language changes, so they mostly just aren't. Or some of them are, some of them aren't,

00:08:08   and it's hard to know what you're going to land on when you find it. And even then,

00:08:12   like SwiftUI, for as cool as it is and as much attention as it's gotten from language

00:08:18   nerds over the last year, there is very little out there about it. There's very, very little.

00:08:24   And there's even less out there that goes beyond trivial use cases. So for instance,

00:08:32   if you have to make a tech demo with SwiftUI, and you have to, you know, have a button state

00:08:39   that changes and increments a number or whatever, great, there's a million blog posts out there

00:08:43   about that. But then once it's like, okay, how do I tie this into the rest of an app

00:08:48   that's a real app that's like, you know, has actual needs like persistence, storage,

00:08:53   like different screens and everything. Like once you add the complexity of real world

00:08:57   apps, most of the tutorials can't cover that or don't cover that. And so like, I've had

00:09:05   such a time, Dave, I've had such a time trying to adopt SwiftUI from these like trivial little

00:09:13   tutorials that people have, or that Apple has in WVDC sessions, to try to actually build

00:09:20   like, okay, well, great, how do I connect that to my database? You know, how do I connect

00:09:24   that to my downloader or my sync engine? Like, there's been so much of that, and I think

00:09:29   I finally got it. But man, is it non-trivial and non-obvious. And there's so many weird

00:09:36   little pitfalls. Like, I don't know. How did you find, because you know, you came to it

00:09:42   as well with having like existing app bases. I mean, have you integrated SwiftUI into apps

00:09:48   that didn't start with it, or have you only done like clean rooms, you know, start from

00:09:52   zero versions of SwiftUI?

00:09:54   - So I've done it both ways. I think I started doing SwiftUI in essentially more clean room

00:10:02   environments in the sense that it was either on the watch, which even if some of my watch

00:10:07   stuff integrated with existing other infrastructure, like on the watch itself, it was fairly standalone.

00:10:16   Before what I've started to do now is use some of the UI kit bridging stuff, and so

00:10:22   like in C++ I added a bunch of new graphs recently, and I built the graphs in SwiftUI,

00:10:29   but they're just like UI views for the app's purpose, and so like it's fairly separated

00:10:37   from each other, but no, I absolutely feel your pain though. Like, it is, I think what's

00:10:43   so frustrating to me about this is that it seems, like there are a couple of really tremendous

00:10:48   SwiftUI resources online. Like, I mean for me, I think it's Hacking with Swift by Paul

00:10:52   Hudson is like 80% of my SwiftUI knowledge has come from his site, and from his videos,

00:10:58   like he has this tremendous, like he has this great sort of process where he'll make these

00:11:04   videos that show you one level beyond the trivial example, which you end up with something

00:11:10   that is like, it's like trivial plus. It's not a full-blown example, it's not the sum

00:11:16   situation, like there are still those rough edges that you're talking about where I definitely

00:11:20   continue to run into that, where it's like, I want to do something a little bit more than

00:11:25   the obvious case, and then it's like you're jumping off this cliff, and it's like, good

00:11:29   luck, you know, that happens, but I've done a lot of learning there, and it's like, I

00:11:33   remember back at the beginning of the spring, I remember there were a couple of like the

00:11:42   educators in the Apple community, like people who typically are kind of on the conference

00:11:47   circuit, they speak at a lot of the conferences and do workshops and educators like that who

00:11:53   were saying, like, you know what, we're not going to be able to travel for almost all

00:11:58   of 2020 it seems, we're not going to be able to do conferences, we're not going to be able

00:12:01   to do a lot of things, hey Apple, there's a lot of really talented educators in your

00:12:05   community who have a lot of spare time, it would be a great thing if you took advantage

00:12:09   of that, and it's kind of sad that now that we're sort of towards the end of the year

00:12:12   and it doesn't seem like they did, like it doesn't seem like there was any kind of movement

00:12:18   on that to leverage all of these people who are excellent at explaining things, of creating

00:12:22   example apps, of sort of doing this work in a way that would help people in your circumstance

00:12:30   and my circumstance, and I mean, I really feel for the people who are coming at Swift

00:12:34   UI without like decades of programming experience, like if you're, this is the first app you're

00:12:40   learning, like, in some ways it's easy-ish, like there are certain aspects, like a really

00:12:45   basic Swift UI app is really easier to build probably than a, like the most basic UIKit

00:12:53   app, but as soon as you start getting beyond that it gets so complicated so quickly, and

00:12:59   yeah, like, and I also think of how, what's so difficult with documentation is how the

00:13:08   people who are best able to make documentation for a new platform are the people who make

00:13:13   the platform, because they can work on the documentation and have it available at the

00:13:17   beginning of the process of it being released, rather than having, like, I feel bad for all

00:13:23   the Apple tech sort of educators who, you know, a new SDK drops, a new beta releases,

00:13:31   and then they're just like, you know, not sleeping for three days trying to frantically

00:13:34   update all their stuff, like, I get the new stuff covered, like, and they do a great job

00:13:39   and I appreciate it, but it's like, this doesn't have to be frantic, this could be something

00:13:42   where the documentation team at Apple has been working on this in concert with the people

00:13:48   writing the APIs for months, and so on day one, here's a great set of examples and sort

00:13:55   of show code about how to use this, because I think you're exactly right, especially Swift

00:13:59   UI, the nature of it is the traditional documentation, where you're just like, if you go to the doc,

00:14:06   like the sort of the documentation for text in Swift UI, like the text modifier or view,

00:14:14   like the number of different modifiers you can apply to that view is probably in the

00:14:20   hundreds, if not more, but having just this gigantic list of all the things you could

00:14:24   possibly ever do to a text isn't helpful, what you want to see is, it's like, okay,

00:14:30   how do I do text that looks like this, or what if I want multi-line text, or what if

00:14:35   I want multi-line text that has only this many lines and then is aligned in the middle,

00:14:40   like doing that kind of stuff, you need examples, and I don't think the total number of cases

00:14:46   that people actually use is that wide, but yeah, I feel your pain, I'm glad it seems

00:14:51   like you've kind of crossed over that midpoint, because I remember there was this point in

00:14:55   my Swift UI experience where I went from feeling like I was just constantly banging my head

00:15:02   against the wall to I guess maybe my head broke through the wall, and I may have had

00:15:08   a headache, but at least I could see through to the other side.

00:15:11   - I'm bleeding, I have to go to the hospital, but I've made it through.

00:15:15   - But you've made it through, and it sounds like hopefully maybe you're kind of on that

00:15:19   point, because I do remember that there was this point where it's this now I know when

00:15:23   I hit a problem in Swift UI, I know the direction I need to go to fix it, and I don't always

00:15:28   necessarily know the answer, but I know it's like, okay, this is probably going to be this

00:15:32   kind of modifier, or this kind of problem, like when my layout gets all crazy, it's like,

00:15:37   okay, I have a strategy, I'm going to put one pixel borders around everything and then

00:15:42   be able to work out where my problem was, but the initial phase is rough, and I'm sorry

00:15:49   that I sent you that path, though hopefully you have now learned and it can be a benefit

00:15:53   to you in the future.

00:15:56   - We are brought to you this week by Pingdom from SolarWinds.

00:16:01   Today's internet users expect a fast web experience, no matter how good your content is or how

00:16:05   effective your marketing is, the most likely bounce if your website is loading too slowly.

00:16:10   With real user monitoring from Pingdom, you can discover how website performance issues

00:16:13   affect your visitors' experience, so you can take action before your business is impacted.

00:16:19   How your visitors experience your website differs depending on their browser, device,

00:16:22   and platform they use, so you want to identify how they're experiencing your website so you

00:16:25   can make informed optimizations and deliver great performance to those who matter most.

00:16:31   And real user monitoring from Pingdom is an event-based solution, so it's built for scale

00:16:35   ability, meaning you can monitor millions of page views without compromising the fidelity

00:16:40   of your historical data or breaking the bank in the process.

00:16:43   Get live visitor insights today with real user monitoring from Pingdom.

00:16:48   Go to Pingdom.com/RelayFM right now for a 14-day free trial with no credit card required.

00:16:55   Then when you sign up, use the code RADAR at checkout to get an awesome 30% off your

00:17:00   first invoice.

00:17:01   Once again, Pingdom.com/RelayFM code RADAR for 30% off your first invoice.

00:17:06   Thanks to Pingdom from SolarWinds for their support of this show and all of RelayFM.

00:17:11   Yeah, I think one of the things I'm facing as I dive more into SwiftUI is like, I hit

00:17:19   that like, that dangerous, like probably toxic point where I'm like, "You know, it would

00:17:24   be a lot easier to write the UI for this component if I rewrote that component in Swift."

00:17:30   And I'm having to exercise a good degree of self-control to avoid the impulse to rewrite

00:17:39   massive parts of my app in Swift.

00:17:42   And I'm mostly losing that battle.

00:17:44   I have been rewriting massive parts of my app in Swift.

00:17:49   And not like, not lines of code-wise massive, but just like lots of classes, you know, things

00:17:56   like I mentioned earlier, my Downloader.

00:17:57   I rewrote my Downloader for the first time in years because it's easier for it to be

00:18:01   in Swift.

00:18:02   And I took the opportunity thinking like, you know, well actually, my old Downloader

00:18:05   has a couple of little weird edge case bugs and it has a bunch of like workarounds for

00:18:10   old OS bugs that no longer are needed.

00:18:14   And so like, you know, the new one could be simpler.

00:18:16   Why don't I rewrite it?

00:18:17   And I did.

00:18:18   And you know, it ends up at the end of the day like it's fine, but that cost, you know,

00:18:22   that cost me like two days to rewrite that class and to do it right and to test it and

00:18:26   everything.

00:18:28   And so I do have this kind of dilemma almost every day, like when I run into a component

00:18:35   that is written in Objective-C that I'm trying to interact with from Swift, nullable, non-null,

00:18:40   excuse me, from Swift!

00:18:44   Exclamation point!

00:18:45   Then, you know, I do hit that dilemma a lot.

00:18:49   And usually rewriting code that is working is not a good idea.

00:18:54   But there's also benefits to modernization, like being able to simplify and have less

00:18:58   to maintain and possibly fix some old bugs in the process.

00:19:03   On the other hand, you're on the risk of unfixing old bug fixes by rewriting new code

00:19:08   and then you have to basically fix the same bugs that you fixed six years ago over again

00:19:12   over the next few months.

00:19:14   I mean, how do you, you seem like you're more pragmatic and disciplined than I am in

00:19:18   most ways in life.

00:19:20   How do you balance that or make the decision, like whether you are dealing with your old

00:19:24   code and just wrapping around it or using it from Swift or whatever, or how do you rewrite

00:19:31   and decide when to rewrite?

00:19:33   So I think the honest answer, it's not at all helpful to you, is that rather than rewriting

00:19:39   my old apps, I just keep making new apps.

00:19:44   That's an easy strategy to get around to this particular problem.

00:19:47   As soon as you have this nice old Objective-C code base, that's fine, just leave it there

00:19:51   and just write a new app.

00:19:52   I don't want to clean the kitchen, let's get a new house.

00:19:55   Exactly.

00:19:56   I am in the get a new house version of app development.

00:20:00   But there are a few of my apps that I've had to make this choice in and I think it is a

00:20:04   really tough line and I think the general approach that I take is if I can write a Swift

00:20:12   wrapper that is relatively straightforward for an Objective-C thing, that is the first

00:20:20   thing that I tend to do.

00:20:22   I found that that has worked pretty well in general where I can take some behavior, sort

00:20:28   of in some ways is what I was saying with, I wanted to use SwiftUI for my UI of these

00:20:33   new graphs and so I just built a little UI kit wrapper that goes around them and I can

00:20:40   use it to create this clean boundary between the two worlds that works better.

00:20:48   And I think that's a very pragmatic solution that ultimately you're ending up with this

00:20:54   unnecessary, like now you have the new code, you have the code that is the adapter between

00:21:01   the old code and the new code and then you have the old code.

00:21:04   And that's not great necessarily going forward.

00:21:07   I think ultimately the line is going to come, for me, it's usually this place of, is this

00:21:14   a piece of code that I expect to continue to be working in and on for the foreseeable

00:21:21   future or is this a piece of code that I'm kind of, it just exists and I don't expect

00:21:27   to ever change it or touch it.

00:21:30   It's not the kind of part of the app that is really something that's going to change

00:21:34   or get better by being in Swift.

00:21:36   There are some things that I think when I've rewritten them from Objective-C into Swift,

00:21:40   they are just better in terms of, it's a more, like certain concepts Swift is really expressive

00:21:47   at sort of expressing in itself in a way that is more awkward in Objective-C.

00:21:55   And so when I'm doing those kinds of things, that's really, I'll benefit from it, then

00:22:02   maybe.

00:22:03   It's like unless I'm really going to be in there back and forth, I just try and avoid

00:22:08   it I think.

00:22:09   And I think I do find that if anything there's some workflow things that I do that I think

00:22:14   you might be running into now of usually I try and do all of my Objective-C work kind

00:22:20   of in a day and my Swift work in a different day.

00:22:23   Going back and forth and context switching between the two is really bad for your sanity

00:22:30   because there's so many things about them that are subtly different, slightly sort of

00:22:35   the same but not the same, that I find going back and forth is where I would really get

00:22:40   frustrated and that would push me over the edge and be like, "Okay, that's it.

00:22:43   I'm just going to write it all in Swift."

00:22:45   So a little bit of just trying to, obviously you're in the middle of this architectural

00:22:50   change and so it's awkward, but in general if you can decide, if this is not something

00:22:56   you're going to ever touch again or expect to need to keep working in, maybe leave it

00:23:00   as Objective-C. Consider maybe writing a wrapper around it if you can.

00:23:05   That's often really helpful.

00:23:06   And then otherwise, I mean sometimes you just got to go for it and you just rewrite it and

00:23:12   it's fine.

00:23:13   And I will say as much as there's the big rewrite is often really problematic.

00:23:18   The small rewrite, like if you're just rewriting a function or a small data type or something

00:23:24   like that, those kind of rewrites in my experience, if you're an experienced developer, you can

00:23:29   do relatively safely without introducing massive new bugs or big problems because you can limit

00:23:35   the scope of what you're doing.

00:23:37   It's when you start to be like, "Okay, I'm going to," I'm thinking in Overcast, if you're

00:23:41   like, "Okay, I'm going to rebuild the entire now playing screen in Swift."

00:23:46   Like okay, that's probably going to be like weeks and months of work to get it back to

00:23:52   where it was because there's so many little behaviors and little nuances in that because

00:23:57   it's such a big important expansive part of your app, that's not a great place to spend

00:24:02   it.

00:24:05   When you rewrote your downloader in Swift, if you also wanted to rewrite the download

00:24:09   management screen in Swift, probably okay.

00:24:14   It's relatively simple.

00:24:15   It doesn't have a huge surface area.

00:24:18   That's the kind of thing that you might.

00:24:19   It probably isn't worth it, but that would be an area where if you were in the new world

00:24:23   where say we have different concurrency dynamics and things, and so it would be cleaner and

00:24:30   simpler to have that UI even be like it's in Swift UI so that it can tie into the combined

00:24:38   event system more cleanly.

00:24:41   That seems like a good place for it.

00:24:44   It's definitely an element where it's like every time you have that instinct, it's like

00:24:49   take a second, take a deep breath, go for a walk on the beach, come back.

00:24:52   If you still feel like doing it, do it, but don't do it without giving it some thought.

00:24:58   That's wise.

00:24:59   I'm trying to make the decision of whether and when to rewrite.

00:25:03   I'm trying to make it a little bit pragmatically.

00:25:05   An isolated component like a downloader, it's a big deal in the sense that that's a very

00:25:10   important component and it was very tricky and it took me years to get it right because

00:25:14   the background download system was so buggy and so weird at first.

00:25:17   Fortunately most of that's been worked out, or at least I figured out the right error

00:25:20   codes to look for.

00:25:25   Some of it is code that touches everything.

00:25:28   One of the biggest decisions I had to make and I'm still making is what do I do with

00:25:33   my model layer?

00:25:36   My model layer is this package I wrote called FC model.

00:25:38   It's open source.

00:25:40   Just last night I finally got it to be correctly bridged to be observable objects.

00:25:46   Now I can use any FC model class correctly from Swift UI and it will correctly update.

00:25:53   That took this horrible hack using associated objects with Objective-C, runtime.

00:25:58   It's a terrible hack, but it works.

00:26:03   It took me a couple of weeks to figure out how to correctly do this.

00:26:07   I was bitten by a weird thing for a while where, again this is just an example of why

00:26:13   I was so resistant to come over to Swift for so long.

00:26:18   When you set an associated object you have to give it some kind of pointer to be the

00:26:22   key to associate and I would just give it the same string on both things.

00:26:30   On the set and the get you have to give it the same pointer to get the object back.

00:26:35   There's this implementation detail of the C and Objective-C compiler where if you have

00:26:40   the same string literal more than once in a module, typically that only makes one instance

00:26:45   of it and so it points to the same pointer.

00:26:48   In Swift that apparently is not necessarily that way.

00:26:52   I had this crazy hard to find bug that the set and the get while they were using the

00:26:57   same string literal as the pointer were not actually getting the same pointer to both.

00:27:02   I had to learn about this method called static string or this type called static string that's

00:27:06   especially in Swift and now I'm just taking the address of a static instance of it so

00:27:11   it doesn't even matter what it is.

00:27:13   There's things like that where I have all this institutional knowledge of using C and

00:27:20   Objective-C for so long that I can think about implementation details like that and that

00:27:25   becomes a basis of my knowledge as I'm working and that allows me to do things with a certain

00:27:31   degree of proficiency and bug avoidance and elegance sometimes and I just don't have

00:27:37   that with Swift yet.

00:27:38   That's going to take years to build up and that's the kind of thing that's hard for

00:27:43   me to throw that away lightly.

00:27:46   That's not a decision to take lightly and that's why it took me so long to make this

00:27:49   decision because now I have to, as I'm writing low level framework code like working on FC

00:27:54   Model interacting with Swift, I have to make sure I'm doing things correctly and when

00:27:59   it's just me here, I don't have anyone else to check my code really or to learn that much

00:28:07   from or to be able to tell me like, "Hey, you know what?

00:28:09   That actually doesn't work the way you think it does in Swift."

00:28:10   I just kind of have to learn all this myself and so the idea of changing languages and

00:28:15   platforms and throwing away a decade of knowledge with one is hard to do and I'm hitting all

00:28:22   that friction now.

00:28:23   I really feel for you, I've gone through so much of this myself and I feel like there

00:28:30   are so many of these things that are, the unfortunate reality is it's kind of inescapable

00:28:35   though.

00:28:36   I feel like in the last few years, Apple has been very clear that they are heading in a

00:28:43   Swift and Swift UI direction and that is where all the new stuff is going to go.

00:28:47   That is where all of their energy seems to be heading in that direction and I think it's

00:28:54   appropriate for them to do that.

00:28:55   It's one of those, if you weren't going through this pain now, I feel like every year that

00:29:02   you put it off from now on, it's going to start, it's like it would be sort of growing

00:29:07   by doubling every year.

00:29:09   You're getting 10 pain this year and next year it would be 20 pain and then 40 pain

00:29:15   and then 80 pain.

00:29:17   It would just keep getting worse and worse because the distance and the gaps between

00:29:23   the old way that you know how to do it and the new way is only getting bigger.

00:29:27   I feel for you.

00:29:28   I'm sorry you haven't seen through it all now but I think you've done the right thing

00:29:32   in tackling it now and now continuing to put it off indefinitely.

00:29:37   Thanks for listening everybody, not null, and we'll talk to you in two weeks.

00:29:42   Bye.

00:29:43   [BLANK_AUDIO]