vankuik.nl

Latest weblog entries

2023-01-24 Moving server

Today, I'm moving this website to a new server with a new Debian version. This may mean some interruptions.

2022-12-12 When to use StateObject wrappedValue initializer

On our team, we recently discussed the use of StateObject in SwiftUI. It's very useful for ViewModels. However you often want to initialize such a ViewModel with one or more parameters and you bump into the following bit of documentation:

"You don't call this initializer directly. Instead, declare a property with the @StateObject attribute in a View, App, or Scene, and provide an initial value"

Source: developer.apple.com

We were not the only ones struggling with this; see also this blog post by Sarun W, where they share a Slack screenshot quoting an Apple engineer saying that this initializer is supported.

Still, using that initializer means that if your view gets recreated, you lose all state since the ViewModel is destroyed and created as well. This is especially harrowing when you do network actions within the ViewModel.

Our conclusion is that StateObject(wrappedValue:) can be used at points in your app where you start a completely new flow. For instance in a popup where you create a screen with a NavigationView or NavigationStack. Otherwise, initialize elsewhere and use @EnvironmentObject.

2022-11-18 Example of hierarchical list

I actually didn't know that the SwiftUI List element natively supports hierarchical lists, until someone on Reddit asked for an example. Here's mine:

    struct Park: Identifiable {
        let id = UUID()
        let name: String
        let children: [Park]?
    }
    struct ContentView: View {
        private let parks = [
            Park(name: "Sierra Nevada", children: [
                Park(name: "Yosemite", children: [
                    Park(name: "Mount Dana", children: nil),
                    Park(name: "Mount Lyell", children: nil),
                ]),
                Park(name: "Stanislaus National Forest", children: [
                    Park(name: "Emigrant Wilderniss", children: nil),
                    Park(name: "Carson-Iceberg Wilderniss", children: nil),
                ])
            ])
        ]
        var body: some View {
            List(parks, children: \.children, rowContent: { Text($0.name) })
        }
    }

2022-09-15 Xcode linker error ld framework not found

Today I got the following error when trying to build my unittest for my Swift package:

  ld: framework not found CoreAPIKit

Note that the name of that particular framework (CoreAPIKit) doesn't matter; it's a framework that's only used internally at my client. Now on to the solution... In Xcode, we selected the project, and selected the unittest target, then selected the Build Phases tab. In that tab, there's the Link Binary With Libraries setting.

That setting listed "CoreAPIKit.framework"! So, why does this go wrong?

We removed that framework, then added it again. This time, it was saying "CoreAPIKit" (i.e. without the extension). Now, the unittest target correctly linked.

2022-09-14 Getting an unescaped JSON string from Xcode console

If you're debugging an app, you may want to copy raw JSON in Xcode, then paste it into a specialized app. The problem is, Xcode doesn't make it obvious how to actually do this.

In my first attempt, I set a breakpoint at the appropriate line of code, and Xcode listed the variables in the Variables View. In my case, that variable was called "response" of type "optional Data". So I first tried typing the following at the debugger prompt:

  ldb> po String(decoding: response.data ?? Data(), as: UTF8.self)

This however will print the string but it will escape all quotes with a backslash. To be able to select and copy unescaped JSON from the console, type the following:

  ldb> e print(String(decoding: response.data ?? Data(), as: UTF8.self))

More...

Weblog Archive

Weblog entries 2021

Weblog entries 2020

Weblog entries 2019

Weblog entries 2018

Weblog entries 2017

Weblog entries 2016

Weblog entries 2015

Weblog entries 2014

Weblog entries 2013

Weblog entries 2012

Weblog entries 2011

Weblog entries 2010

Weblog entries 2009

Weblog entries 2008

Weblog entries 2007

Weblog entries 2006

Weblog entries 2005

Weblog entries 2004

All weblog entries

Articles

Articles, chronologically (latest first). This is pretty old stuff.

Scribblings

Not yet finished. Maybe will never be finished. Maybe they'll get deleted. Who knows?

Programming:

System administration:

Others:

Files: