Simple HTML Parsing in Swift

I needed to parse some HTML in a SwiftUI project so I could put the content into a Text view. I couldn’t use the HTML partly because of weird behaviour in WKWebView but that’s for another post. This is was a simple case, I didn’t need any structure information from the HTML, just the text with the tags removed. Parsing HTML is always a bit evil so I tend to look for built-in services that can do it for me. Here’s what I found. Using NSAttributedString to load HTML Turns out that NSAttributedString has a way to directly load HTML [Read on…]

Sharing Swift package with WatchOS extension

I was working on a simple iOS app as a small side project and thought it would be fun to have a watch extension for it. Since the bulk of the project involved retrieving and parsing some JSON via a REST call, I wanted to share a package with Swift code between the app and the extension. It turned out to be complicated to figure out how to do that. It’s simple to do in practice so I wanted to document the process for the future. Note: This is not the simplest way to share code. It is the simplest [Read on…]

Missing argument in SwiftUI ForEach

I’ve been experimenting a bit with SwiftUI and ran into an error that it took me an embarrassingly long time to diagnose. The error message is “Missing argument for parameter #1 in call” and it appeared on a ForEach statement in a View. Here’s the cause as well as some troubleshooting steps I wish I’d followed. The SwiftUI Code The change I was trying to make was to the return type of the property stuff.all. I wanted to return a more specialized type to handle some localization conditions. For example, a change like this: As soon as I made the [Read on…]

JSON decoding in Swift Failure

Just ran into this error when trying to decode some JSON in Swift and the error message had me stumped for too long despite being trivial so I thought I’d commit it to memory. The JSON looked like this: And here’s the Swift struct I was trying to use to decode it: The problem is in the declaration of bar in Foo, it is not an array of Bar, it is just a Bar. So the declaration should be: Then this test case will work: