Empower Apps

Ben Scheirman is back for part 2 of our interview on SwiftUI Migration. In this episode we focus on navigation, data handling and Swift packages.

Guest

Announcements

Links

Related Episodes

Social Media

Email
leo@brightdigit.com
GitHub - @brightdigit

Twitter
BrightDigit - @brightdigit

Leo - @leogdion

LinkedIn
BrightDigit

Leo
Patreon - brightdigit

Credits

Music from https://filmmusic.io
"Blippy Trance" by Kevin MacLeod (https://incompetech.com)
License: CC BY (http://creativecommons.org/licenses/by/4.0/)
  • (00:00) - Discussing Data Handling in Swift UI
  • (01:22) - Observable Objects and View Models
  • (04:20) - The Power of Previews in Swift UI
  • (06:36) - Combining Combine and Async/Await
  • (10:29) - Interfacing Between UIKit and Swift UI
  • (17:12) - Challenges with Swift Package Manager
Thanks to our monthly supporters
  • Holly Borla
  • Bertram Eber
  • Edward Sanchez
  • Satoshi Mitsumori
  • Steven Lipton
★ Support this podcast on Patreon ★

Creators & Guests

Host
Leo Dion
Swift developer for Apple devices and more; Founder of BrightDigit; husband and father of 6 adorable kids
Guest
Ben Scheirman
Lead iOS Engineer for NIKE | Creator of https://t.co/opkAmLxbow, NSScreencast | Frequent dad joker.Moved to https://t.co/7961dq3XO9, follow me there

What is Empower Apps?

An exploration of Apple business news and technology. We talk about how businesses can use new technology to empower their business and employees, from Leo Dion, founder of BrightDigit.

[00:00:00] Discussing Data Handling in Swift UI
---

[00:00:00] Leo Dion (host): Welcome Apps. I'm your host, Leo Dion. Today I'm joined

[00:00:18] Leo Dion (host): with Ben Scheirman Ben, thank

[00:00:20] Leo Dion (host): you so much for coming on one elephant in the room we haven't talked about, and you kind of just briefly mentioned it? Is your data. You've got Like 32 choices of how you can have your hooked up to Swift UI, and on top of that you have to work with UIKit.

[00:00:36] Leo Dion (host): How are you doing it? Are you still doing observed Object? You still using Combined? Are you migrating to observable

[00:00:43] Ben Scheirman (guest): So we because can't 16. actually fantastic

[00:00:49] Ben Scheirman (guest): and I am looking forward to forward to being able to do that.

[00:00:53] Leo Dion (host): In the year

[00:00:53] Leo Dion (host): 2026

[00:00:54] Ben Scheirman (guest): but yeah 2026 probably but

[00:00:57] Ben Scheirman (guest): but we gotta move forward. So there's also the library by point freeze, and that is a

[00:01:03] Leo Dion (host): course point

[00:01:04] Leo Dion (host): free

[00:01:04] Ben Scheirman (guest): Yeah,

[00:01:05] Ben Scheirman (guest): that is a back port Yeah free

[00:01:06] Ben Scheirman (guest): framework that works

[00:01:08] Leo Dion (host): Oh that's

[00:01:09] Ben Scheirman (guest): maybe even 15. remember what, but basically it's, it does the exact same thing. It's, it's not rocket science. Like you can go look at the source code. It's, it's not too terrible to understand. But

[00:01:22] Observable Objects and View Models
---

[00:01:22] Ben Scheirman (guest): side, problem is that we currently are not yet. on SWIFT package managers.

[00:01:26] Ben Scheirman (guest): So we can't pull in libraries like that just yet. and stuck place where we, we, we would like to be able to adopt libraries like that but can't. So with the observable objects, I guess that the

[00:01:41] Ben Scheirman (guest): primary reason why observable object versus observable is that when you, I.

[00:01:47] Ben Scheirman (guest): When you property. So if you do that at the root of your app and anything in that

[00:01:52] Ben Scheirman (guest): changes, it triggers like a reflow of all the views inside of

[00:01:56] Leo Dion (host): Unless you mark it as

[00:01:57] Leo Dion (host): observed, ignored

[00:01:59] Leo Dion (host): on purpose.

[00:01:59] Ben Scheirman (guest): yes yeah, but like the observation framework just makes this a non-issue. 'cause it's just whatever you access in the view. So if you just own the object children, you don't need to when. when that happens, and, and you can, you can stuff in the environment and like four layers deep, it can pull it out again, and then at that layer it observes those are the views that are gonna get re-render. important. But we, we object, currently called a model that we use for each one of our views. That model is, is, I hate to use the term view model because this is like overloaded, but like as as know what thing is you know, call it what you want.

[00:02:37] Ben Scheirman (guest): I think the term model for if it's ex like. it's a, it's nested inside of our view type. So it's obvious that and that lets us pull dependencies handle all of the, any kind of action that happens from a button click or whatever gets routed to the model. Because we wanna be able to these tests, right?

[00:02:56] Ben Scheirman (guest): You should to test without touching the view. And then we have a pretty complicated dependency graph, and I don't want to, send the entire world into these models. I want something really light and focused so that these things can dead simple. Like, I need to fetch this thing and get back some results.

[00:03:16] Ben Scheirman (guest): And so if that dependency. That, that we were calling is a little bit obtuse or, you know, it doesn't fit, doesn't quite fit the need then, or maybe it requires two other dependencies to actually 'cause it needs to pull in data from here and then consult this list over here in order to return the right set of data.

[00:03:34] Ben Scheirman (guest): I will hide all that stuff in a closure. And that closure becomes the, the, the new dependency. So This is gonna be like a, like a, I'm trying to think of a, an this is your which will just give you right? It doesn't need to consult. Oh, I need to get information from this orders API. Then I need to get images for the products over here or whatever. And then I need to check to see if this thing was whatever it is. You can marry those things in a way that they, you encapsulate all that logic closure and just pass that closure to the model

[00:04:09] Ben Scheirman (guest): so that it knows how to fetch data.

[00:04:11] Ben Scheirman (guest): And that way your view isn't really interesting it, you know, you sort of separated responsibilities in that way and you can of course

[00:04:20] The Power of Previews in Swift UI
---

[00:04:20] Ben Scheirman (guest): test all these things. But it becomes trivial now for that dependency just by providing a new closure that just returns a single item, returns two

[00:04:30] Leo Dion (host): Yep.

[00:04:31] Leo Dion (host): Yep.

[00:04:32] Ben Scheirman (guest): that's another thing we haven't really talked about, but previews huge superpower that I I people were as, as I am. I think a lot of people just abandoned previews 'cause they're kind of kind of

[00:04:43] Ben Scheirman (guest): hard, you know, they're hard,

[00:04:45] Ben Scheirman (guest): to do. Right.

[00:04:45] Ben Scheirman (guest): Especially in

[00:04:46] Ben Scheirman (guest): a big app.

[00:04:47] Leo Dion (host): Yeah.

[00:04:47] Leo Dion (host): I mean I've had issues with just like previews not compiling properly and not and I've just had to like, I don't want to

[00:04:54] Leo Dion (host): abandon 'em 'cause I

[00:04:55] Leo Dion (host): want to quickly see stuff. And if I do wanna use previews, what I've ended

[00:04:58] Leo Dion (host): up doing at this point is like I use the preview in a new app that's a test

[00:05:04] Leo Dion (host): app. Right. And be like, okay, I want it to look like this. And then copy that over to

[00:05:08] Ben Scheirman (guest): Yeah. I, so I, I am of the opinion that like component and then every list of that component or whatever like should have a preview that contains all the states and mode, light mode, dynamic type or whatever. Empty states, error states, you know, like if you were to look at a design library from, you know, a web, like a, like for instance like Facebook or, or Twitter or whatever Airbnb.

[00:05:38] Ben Scheirman (guest): I'm just trying to think of like, large organizations are gonna have like a. Like a style guide, like basically, you can go in and be like, here's typography. Here's all the different things you can do, And here's when you should use them. And these are live examples they render right there. And this is easy to do in the browser because you're already in the browser, right? Like if these things are in HDML and CSS and JavaScript, well they can just run it right there. And so here are all our buttons, here's how you can use how they respond to hover and clicked and disabled states and all that stuff. like the playgrounds, not playgrounds the previews are our way of doing that in the best way possible so that, so that we can see something that, see how it works, we can

[00:06:16] Ben Scheirman (guest): interact with it. And I would say 90% of my work for that collection view component, I, I talked

[00:06:23] Ben Scheirman (guest): about 90% of that was done iterating on a preview in a

[00:06:27] Leo Dion (host): And now the last couple years, they're agnostic as far as whether use Swift UI or UI codes So that's a

[00:06:33] Ben Scheirman (guest): They always

[00:06:33] Ben Scheirman (guest): were.

[00:06:34] Leo Dion (host): They always

[00:06:36] Combining Combine and Async/awaitt
---

[00:06:36] Ben Scheirman (guest): you just wrap it your UIV controller representable and you're done.

[00:06:40] Leo Dion (host): Oh

[00:06:40] Ben Scheirman (guest): It just now does this for you.

[00:06:42] Ben Scheirman (guest): So

[00:06:43] Leo Dion (host): to object, right? And then are you using Combine underneath

[00:06:50] Ben Scheirman (guest): So we use combine where it makes sense and we use async await for,

[00:06:55] Ben Scheirman (guest): Where it makes sense. And, and I, I've talked about this before where I, I, I think, Johnson Dell's podcast, we talked about mixings with do I or sorry, mixing async await and And like when to use one. Should we ditch, combine, combines days?

[00:07:09] Ben Scheirman (guest): Our guests are numbered. But I how hard it is to deprecate a framework in Apple land and it go away. There are just certain things that I just feel like combined is just, it's just easier to read and write and, async, await make some make things way easier.

[00:07:24] Ben Scheirman (guest): And so so we're still writing new

[00:07:27] Ben Scheirman (guest): code that uses combine. We're still mixing that sometimes with async weight. I still don't really think in async So there's very few of that type of

[00:07:35] Ben Scheirman (guest): async stream type of I like a a a loop that just runs forever seems

[00:07:41] Ben Scheirman (guest): weird to

[00:07:41] Ben Scheirman (guest): me.

[00:07:42] Leo Dion (host): it does seem weird.

[00:07:43] Ben Scheirman (guest): 100%

[00:07:45] Leo Dion (host): I just wrapped my, I just created my first

[00:07:47] Leo Dion (host): Async stream and it's it made sense in that case, but what I've found is anything that's one of those built in publishers, like a timer or like a notification or even key value stuff, key value observing, it's just so much easier to do and combine.

[00:08:04] Leo Dion (host): And like you said, it's just easier to think and combine as opposed to this weird

[00:08:09] Ben Scheirman (guest): glad Asy is a thing now, continues. So like debounce, which I was how would you even write that? That to me, that I was trying to think of like, you know, how it, how it would be written, and that's just a different style than, than writing operators in, in Combine.

[00:08:26] Ben Scheirman (guest): But I will say that this is probably my own just experience and comfort level with Combine. I was a holdout on all the programming I found it to be confusing. and then

[00:08:34] Ben Scheirman (guest): I really dug into it and I

[00:08:37] Ben Scheirman (guest): then I was like,

[00:08:37] Ben Scheirman (guest): I need to make a course about this. So that's where the Combined Swift course came

[00:08:41] Ben Scheirman (guest): from.

[00:08:42] Ben Scheirman (guest): And so now I feel very, very comfortable in combined. So of the reason why I'm like not afraid to keep using it.

[00:08:48] Leo Dion (host): I have a new app and I still, I have a couple of and then everything else is observable basically and that's I feel like observable was a thing that's okay, now I don't need to combine. Even though I love it like so, yeah. I totally agree

[00:09:02] Ben Scheirman (guest): Yeah. So the, so the data piece our app is mostly read only. So that is, you know, when you have an app that is taking in

[00:09:12] Ben Scheirman (guest): data you know, I, I have,

[00:09:15] Leo Dion (host): would an

[00:09:15] Leo Dion (host): order?

[00:09:16] Leo Dion (host): Would

[00:09:16] Ben Scheirman (guest): can't, yeah. But that's, from my perspective, whole thing, right? So Like so yes, you know, we could write that, but that's, you know, luckily it's, it's not the e-commerce part of it is not our responsibility. But like, say tonal therapy, this is like the easiest example I could, I could, come up with, because it's like the only app that is like kind of standalone. It doesn't take data from the internet and display it. Like 90% of the apps this you you enter in a frequency of like a tinnitus frequency that you can hear, and then this will like, play a pattern.

[00:09:47] Ben Scheirman (guest): And so, this is essentially a slider that's connected to a text box, so that, And which is connected to the model. And so whether or not you adjust the slider or type in box, they both end up sort generate a new sequence

[00:09:58] Leo Dion (host): right.

[00:09:59] Ben Scheirman (guest): and so yeah, that two way binding, it definitely, you know, still works. And then if you need to marry that with an existing architecture that wasn't built with these tools you I, feel like I. Having bindings for the model so that you know when it changed and then glue that to however else you would've updated your own internal model.

[00:10:20] Ben Scheirman (guest): And I think it's, it's okay to not ha to like break your part, your model up into smaller pieces so that that has to serve both roles, but you

[00:10:28] Ben Scheirman (guest): can have like some

[00:10:29] Interfacing Between UIKit and Swift UI
---

[00:10:29] Ben Scheirman (guest): glue that you pass a Swift UI to make the Swift UI call site really nice and clean and then you glue those two things together with to the value using Combine or asy CO eight observation

[00:10:39] Ben Scheirman (guest): framework.

[00:10:40] Leo Dion (host): Is there anything else you wanna talk about when it comes to interfacing between UIKit and Swift UI

[00:10:47] Ben Scheirman (guest): There's one thing that so I mentioned that we started on this process of. Sort of changing out our lists. So I had to create this collection view component. And, though, one of the early things we did to try to get some stuff working in Swift UI was wrap some existing UIKit components in Swift UI, sorry, UIKit components in Swift UI.

[00:11:10] Ben Scheirman (guest): So, so using NS or UI view controller representable to wrap an existing component is essentially a button, but underneath that is tons and tons of valuable logic that we don't wanna mess up, right? And so just wrap that in Swift UI Now the call site is really easy. It's, we can use it in our Swift UI views directly. That happened to be a component that needed to be used inside of a cell and UI hosting controller

[00:11:38] Ben Scheirman (guest): that I

[00:11:38] Ben Scheirman (guest): mentioned was really nice that you could just plop in a Swift UI view. That one will give you a fat warning if you do this, if you have a

[00:11:45] Ben Scheirman (guest): so we're, so we're going from UIKit collection view

[00:11:48] Leo Dion (host): Is this a runtime Warning, I

[00:11:50] Leo Dion (host): assume

[00:11:50] Leo Dion (host): is

[00:11:51] Ben Scheirman (guest): Runtime warning, you're going from a UI which is a collection view Swift UI, which is the hosting configuration view. inside of that view you have a UI view controller representable. It will fail, right? It'll runtime, give you a warning. This is an unsupported configuration and it will not render

[00:12:08] Leo Dion (host): Okay

[00:12:09] Ben Scheirman (guest): Because view controllers have to, they have a, an in variant that you have to satisfy, which is that they have a parent view controller or they're part of the view controller hierarchy. And that's how things like safe area and sets and trait changes and you know, sizing changes and stuff like that viewed it, a fear viewed will disappear.

[00:12:30] Ben Scheirman (guest): All the, all those things flow through the parent child view controller by putting a Swift UI

[00:12:39] Ben Scheirman (guest): Wrapper, a round of view controller inside of a Swift UI view, and then putting UI view controller Now you've broken that like that little component doesn't have a reference to a parent anywhere.

[00:12:49] Ben Scheirman (guest): And so I I was running full speed with this collection thing and the hit a brick wall with this one and I and and it ended up process and think like, well, how did Apple implement UI hosting controller because it's, or sorry, UI hosting configuration 'cause it's fast.

[00:13:06] Ben Scheirman (guest): That was the other thing fast worried about is like the UI hosting view has a generic of a root view UI hosting controller, sorry, has a generic of that root view. And if you, and it's mutable so you can swap out that view for another one. And that's what UI hosting cell.

[00:13:22] Ben Scheirman (guest): So it's just, it's keeping that same space reserved. There's only one UI view in there, so you're not like constantly creating new UI views and then de and allocating them as you scroll, right? It's one of those, but then you swap, swap in and out the, the Swift UI content and that is really fast. So I went that embeds a UI hosting controller of a known view type.

[00:13:45] Ben Scheirman (guest): And then that one has a method on it where I

[00:13:48] Ben Scheirman (guest): can set its parent So

[00:13:49] Ben Scheirman (guest): that I know I have a way to set the parent view controller of that UI hosting controller.

[00:13:54] Ben Scheirman (guest): This is kind of hard to say on podcast form, but

[00:13:59] Leo Dion (host): So

[00:13:59] Ben Scheirman (guest): so, I sort of

[00:14:02] Ben Scheirman (guest): like, how, how did Apple implement UI hosting configuration? Like they're, they're using UI collection view cell, so like they're probably using UI hosting

[00:14:10] Ben Scheirman (guest): controller.

[00:14:11] Ben Scheirman (guest): So I went that route and did it manually and I was able to set that parent view controller manually and it wasn't,

[00:14:18] Ben Scheirman (guest): it was probably a dozen lines of code to get this done. And so it

[00:14:22] Leo Dion (host): that is something people

[00:14:22] Leo Dion (host): should watch out

[00:14:23] Leo Dion (host): for, the hierarchy. Yeah. You're, it's not

[00:14:27] Leo Dion (host): gonna

[00:14:28] Ben Scheirman (guest): yeah. And it like, when I out, I'm like, oh we're going UIKit oh UI to UIKit to kit to Swift UI to UIKit like, and it does work. But you gotta be aware of all these layers because, the way that Swift UI does sizing and layout is different from the UIKit does and and those Swift UI doesn't care about your auto layout constraints. it cares about your. Yeah, yeah. This has taken me a to to internalize. But I will say like the, the little tidbit that has helped is if you have an intrinsic content size for a view or a preferred content size for a view controller if you save fixed size on the Swift UI wrapper, it will adhere to that size as if it were the that component.

[00:15:13] Ben Scheirman (guest): And that a bunch because I was like, how do to know how big the And the answer is intrinsic content size for views, preferred content size for controllers, and then use the dot fixed size,

[00:15:25] Ben Scheirman (guest): Modifier on the Swift UI site.

[00:15:28] Leo Dion (host): We had one question from Swift Dev when using built in views, for example, a CN contact view controller or an EK event view controller in Swift UI is there a way to have the toolbar showing without wrapping set controller in a UI navigation I know the easiest solution is to put it in a sheet, which is then, which isn't, which.

[00:15:51] Leo Dion (host): Which then just a UI navigation controller without a ui, Swift UI navigation. But I'm wondering if there's a way to do it without using a sheet. If you wrap it a UI view CONT navigation controller, it's already in Swift UI navigation stack. It will show two navigation bars. If you don't wrap it in a UI navigation controller, it won't show the edit button. Do you know what this Do

[00:16:17] Ben Scheirman (guest): situation is

[00:16:19] Ben Scheirman (guest): bar. Obviously we I guess the question is, is the component, is Apple's component coming with its own navigation controller, or does it expect you to

[00:16:28] Ben Scheirman (guest): right

[00:16:28] Ben Scheirman (guest): your And,

[00:16:29] Ben Scheirman (guest): right two that were mentioned were the contact picker and what was the other one?

[00:16:32] Leo Dion (host): The event view controller for event

[00:16:35] Ben Scheirman (guest): for like calendar. Okay. Yeah, I mean I would these are both, these, both predate Swift UI, the contact one by a lot.

[00:16:43] Ben Scheirman (guest): Yeah

[00:16:43] Ben Scheirman (guest): I would

[00:16:44] Ben Scheirman (guest): I

[00:16:44] Ben Scheirman (guest): would not, I I would just try to like make that controller happy in whatever way made sense for that controller, which probably means

[00:16:53] Ben Scheirman (guest): playing UIKit navigation controller in a sheet.

[00:16:56] Ben Scheirman (guest): If you, I also think that, that those things are generally modal in behavior

[00:17:00] Ben Scheirman (guest): anyway. You like, you go there to a thing then you

[00:17:02] Ben Scheirman (guest): dismiss it and now you're

[00:17:03] Leo Dion (host): It your it should be like a little

[00:17:05] Leo Dion (host): I

[00:17:07] Ben Scheirman (guest): I, I push this on your own navigation stack. oh, I fill out some details and now I click next,

[00:17:12] Challenges with Swift Package Manager
---

[00:17:12] Ben Scheirman (guest): and now like, next hierarchy is Apple's UI for picking a contact. That me.

[00:17:16] Leo Dion (host): Yeah 100% I agree. Yeah. I had one other topic I wanted to cover. Now that you're here we talked about Swift Package Manager. What is that, I guess at Nike?

[00:17:30] Ben Scheirman (guest): There's probably too many internal details to

[00:17:33] Ben Scheirman (guest): to discuss. Large companies move slowly, right? We have a

[00:17:36] Leo Dion (host): of

[00:17:37] Ben Scheirman (guest): lot projects. of

[00:17:40] Ben Scheirman (guest): yeah, it's, it's it's.

[00:17:42] Leo Dion (host): Is it on the goal

[00:17:43] Leo Dion (host): post

[00:17:44] Leo Dion (host): Is

[00:17:45] Ben Scheirman (guest): yeah, yeah, yeah. We actually hit a blocker. We, we were gonna do it last year and we hit a major blocker and have engaged Apple in trying to out But yeah, it's, know, like big companies do things in unique ways, I think sometimes, and sometimes that match the ideal path that most people would encounter. So I don't think most people would even be that we run into. So

[00:18:06] Leo Dion (host): yeah. Yeah. that makes sense. So.

[00:18:08] Leo Dion (host): One thing that you helped me on was introducing me to sub re and that was a big benefit. I'm right now in the middle of a rewrite of one of my packages. but do you think the situation has improved with developing simultaneous package development when you have like dependencies and stuff?

[00:18:26] Ben Scheirman (guest): I Do

[00:18:28] Ben Scheirman (guest): no, I don't think it's improved at all. So, so maybe some context for the listeners. You monorepo, which is everything that your company develops, all everything or in your own repo. You can still do third party stuff that comes in externally, but if you want to iterate on those components while you're building a thing, which is what we most, most of the time we do, then, then having them in one repo is actually kind of nice and it,

[00:18:55] Ben Scheirman (guest): It, it's not even my preference. I just

[00:18:57] Ben Scheirman (guest): think that there are benefits, right? So like the, the, the

[00:19:00] Ben Scheirman (guest): alternative is like every component that you have

[00:19:02] Ben Scheirman (guest): has a separate

[00:19:04] Ben Scheirman (guest): GitHub repo or GI Git repository somewhere maybe on

[00:19:08] Leo Dion (host): in either a

[00:19:09] Ben Scheirman (guest): I'm specifically

[00:19:10] Leo Dion (host): ta

[00:19:11] Leo Dion (host): either I was just gonna say, I'm specifically

[00:19:12] Leo Dion (host): talking

[00:19:13] Leo Dion (host): about like a swift, like an open source project you wanted to publish

[00:19:19] Ben Scheirman (guest): But it,

[00:19:20] Ben Scheirman (guest): has other packages that are part of that.

[00:19:23] Leo Dion (host): Yeah like third, park, like you want a, different plugin for instance

[00:19:29] Ben Scheirman (guest): Yeah.

[00:19:29] Ben Scheirman (guest): And are

[00:19:30] Ben Scheirman (guest): hosted in the same repo or, or in separate repos.

[00:19:33] Leo Dion (host): Right, right. But it's put But

[00:19:35] Ben Scheirman (guest): If you put

[00:19:35] Ben Scheirman (guest): 'em in

[00:19:35] Leo Dion (host): put

[00:19:36] Leo Dion (host): But it's hard harder to publish it, like as

[00:19:38] Leo Dion (host): a mono repo. So, for instance, in my case I have a, I'm working on sublimation, which is my package for allowing people to auto, like if you have a iPhone, you want it to auto detect your vapor server.

[00:19:51] Leo Dion (host): It, you could either advertise it via ngrok and some sort of key value pair on the cloud, or you could use Bonjour and advertise it that way. So there's separate packages for that.

[00:20:03] Leo Dion (host): That's the current example that I'm running into right now. So right it's actually a mono repo, and then I'm gonna split them off into in development, like not extra not advertised yet, but like it's in a mono repo.

[00:20:15] Leo Dion (host): And then the plan is to take those directories and put 'em out into separate repos. Once I know that everything works

[00:20:21] Ben Scheirman (guest): Yeah. I think that that. So like if you wanted to iterate on all those things, but keep them in separate repos, then you could do a local checkout. You could tell your package manager the Swift package manager, that I have a local package instead of a remote one.

[00:20:34] Leo Dion (host): Yep. That's what

[00:20:35] Ben Scheirman (guest): what I'm doing

[00:20:36] Ben Scheirman (guest): that way. In the CocoaPods way, if anything in your pod file reference to Local up under development dependencies and symlinked to those folders in your Xcode project. So when, could you could edit them directly you when done, you push it, you tag it, you change your pod file reference to point to the tag version and you're done. It was actually pretty nice story in, in swift Package a little bit more cumbersome to do that, I think.

[00:21:02] Ben Scheirman (guest): And I, I haven't, like, I use Swift Package Manager on basically every project I do, but it's, all of those are tiny in comparison to what, to what I'm working on at, at Nike. But, there are certain things that I have heard have been problematic on larger projects like of creating a local version of a transit of dependency.

[00:21:24] Ben Scheirman (guest): So say I have dependency A, but a a which I want to work on. And so pulling in dependency B locally, when you resolve A, you need Swift package manager to also as a local package so that, so that it all I don't know if that's solved yet.

[00:21:37] Ben Scheirman (guest): I then there's the the other problem of like, X code decides to resolve packages when it wants to, again, I know this is but if you've got a bunch of packages and then you get on a plane and open up a project. Like, up your editor while it's it's to packages.

[00:21:53] Ben Scheirman (guest): And I, I kind of of of CocoaPods where you're like manually saying, I'm ready to pod install here. And at that point you've got a copy of the, the code Twist is

[00:22:02] Ben Scheirman (guest): actually a, a project that I'm really interested in.

[00:22:05] Leo Dion (host): Yeah. I've had Pedro

[00:22:06] Leo Dion (host): on here

[00:22:07] Leo Dion (host): talking about tourist and I feel

[00:22:09] Ben Scheirman (guest): They do the, they do

[00:22:11] Ben Scheirman (guest): They do

[00:22:12] Ben Scheirman (guest): I

[00:22:13] Ben Scheirman (guest): does amazing

[00:22:14] Ben Scheirman (guest): you have a command to resolve the packages. It does it with Swift Package Manager, checkout and then when you integrate with Twist, it

[00:22:21] Ben Scheirman (guest): uses

[00:22:22] Ben Scheirman (guest): that local version.

[00:22:23] Leo Dion (host): Yeah. Yeah. Completely. Anything else Ben, you wanna talk about

[00:22:28] Leo Dion (host): before we close out

[00:22:30] Ben Scheirman (guest): Oh, I could talk about this stuff all day

[00:22:33] Leo Dion (host): How much time do you did you still wanna chat about this wonderful studio that I'm about to tear down I. wonderful

[00:22:38] Ben Scheirman (guest): you want to. Sure.

[00:22:39] Ben Scheirman (guest): to tear

[00:22:39] Leo Dion (host): Okay, well end it

[00:22:42] Leo Dion (host): far the podcast episode, and record a separate thing and I'll post a link to that in the show notes. Ben, thank you

[00:22:50] Leo Dion (host): was

[00:22:52] Ben Scheirman (guest): Yeah.

[00:22:52] Ben Scheirman (guest): it really great conversation. Appreciate it.

[00:22:54] Leo Dion (host): Where could people find you online

[00:22:56] Ben Scheirman (guest): I

[00:22:56] Ben Scheirman (guest): You can find website@benScheirman.com

[00:22:59] Ben Scheirman (guest): That will have links to n and combine Swift and some of the other apps I work and I'm on Mastodon at ben

[00:23:05] Ben Scheirman (guest): s@mastodon.xyz.

[00:23:09] Leo Dion (host): Awesome. People can find me on Twitter at Leo

[00:23:11] Leo Dion (host): Dion. At Leo g Dion at am on Mastodon. If you wanna come on let me know. I'd love to have you on as a guest. If you're watching this on YouTube, please and subscribe. I greatly