Swift Package Indexing

Inspired by a recent YouTube comment left on the previous episode, Dave and Sven talk about cross-platform Swift development with Visual Studio Code, Windows and Wasm compatibility, and about how Dave should have answered a question about adding a package into the Swift Package Index!

News
Packages

Creators & Guests

Host
Dave Verwer
Independent iOS developer, technical writer, author of @iOSDevWeekly, and creator of @SwiftPackages. He/him.
Host
Sven A. Schmidt
Physicist & techie. CERN alumnus. Co-creator @SwiftPackages. Hummingbird app: https://t.co/2S9Y4ln53I

What is Swift Package Indexing?

Join Dave and Sven, the creators of the Swift Package Index open-source project, as they talk about progress on the project and discuss a new set of community package recommendations every episode.

So we had a YouTube comment this week,

which asked us a question,

which I think we should kick off this week's show

by answering it.

So the comment was from Encapsulatio,

or Encapsulatio, I'm not quite sure how to say that.

And it's about Swift on Linux and Windows.

So we talked a little bit about Swift on Windows,

and I think probably a little bit about Swift on Linux

in the last episode.

And this comment says,

"Does Swift work on Linux and Windows

just as well as on Mac

when it comes to a developer experience?

What about developing apps that work on Android?

Can you talk about cross-platform development in Swift

and also cross-platform compilation of Swift software?"

So I think the answer to that is yes, we can.

(laughing)

Well, we can certainly try.

Well, we can certainly try, yeah, exactly.

So let's try, shall we?

- Yeah, because can.

Have we actually?

Have you made any attempts to run Swift on Windows

or Android?

- On Windows, no.

On Android, no.

On Linux, kind of.

- Yeah, I feel more comfortable

about that side of the fence.

- Yeah, and I think that's probably potentially

where we should focus,

because, and I do think that the question,

'cause there was a follow-up post afterwards

and it did talk about Linux specifically.

So I think the question is mainly around Linux

rather than Windows and Android,

but we should potentially touch on those too.

- Well, the good news is if we talk about Linux,

I guess a lot of it will apply to Windows

because as we probably get into it fairly quickly,

the primary editor on Linux is gonna be VS Code,

which is a first-class citizen on Windows, right?

- Exactly, yeah.

And in terms of developer experience,

which is what this question is primarily about,

I think that is really all we probably need to say.

As far as I know, VS Code works on Linux.

It certainly works on Windows.

It definitely works also on Mac.

- So there is a relatively official these days

extension for VS Code,

which I think is under the stewardship

of the server work group, is it?

Or is it completely independent?

- It is.

I think it has moved into the official servers,

Swift account and is officially maintained, I believe.

- Yeah, I thought so, yeah.

- And the maintainer is Adam Fowler.

We should mention him because he's done a lot of work there

to make that really nice.

- An enormous amount of work, yeah.

And yeah, so that extension is available

in the VS Code extensions store, if it's called the store,

but whatever you install the extensions from,

it's available there.

And it comes along with a whole load of stuff by default.

So it hooks into the LSP,

which is the language server protocol, is it?

- Yes.

- Yes.

- We've done our homework.

- As you can tell, this podcast is excruciatingly researched.

(laughing)

Language server protocol, yeah.

So that gives you things like completion and highlighting

and that kind of stuff.

And then there's also some extras in that extension

that do, for example, when you open up a Swift package

with VS Code, it does a dependency resolution for you.

There are also some commands in there

that you can build and test your package.

So I would say it's a pretty good experience.

In fact, I would say it's actually getting on

for a great experience to develop Swift in VS Code

with that extension installed.

And of course you can then do that on all those platforms,

Linux, Windows, and Mac.

- Yeah, and just to extend that a bit, VS Code,

I've been using it a couple of times

because while we do development mainly on the Mac

for the SPI server project, we deploy on Linux.

So we sometimes have the need to actually run the,

or compile and test on Linux,

because sometimes there might be small differences

or things that we're debugging

that might only happen on Linux.

So we have a certain need to actually run it on Linux

ourselves as well, not just when we actually

deploy the server.

And that's when I use VS Code and even Nova recently,

because that also has now a Swift extension

with LSP support.

So while it doesn't have the test runner stuff,

it does have the autocomplete and the pop-up stuff

for the autocomplete, so that's quite nice.

And VS Code brings in addition the little test runner UI,

like on the Mac you have these little diamonds

that you can click.

I believe that also works on Linux.

I don't try that often because of the nature of things

I tend to do when I get to that point,

but I believe that is now supported and should be working

so you can run tests that way individually

or just all of them.

That's quite nice.

- And I think it is worth saying that,

as far as I know, both of our experience

with running this extension in VS Code

is running the extension in the Mac version of VS Code.

And as you say, you can run those developer containers

to run the software that you're working on

under Linux inside a container.

But certainly I haven't tried all of this in VS Code

on different platforms,

although I do believe it all works.

- Yeah, I imagine that might even be a good way

to get started on Windows

while support is probably not there fully.

There was just recently someone said they tried

using Swift on Windows and didn't have a great experience.

And a better experience for now might be

to run the same way we do on the Mac.

You run VS Code and then you run a dev container

with the Swift image of a Swift image

as a Linux container on Windows.

I would imagine that works just the same

as it does on the Mac.

I haven't tried that.

I don't know how good the experience is in Docker

for Windows, but I would imagine

that would work the same way.

- All of the component pieces are certainly available.

- Yeah, yeah, definitely.

So that's certainly probably the easiest way

to get started.

And if you're worried about performance,

that's actually an interesting thing

I found out the other day

because I ran our test suite in a Linux container

on the Mac.

This is an Apple Silicon Mac.

And to my surprise, the tests actually run faster

in the container.

So in Xcode, they run in, I think, like 60 seconds

and in the container, it ran in 40 or 45

or something like that.

It was a noticeable difference.

- I was gonna say, that's quite a significant difference.

- That's why I actually timed it

because I noticed, yeah, it was really,

I posted about it because I was so surprised

that it was so much faster.

I think it might be the terminal output.

So the console in Xcode is pretty slow, I believe.

And I wonder if that's the reason.

I haven't actually tried running it in terminal

on the Mac to see if that makes a difference.

- Well, maybe rather than upgrading my Mac,

I should switch to Linux.

- Well, good luck.

(laughing)

- Yeah, so I think, and I was gonna,

so I'm glad you brought up Nova

because I know you've been using it recently

and I'm glad to hear that at least some of that

is going across to other editors.

I don't know of any others apart from VS Code and Nova.

I mean, almost certainly you can get this working in Emacs

because you can get anything working in Emacs, right?

(laughing)

But I haven't heard of any other editors

that have at least advertised.

I know other editors do use the LSP,

but I haven't heard of any others

kind of advertising support for Swift.

So if you do know of any,

then please drop us a comment either on the YouTube video

or actually I don't think we have comments

on the podcast, do we?

So yeah, if you know of any,

then drop us a comment on the YouTube video.

- Yeah, and I believe that there should be a fair number

because LSP seems to be like the common way

to do this sort of thing these days.

And that should open up support

for quite a number of editors.

- And like I say, there is that certainly,

that LSP is in a lot of editors.

But if it does more than that,

because I think that's where code stands out, right?

- Yeah.

- So yes, thank you to Adam and everyone else

who worked on the VS Code plugin

because I'm sure there are more people.

It's something I use,

'cause I use code to develop all the JavaScript and CSS

for the package index.

And so when I'm doing that,

in fact, I was doing it this afternoon,

I also ran the server through VS Code.

And so that's the situation in which I use VS Code

kind of in anger to do real work.

When I'm working purely on Swift code,

I do still do it in Xcode.

I find that experience is still noticeably better

than VS Code, but it's certainly not something

you're hobbling along with, it's a real, it does work.

- It does, and there are people,

especially those who work just exclusively on Linux,

who use it as an everyday tool

and do say that it's working great.

So I think it's a viable approach to use Swift on Linux.

I don't think you're that,

you can have a great experience, I believe.

- Yeah, absolutely, yeah.

And then the final part of the question is Android.

And I am gonna basically say that I'm not very well up

on making Android apps in Swift.

I know there was a project,

and in fact, I'm sure that project has continued.

I know there was a project that got some way towards that,

but I don't know the current status of that.

- Yeah, me neither.

It popped up, but it was quite a while ago

that there was some activity around Android support.

And I don't know where that went.

I don't think it's,

in the hierarchy of next platforms,

I believe Windows is probably the closest

to seeing proper support.

And then Wasm is the other one that comes to mind.

I think that's the order

in which we'll see new platforms appear

in our compatibility matrix for sure.

- Sure, yeah.

The only other thing to mention here is

it's not running Swift on Android,

but actually one option for creating cross-platform,

at least backend logic, is Kotlin Multiplatform.

So Kotlin is the language that you might develop

any Android app in,

which I believe is sitting on top of Java still,

but it's a very different language than Java.

Much more modern, much more like Swift actually.

And Kotlin Multiplatform is a technology

that allows you to share Kotlin code

between Swift and your Android applications.

And that I believe is really quite far along.

You know, that's usable.

- Right, is that sort of like in spirit,

like the C++ support in Swift?

Does it just mix objects and call

from one language to the other, or how does that work?

- Really great question, yeah.

And we'll leave it there.

(laughing)

Really, really just a great question, yeah.

- We might have more of that in the future perhaps.

- I think what we're really acting as here

is the inspiration to Google

and go and search.

- And maybe there's someone listening to this

that's saying, "God damn it, I know this."

- Completely uninformed podcast hosts, yes.

Actually, no, not completely uninformed,

only dangerously uninformed.

- Speaking of questions, Dave,

how do you add a package to the Swift package index?

- How do you add a package to the Swift?

You go to the add a package page.

- That's totally out of the blue, isn't it?

(laughing)

How do you add a--

- I wasn't expecting that question,

but yes, you go to the add a package page.

- Exactly, no one expects the Spanish inquisition.

(laughing)

- Is it a trick question?

- No, it is a very straightforward question,

which you have actually answered recently,

which is why I'm bringing it up.

- Yeah, you go to the add a package page

on the package index site,

and that takes you to a GitHub issue

that starts a workflow that adds the package to the list,

and I'm completely blanking on why I might,

why this might be relevant.

- So you went on a competing podcast the other day,

well, I listened to it.

You were on the "More Than Just Code" podcast

with Tim Mitra.

- I was on the "More Than Just Code,"

yeah, absolutely, yeah.

- You were, you were,

and you've been asked this very question,

and I was the one listening and almost shouting,

"Dave, no, it's easier, it's easier, it's easier."

- What did I say?

- Well, you were kind of apologetic

that it is, that it uses Git and is a bit complicated,

and you said there's a button to click,

and then you add the URL and stuff,

and I thought this whole time,

no, it's actually easier, it's actually easier than that,

and I wanted to just bring that up,

not to shame you or anything,

because it is, that's how we--

- That's just a happy side effect, right?

- (laughs) Exactly.

(both laughing)

No, because I wanted to bring it up

because I don't think many people know it,

and it's sort of hidden, right?

There is no UI for that, really,

but actually, I find the easiest way,

and that's how I add packages to the indexes.

If you are on a GitHub page,

you just replace GitHub in the URL

with Swift package index,

and then you land on a page which has a button,

and then you just click buttons from there.

You have no typing to do whatsoever

because it pre-fills the pull request that we then open

with the URL already put in

because you've just come from the site.

So to explain what's happening there,

if you replace the GitHub in the domain name

with Swift package index,

we go to a package page stub.

We obviously don't have the package yet.

Well, if we have it already, you're already done, right?

You land on the page and you see,

all right, there's nothing for me to do

because the package is already there.

If it isn't, instead of rendering a 404,

what we do is we show a page which has a button

where you can either go back to the GitHub page

if you landed there in error,

or you can click a button there that says add this package,

and then it opens up a pull request

with everything filled in,

and that's why I wanted to bring it up

because I find that's actually the easiest way to do it

because you can both check if it's already there

and then add it in one step.

There's no fiddling around to do,

and that's why I find it really easy.

And if you want, you can even go further,

and that's what I do.

I have a little bookmarklet that does a replacement of the,

and you wrote this, actually, this bookmarklet.

So it does a replacing of the GitHub

in the domain name via JavaScript.

So all I do is click buttons.

I don't ever do replacement typing.

I'm not sure how we could better expose that

or make that bookmarklet easier to install.

I mean, I'm not sure if people add lots of packages

that they might want to keep that bookmarklet around,

but I do because I often add packages this way.

But even so, I think it might be just easier

to just try a TypeSwift package index

over the GitHub in the domain to get it all started.

I don't know.

- So yeah, I'm not sure how we could make

that process more visible.

I deliberately don't mention that process.

It is also the process I use to add packages to the index,

and it is by far the easiest way,

but that manual step of either knowing

that you can do it with a bookmarklet

or manually typing in Swift package index to replace GitHub

is enough for me to not exactly keep it secret,

but not talk about it because it feels like a cheat code

for adding packages to the package index.

(laughing)

I think the point that I was talking,

I don't remember exactly what I said

just 'cause I don't remember many things.

(laughing)

There are many things I don't remember,

but I don't remember exactly what I said with Tim.

But I think the point that probably came up

was that that process of the whole package list JSON file

is like there are some problems with that file

and it adds some friction to,

no matter what this process around

getting something into that file is,

it adds some friction to that process,

but that it's important because that's the only record

of who added what package to the index.

And it's good just to have a little bit of a trail

of like where did each package

eventually kind of originate from.

But when we've been kind of making it easier over the years,

but actually the mechanism that we've used to make it easier

and I should credit James Sherlock here

who did a lot of the work to initially get this working.

What we've actually done is we have made that process easier

but we've added various different ways

to do the same process.

And that in itself kind of makes things

a little bit more complicated.

Like we still get pull requests

that are people cloning the repository, editing the file,

because that was the very original way of doing it.

And there's probably some blog posts and stuff out there

that say, this is how you should add a package to the index.

And so people follow that.

And I do feel like we're kind of,

it's a pain point of the package index

that I don't know how we can easily fix it,

but it has been on my mind a little bit recently.

So there's probably a bit of latent guilt

when Tim asked me a question.

I wanted to confess my sins on the podcast.

- I don't know.

- The sins of adding a package.

- I see the upsides probably more than the downsides here

because even if the list was in a different format

and maybe not hosted in a GitHub repository,

we'd still probably want to have some sort of audit trail

who added it and that.

- Yes.

- Sort of complexity doesn't go away.

In fact, I think using GitHub here is making it easier

because otherwise, would you want to ask people

to create an account to add a package?

I feel like that's worse.

So I can't think of lots of ways to make that

actually smoother than it already is.

- Yeah, so this is entirely why it is still this way.

And I think your point is well-made

that you don't want to get people to add,

create an account simply to add a package.

I think there is gonna come a time

where there are several reasons

you might want an account with package index.

And as that happens, if that happens,

and it's definitely not a foregone conclusion

that it will happen, but that might be the change,

the point that we need to change how we do it.

But you're right that the kind of audit trail

for want of a better word is the reason, that's it.

That's the only reason that it's like this.

- Yeah, and another upside is that the list is available.

If anyone wants to use that list for anything,

like analysis or just have a list of all packages

that are in the index, that's the place to go.

And we don't have to deal with any requests around it.

It's all right there.

So that's certainly a strong reason

to keep it open like this,

which any other system would then have to replicate

or offer in some way.

- That's great.

Okay, shall we do some package recommendations?

- Let's do it.

- Yeah, I can kick us off.

And my first package this week is from Jasmine Eilers

and it's called NSAttributedStringBuilder.

And this is a package that's been around

for only a few weeks.

It's about a month old.

And it is a result builder type package.

So it allows you to create NSAttributedStrings

by defining kind of methods on string objects.

So you could say, for example, hello.font

and then give it a font.italic.foregroundcolor.underline.

It supports images.

So you can say, give it a,

there was an image example here.

I was looking at it earlier.

Oh yeah, here we go.

There's a .image method that you can call on a string,

which says, you know, here's a UI image or whatever it is.

And add that into the attribute to string.

You can put new lines in there.

You can add other attributed strings

if you've already got attributed strings.

And of course, out of the result of this

comes a newly formed attributed string

that you can use all over the place.

And I mean, there are lots of ways

to generate attributed strings these days.

Foundation has markdown parsing these days

and certainly has some level still of HTML parsing.

But if you just want to generate some attributed strings

to pop in your project, that default syntax for it,

I've written many lines of attributed string code

in my time.

And this certainly seems like a significantly easier way

to put together a kind of native attributed string.

- Nice, that sounds really nice.

I haven't actually used an attributed string that much,

but I have seen examples.

So you have to do lots of sort of range stuff, right?

Where you, when you have bold and italic

and that sort of stuff, don't you?

You have to fiddle a bit like.

- Yes, lots of ranges.

I have also just noticed at the bottom of the readme file,

which I didn't see when I was looking at it originally,

it says this project is inspired by Ethan Huang's project,

NSAttributedStringBuilder, which has the same

and svdo/swift-richstring.

So there are a couple of projects here.

And actually we were chatting

just before we recorded the podcast.

And one of the things that I said was,

I have a feeling that we've talked about this before

and we haven't, but it's possible we talked

about one of these other ones before.

- We might have, because I've seen a couple

of packages like this.

And I think it's a great example

where a builder can help construct these things

because they are sort of fiddly to get right.

And I think that's where these kinds of builders

help lay out things in a better way

than by sort of low level fiddling

with properties and stuff.

- And we do have both of those packages in the index.

So that is RichString by Stefan van den Oord

and a package with exactly the same name,

NSAttributedStringBuilder by Ethan Huang.

- My first pick is a pick you have probably seen.

You might even have it in the list,

but I'm going first dibs.

And the package is called PowPOW by Robb Böhnke.

You probably know this package, right?

- I am aware of this package

and I did see the news about this package, yeah.

- So the news this week,

this is actually a now open source version

of the package that was previously a licensed package

that you would buy.

And what it does, the tagline is

delightful SwiftUI effects for your app.

And if you've followed Rob on Mastodon

or perhaps elsewhere, that's where I've seen it.

He's been posting amazing examples

of what this library can do,

like animations, transitions, that sort of stuff.

Really delightful ways of enhancing your UI

and a particular SwiftUI here

with all sorts of modifiers

and things that make it really interesting and fun.

So that's what this package is about,

enhancing your SwiftUI.

There's a great site with examples

of all the effects that are available.

I did try to run it in a playground.

Unfortunately, it doesn't work

with our trying to playground mechanism.

I believe that's, I mean, it runs,

but it doesn't show anything.

I think that's because it uses,

it needs to run on device or at least on a proper simulator,

not just in the playground.

It seems like this is running on a layer

that's not present in Swift playgrounds.

That's my speculation.

But the example page should help give you a preview

of all the things that are available.

And it's extensive.

There's lots of stuff you can do.

And it's just a great package

and people seem to be really excited

that it's now available.

- And by the sound of it,

your cats are also big fans of this package.

- Yeah, absolutely is.

And I say that to save me the pain

of trying to edit those out.

- This is going to be the case for a bit

because apparently I've been,

the server has been lacking around here.

- Yes, I think so.

So I did see that this went to be

a kind of freely available open source project this week.

And I mean, the work that Rob does

in many different aspects of Apple platform development

is remarkable,

but this is another great example of the work that he does.

And I think it's also worth mentioning

that the reason that it went,

that the transition to free and open source this week

was that it's effectively being sponsored by Emerge Tools

who were previous sponsors of the Swift Package Index.

And I took a quick look into the kind of,

not the details of it, of course,

but it looks like Emerge Tools

are actually sponsoring quite a number of Swift packages

in the kind of package ecosystem.

So that is definitely to be encouraged.

And we had a great experience working with them

on the Swift Package Index too.

So it's great to see this happen.

And I'm happy that more people will get to use this package.

- That's fantastic.

I was about to ask if you know any,

because I didn't know of the details why

or how that came about.

I only saw that it ended,

it's hosted in the Emerge Tools GitHub account now,

but that's great.

That's great news.

- Yeah, so I think, you know,

open source needs more funding

and this is a way for that to happen.

And there's obviously a kind of logo

in the header of the readme file there

and various links and stuff.

And if that's what it takes to make open source development,

you know, a more practical and comfortable thing to do,

then that's great.

- Yeah.

- My next package is by Mikhail Vospennikov

and it's called Gestures.

And it's been around for about a year now.

And this is a enhanced gesture API for SwiftUI.

So obviously SwiftUI supports all of the standard

kind of gesture recognizer type gestures

that you would have used in UIKit or,

well, UIKit basically.

But there's still quite a lot of work you need to do

with kind of interpreting the gestures

and seeing, you know, what trigger point,

like if you have a swipe gesture,

you'll obviously get the coordinates

of where you're swiping to

and the distance and stuff like that.

But it's your decision on what to do.

And actually in reality,

there are a bunch of really common things

that you might want to do.

So for example, you might want to add a swipe gesture

that only actually triggers something

when you've moved more than at least 15 points

within the kind of context of that swipe.

And this is what that package does.

So it adds a whole set of extensions

to SwiftUI gesture API that help you locate gestures

and do things like trigger on minimum distance

and that kind of stuff.

So yeah, it gives you coordinate information,

it gives you location information

and very easy to integrate in your project.

And as it says in the readme file,

it's a lightweight package.

So I don't think this is a huge amount of code

that you're adding to your project.

- Nice.

Right, my second pick is called Scintilla Lib

and it's by Danielle.

That's all I have as far as author information goes.

And this is, I'm taking a page

from Dave's book of package picks here,

'cause that's a dependency package

you probably won't need or won't use as a dependency.

(laughs)

But it's a fun project to poke around in

and run the examples of.

What it is, it's a ray tracer ported from Clojure to Swift.

And what it does, it's intended to be used

more like a library rather than like an app or anything,

but you can run it as an app

and it has a little render view and UI

where you can actually just render the thing

and get some output.

And it ships sort of like a Swift UI type DSL

where you can describe the scene,

like your objects, your camera,

and then you can run it and you get a screen

that shows the rendered output.

And I found that really nice.

It gives you something to play with

and give you a little playground to try ray tracing

if you're new to this or if you want to play around with that.

A really fun little project that I ran.

Also something that doesn't run in a playground,

but it is very easy to just stick the examples

in a command line app.

So there's a description in the readme how to set this up.

Effectively just create a blank Xcode project,

command line project, and then paste in the main thing,

the admin decorated result builder thing.

And it is a bit like an app that you create in Swift UI

that you then create in this DSL and you run it

and you get this window and it shows the rendered output.

Really nice little thing to play around with ray tracing.

- I have so many questions.

Does it do its own ray tracing or is it using metal or?

- That's a great question.

(laughing)

- Revenge.

- It opens a window, there's a,

now it draws it line by line.

So there's something happening.

There's not a whole lot of cause firing when that happens.

I don't know under the hood if it's accelerated.

I suspect it isn't.

I think it would be faster if it was.

This seems to be a port from Clojure.

So I don't, I'm too honest.

I don't know how that would work if on either end,

if it was accelerated, but I would imagine if it's,

if it's ported from another language,

it sounds more like it's a pure software ray tracer

that is then ported one to one.

But that's just me speculating without knowing

a whole lot about ray tracing and the mechanics of all that

and metal for that matter.

- Sure, well, certainly I didn't actually spot

that one going through.

So I am gonna go and have a look at that after the show.

My final package this week is kind of along the same lines.

It is called Model 3D View by Freek, F-R-E-E-K.

And what I really liked about,

so the package description is render 3D models

with SwiftUI effortlessly.

And what I kind of liked about this is that

it describes itself as image view for 3D models,

which is an interesting way to think about it

because we use image views all the time just to,

you know, pop an image on the screen.

And we don't really need to think about any of the stuff

that needs to happen to get that image on the screen.

And this Model 3D View package basically does the same

for 3D models.

Now, I know that SwiftUI has native support for USDZ models

through the QuickLook framework, I think.

But this also supports something called GLTF models,

which is Graphics Library Transmission Format,

which I believe is something that came out of WebGL.

And again, I would ask you please,

no detailed questions about this

because my knowledge of this is a Wikipedia article.

(laughs)

We are making the least researched podcast

in the history of podcasting here.

But yes, it supports GLTF files

and you can pop a skybox in there.

So you can have a kind of a 3D background

or a 2D background inside a skybox.

You can change lighting,

you've got some interactive camera controls.

And the best bit about it, as far as I'm concerned,

is you can pop a Model 3D View into your SwiftUI View

and the only parameter you need

is to pass the model file name in.

And there you go.

You can then, if you want to, you can transform it,

you can rotate it, you can scale it, you can transform it.

You can give it a new camera.

You know, there's lots of different things

including interactive cameras.

And as I say, like things like skyboxes

and stuff like that.

But I liked the description of this as like,

well, this is image view for 3D objects.

And that I think is a really nice utility

to have inside apps these days.

In the frequently asked questions,

there's a question here.

Can I use this to make a 3D game?

And the answer is in bold, no.

(laughing)

So yeah, so it's not, this is not a 3D framework.

This is just, as I say, image view for 3D.

- Nice.

Did you mention the,

I think you mentioned a couple of formats like 3D,

but Model 3D wasn't a format.

It's a placeholder for any sort of supported 3D format,

right?

- Yes.

I'm not sure of the full list of formats it supports,

but I know it supports this GLTF

because it calls it out specifically.

So, but yeah, Model 3D view is the name of the view

that you would insert into your SwiftUI view hierarchy.

- Nice.

Yeah, it's interesting with these,

that has largely gone away, right,

with the graphics format, display format.

I remember back in the day,

one of the most used programs on my Mac

was graphics converter.

To convert between all the different formats

that you would find on the internet.

And you couldn't actually display unless you use that tool

or converted it with that tool to a format

that the Mac could display out of the box.

So we've come a long way

where anything is really supported, isn't it,

with 2D graphics at least?

- Without even,

you don't even have to think about it anymore.

You just kind of say,

images are as easy to work with as text.

Whereas I remember in my very early days

writing Object Pascal to decode Windows bitmap files

and having to read byte by byte.

And yeah, it was a very long time ago.

- It's interesting with live text,

it goes even further that they're not,

they're sort of sometimes even equivalent to text, right?

I've had cases where I had something

and I took a picture and then copied the text out

in like a router password that I didn't want to type.

Where it's become almost synonymous in some regards.

There's a little bit of friction still

in taking a picture and using it as text,

but it's surprisingly little friction these days.

It's amazing.

- Yeah, I use that all the time too.

- Right, my third pick is called

SwiftUI Core Image by Dan Wood.

And this is a really interesting package.

So what it does as the name pretty much says already,

it integrates Core Image into SwiftUI

and gives you a sort of modifier based way

of applying or creating image pipelines and preview them.

Like for instance, in a playground.

So this is something that you can actually use

with our Try in a Playground feature.

And it's really nice to take an image

and then create these pipelines,

like apply a sepia filter, a Gaussian blur,

or something like that.

So all the things that you know from Core Image.

And I've not used that a lot,

but Core Image is a different beast, right?

It's a completely different API.

So having that available and being able to use that

on regular SwiftUI images is really nice.

And it has dozens and dozens of modifiers.

So it looks like it's a really extensive coverage

of the Core Image API.

It has some nice examples as well,

and is an all around great package

if you have that sort of a need

to create a Core Image pipeline

and play around with transforming images.

- And there's a whole load of stuff

that Core Image can do that you would probably

be surprised at.

It's an API which has been around for a long time,

but it's a very powerful API.

- Yeah.

So, yep, there you go.

SwiftUI Core Image by Dan Wood.

- And so I think that brings us

to the end of today's episode.

And actually this will be, as I mentioned,

at the end of last week's episode,

or the last episode that we published.

This will be the last podcast that we record in 2023.

So I wanna wish everybody happy holidays

and thank you for listening this year.

It's been something that I've really enjoyed

doing again this year,

and I'm happy to see that it's gaining some traction

and people mention it more and more.

And so really happy to kind of see it

find its feet a little bit.

Because when we started this,

we didn't really know what it would become.

We started this actually as Twitter Spaces,

and it was a very low effort affair at the beginning.

We just jumped on, no attention paid to audio quality

or indeed the quality of the content that we talked about,

which has remained, as you've heard today.

But we didn't really know where it would go.

And as we come to the end of 2023,

I think it's worth just kind of saying

thank you so much for listening.

Please do, if you enjoy it,

please do share the podcast with other people

and we'll be back next year.

- Yeah, thanks for listening.

Do let us know if you have questions, comments,

always love to hear what people think

or if you have questions, ask us and we'll address it.

And yeah, happy holidays and see you next year.

- See you next year.

Bye-bye. - Bye-bye.