<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Those Who Swift]]></title><description><![CDATA[Your weekly Swift news delivered directly to your inbox!]]></description><link>https://thosewhoswift.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!FQA8!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png</url><title>Those Who Swift</title><link>https://thosewhoswift.substack.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 04 Sep 2026 12:37:42 GMT</lastBuildDate><atom:link href="/__u/thosewhoswift.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Those Who Swift]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[thosewhoswift@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[thosewhoswift@substack.com]]></itunes:email><itunes:name><![CDATA[Those Who Swift]]></itunes:name></itunes:owner><itunes:author><![CDATA[Those Who Swift]]></itunes:author><googleplay:owner><![CDATA[thosewhoswift@substack.com]]></googleplay:owner><googleplay:email><![CDATA[thosewhoswift@substack.com]]></googleplay:email><googleplay:author><![CDATA[Those Who Swift]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Those Who Swift - Issue 282]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-282</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-282</guid><pubDate>Wed, 02 Sep 2026 21:05:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>&#8220;<em>It just works</em>&#8221; is doing a lot of quiet work in that sentence.</p><p>This week&#8217;s reads are about the rules hiding underneath four things that feel automatic: how SwiftUI decides a view needs to redraw, which property wrapper actually owns your object, what git really deletes when you force-push over two weeks of work, and what happens when you stop clicking through Xcode and start scripting it directly.</p><p>Hit reply and tell us: what&#8217;s the last &#8220;it just works&#8221; feature that turned out to have rules you had to learn the hard way?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!psG3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!psG3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:382418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210653241?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h1>Every &#8220;It Just Works&#8221; Has Rules You Haven&#8217;t Learned Yet.</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer</em></p><p>Every framework sells you a story. SwiftUI redraws the right views. Git deletes what you tell it to delete. Xcode is where you click things until the app runs. The story is convenient right up until the moment it&#8217;s wrong, and then you find out the story was never the whole mechanism &#8212; just the part someone decided you didn&#8217;t need to see.</p><p>Natalia Panferova&#8217;s piece on SwiftUI data dependencies is a good place to start, because &#8220;SwiftUI re-renders when state changes&#8221; is the kind of sentence that&#8217;s true enough to stop you from asking a better question. Which state? Tracked how? Through what boundary? Panferova walks through the actual dependency graph SwiftUI builds, and once you&#8217;ve seen it, the mysterious extra redraw &#8212; or worse, the redraw that never happens &#8212; stops being mysterious. It was never magic. It was a rule you hadn&#8217;t read yet.</p><p>Antoine van der Lee&#8217;s @StateObject-versus-@ObservedObject piece sits right next to that one, because ownership is exactly the kind of thing SwiftUI lets you get away with ignoring until you can&#8217;t. Both wrappers will compile. Both will often behave identically in a demo. The difference only shows up when the view holding an @ObservedObject gets recreated and your &#8220;persistent&#8221; state quietly resets &#8212; at which point you learn, expensively, that one of these wrappers was never supposed to be the source of truth.</p><p>Then there&#8217;s Daniel Saidi&#8217;s story, which is the most viscerally relatable thing I&#8217;ve read this month: an errant <code>git reset</code> and force-push erased two weeks of work on a real project. I felt that in my chest reading it. But the resolution is the actual lesson &#8212; git doesn&#8217;t delete commits when you delete a ref, it just stops pointing at them. The work was never gone. It was unreachable, which is a very different thing from destroyed, and knowing that difference is the kind of fact that turns a five-alarm panic into a five-minute recovery.</p><p>Artem Novichkov&#8217;s MCP-driven Xcode piece rounds this out from a different angle. Instead of learning a hidden rule the hard way, he&#8217;s exploiting one on purpose: Xcode and the simulator were never really &#8220;a GUI,&#8221; they&#8217;re a set of programmable interfaces that a GUI happens to sit in front of. Once you talk to that layer directly &#8212; prompt to build to simulator, no clicking &#8212; a lot of what felt like &#8220;the way Xcode works&#8221; turns out to have been &#8220;the way the GUI chose to expose Xcode.&#8221; Different thing entirely.</p><p>None of these are really stories about bugs. They&#8217;re stories about the gap between the interface you were handed and the system actually running underneath it &#8212; and about what happens once someone bothers to close that gap for you. The dependency graph, the ownership model, the ref/object split, the automatable toolchain: all of it was always there, documented or discoverable, just not part of the story anyone tells you on day one.</p><p>I don&#8217;t think the answer is to distrust every abstraction you use. Most of them earn the trust, most of the time. But it&#8217;s worth noticing which ones you&#8217;ve never actually verified &#8212; which &#8220;it just works&#8221; you&#8217;ve been repeating because it&#8217;s convenient, not because you checked. The rules are usually learnable in an afternoon. The bill for not knowing them tends to come due at a much worse time.</p><p><strong>Hit reply and tell me: what&#8217;s an &#8220;it just works&#8221; in your stack that you&#8217;ve never actually gone and verified?</strong></p><h1 style="text-align: center;">Related reading on this week's theme &#128218;</h1><h3><a href="https://www.avanderlee.com/swiftui/stateobject-observedobject-differences/">@StateObject Vs. @ObservedObject: The Differences Explained</a></h3><p>Antoine van der Lee breaks down the ownership rules behind SwiftUI's two reference-type property wrappers &#8212; which one actually creates the object, which one just observes it, and why picking the wrong one causes state to quietly reset when a view gets recreated.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://nilcoalescing.com/blog/SwiftUIDataDependenciesAndTheirEffectOnViewUpdates/">SwiftUI Data Dependencies And Their Effect On View Updates</a></h3><p>Natalia Panferova goes past "SwiftUI re-renders when state changes" to the actual dependency graph that decides whether a change gets noticed at all &#8212; essential reading for anyone who's ever debugged a view that wouldn't update, or updated when it had no reason to.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://danielsaidi.com/blog/2026/08/27/some-things-are-never-truly-lost">Some Things Are Never Truly Lost</a></h3><p>After an errant <code>git reset</code> and force-push wiped two weeks of work from a real project, Daniel Saidi discovered that deleting a ref isn't deleting the commits behind it &#8212; and walks through recovering the entire branch with a single command.</p><p><strong>&#128205;Level: Beginner</strong></p><h3><a href="https://artemnovichkov.com/blog/headless-xcode-from-prompt-to-simulator-with-mcp">Headless Xcode: From Prompt To Simulator With MCP</a></h3><p>Artem Novichkov drives Xcode and the iOS Simulator entirely through an MCP server and prompts &#8212; no clicking required &#8212; treating the toolchain as a scriptable interface instead of a GUI you have to operate by hand.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://sarunw.com/posts/trailing-comma-in-swift/">Trailing Commas Beyond Arrays In Swift 6.1</a></h3><p>Sarun Wongpatcharapakorn covers how Swift 6.1 extends trailing-comma support past arrays to parameter lists, tuples, and generics &#8212; a small change that quietly makes every future code review and diff cleaner.</p><p><strong><span>&#128205;Level: </span>Beginner</strong></p><h3><a href="https://www.pointfree.co/blog/posts/223-beta-preview-lazystate">Beta Preview: LazyState</a></h3><p>Point-Free previews LazyState, a library that picks up where WWDC's new <code>@State</code> macro left off, letting SwiftUI view state be initialized lazily <em>and</em> dynamically from data the parent view passes in.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.swiftbysundell.com/articles/warning-for-nested-weak-self-closure-captures/">Why Swift Is Introducing A Warning For Weak Captures Within Nested Closures</a></h3><p>John Sundell explains a new Swift compiler warning that catches a specific, easy-to-miss closure-capture mistake &#8212; and why "just add [weak self]" turns out not to be automatically enough once closures start nesting.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://azamsharp.com/2026/08/29/building-a-reusable-http-client-in-swift.html">Building A Reusable HTTP Client In Swift With async/await</a></h3><p>Mohammad Azam builds a typed, testable networking layer from scratch on async/await &#8212; a solid reference the next time you're tempted to reach for a third-party networking library instead.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.basbroek.nl/multiple-custom-contents-swiftui">Dynamically Setting Accessibility Custom Content Pairs In SwiftUI</a></h3><p>Bas Broek shows how to attach and dynamically update multiple accessibility custom content entries on a view, so VoiceOver users get more than one flattened description of what's on screen.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=s6spdug0">Surprise And Shine</a></h3><p>Apple announced a September 9, 2026 event, widely expected to headline the iPhone 18 Pro lineup. Nothing developer-facing has shipped yet, but it's the date to have on your radar.</p><h3><a href="https://developer.apple.com/news/?id=1ptvdtcm">Update: New Domain For Sign In With Apple</a></h3><p>Apple reversed a planned domain change for Sign in with Apple and iCloud+ Hide My Email after developer and user pushback &#8212; the current domain stays in place.</p><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://www.natashatherobot.com/p/flow-ai-coding">Getting Into Flow With AI Coding</a></h3><p>Natasha makes the case that AI-assisted coding can deepen flow state rather than break it &#8212; if you stay actively involved: breaking work into small commits, and doing the planning and reviewing yourself instead of handing that over too.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://roland.leth.ro/blog/tech/claude-code-rules-hooks-and-skills-and-how-i-set-mine-up">Claude Code Rules, Hooks And Skills, And How I Set Mine Up</a></h3><p>Roland Leth breaks down Claude Code's three configuration layers &#8212; rules, skills, and hooks &#8212; and how they differ: preferences you state versus procedures you define versus safeguards that get enforced whether the AI "remembers" them or not.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Design&#127912;</h1><h3><a href="https://nilcoalescing.com/blog/BuildingAnAccessibleCalendarInSwiftCharts/">Building An Accessible Calendar Chart With Swift Charts</a></h3><p>Matthaus Woolard builds a calendar-style chart with Swift Charts that also works with VoiceOver &#8212; treating accessibility as part of the chart's design from the start rather than a pass added at the end.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://kylebrowning.com/posts/uploading-to-testflight-from-the-command-line/">Uploading To TestFlight From The Command Line</a></h3><p>Kyle Browning walks through scripting a TestFlight upload without opening Xcode &#8212; a useful building block for anyone trying to get release day off a human's clipboard and onto CI.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://sagarunagar.com/blog/fix-sluggish-xcode-swiftui-previews-mock-data">Fix Sluggish SwiftUI Previews Instantly With Static Mock Data</a></h3><p>Sagar Unagar shows a quick technique for keeping Xcode previews fast: swap live or expensive data sources for static mocks so iterating on a view doesn't mean waiting on a network call every time.</p><p><strong>&#128205;Level: Beginner</strong></p><div><hr></div><h1 style="text-align: center;">Community&#129309;</h1><h3><a href="https://forums.swift.org/t/accepted-se-0541-flexible-swift-c-interoperability-for-packages/89183">SE-0541: Flexible Swift/C Interoperability For Packages</a></h3><p>The Swift Evolution community accepted SE-0541, giving Swift packages more flexible ways to interoperate with C code &#8212; a small but real ecosystem win for anyone bridging C libraries into Swift.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Devs for Devs: From AI-Generated Code to AI-Assisted Engineering]]></title><description><![CDATA[From world-class developers, straight to you.]]></description><link>https://thosewhoswift.substack.com/p/devs-for-devs-from-ai-generated-code</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/devs-for-devs-from-ai-generated-code</guid><pubDate>Mon, 31 Aug 2026 18:00:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s call it some technical issues. &#128517;</p><p>Instead of Sunday, we&#8217;re publishing &#8220;<em>Devs for Devs</em>&#8221; on Monday.</p><p>This week, I&#8217;m happy to have Vinicius Serpa Pansan, an iOS developer with 4 years of experience building apps with a focus on performance and user experience. Based in S&#227;o Paulo, Brazil, he works across the Apple ecosystem with technologies including Swift, SwiftUI, UIKit, and AppKit.</p><p>He shares his experience with AI-assisted app creation. Let&#8217;s check how to check, verify and adapt the AI-assisted code.</p><p>P.S. You can check out Vinicius&#8217;s work on <strong><a href="https://www.linkedin.com/in/viniciusspansan/">LinkedIn</a></strong>, and <strong><a href="https://github.com/OFFSerpa">Git</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7rGe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7rGe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/796b6293-ee21-404b-9e77-77504f644ded_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:295621,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/211137226?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7rGe!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b6293-ee21-404b-9e77-77504f644ded_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe if you&#8217;re new here! &#128075;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><span>A few months ago I started building Fio, a voice-first journaling app for iOS. The core idea is simple: speaking is faster than typing, so instead of asking someone to type out their day, you just talk, and the app transcribes and saves it. No decision required at the moment of capture, no folder to choose, no structure to commit to. Just speak, and it&#8217;s there.</span></p><p><span>I built it entirely in SwiftUI, and from day one, Claude Code and Codex were part of the actual development process, not a tool I reached for occasionally, but something I used in nearly every session.</span></p><p><span>My first instinct, like most people&#8217;s, was to use AI the obvious way: describe what I wanted, get a working implementation, accept it, move to the next screen. It&#8217;s the fastest path from idea to shipped feature, and for a while, it felt like exactly the right call. Screens came together quickly. Features that would have taken me a full evening to hand-write were done in twenty minutes.</span></p><p><span>Then, a few weeks in, I noticed something that bothered me more than it should have. I&#8217;d finish a session having built something that worked, and if you&#8217;d asked me to explain why it was built that particular way, instead of some other reasonable way, I sometimes couldn&#8217;t answer with confidence. I knew what the code did. I didn&#8217;t always know why it was the right shape for the problem.</span></p><p><span>That gap is easy to ignore when everything is working. It stops being easy to ignore the moment you have to defend a decision, in a code review, in an interview, or just to your future self six months later trying to remember why you did something a certain way.</span></p><p><span>This is the story of how I closed that gap, and the four-step loop I ended up building around it.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!0pE-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 424w, /__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 848w, /__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!0pE-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png" width="1456" height="682" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 424w, /__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 848w, /__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0pE-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dcd607-0a77-4d62-9879-db3a88e23e84_1600x750.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><span>The Problem with Just Accepting the Output</span></h2><p><span>The default AI workflow most developers fall into is straightforward: describe a problem, get a suggestion, skim it, it looks reasonable, accept it, move to the next task. It&#8217;s fast, and it feels productive, because things keep getting built. Velocity is visible. Understanding isn&#8217;t, so it&#8217;s easy to quietly deprioritize.</span></p><p><span>The moment this stopped being abstract for me was a decision that actually mattered for Fio: how to handle voice transcription. The app&#8217;s entire premise rests on a privacy promise, you speak, it&#8217;s transcribed, and nothing leaves the device unless you explicitly choose to back it up to your own iCloud. No audio ever touches a server. That&#8217;s not a minor implementation detail, it&#8217;s the reason the app exists in the shape it does.</span></p><p><span>If I had approached that the way I approached the first dozen smaller features, describe &#8220;add voice transcription,&#8221; accept the first working version, I likely would have ended up with something that technically transcribed audio just fine, but quietly assumed a server round-trip somewhere in the pipeline, because that&#8217;s the default shape most transcription examples and tutorials reach for online. It would have worked. It would have also violated the one promise the entire app is built around, and I might not have caught it until much later, possibly after the architecture around it was already hard to unwind.</span></p><p><span>Nothing about that outcome would have been the AI&#8217;s fault, to be clear. I was the one who hadn&#8217;t specified the constraint, hadn&#8217;t asked why a particular approach was chosen over another, hadn&#8217;t treated the output as something to interrogate rather than something to accept. The tool did exactly what I asked. I just hadn&#8217;t asked precisely enough, because I wasn&#8217;t in the habit of asking at all.</span></p><p><span>That&#8217;s the moment I stopped treating AI output as a finished answer and started treating it as a first draft that owed me an explanation</span></p><p><span>Here&#8217;s the difference in practice. The version I almost shipped would have looked something like this:</span></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!galQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 424w, /__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 848w, /__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 1272w, /__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!galQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png" width="1426" height="308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:308,&quot;width&quot;:1426,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 424w, /__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 848w, /__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 1272w, /__u/substackcdn.com/image/fetch/$s_!galQ!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbedfb8d8-1ca5-4324-baab-b375509cf78f_1426x308.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>The version that actually matches Fio&#8217;s privacy promise sets one property explicitly:</span></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!z15R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 424w, /__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 848w, /__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 1272w, /__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!z15R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png" width="1428" height="264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:264,&quot;width&quot;:1428,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 424w, /__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 848w, /__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 1272w, /__u/substackcdn.com/image/fetch/$s_!z15R!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46ed2e7d-8448-43d7-abf1-eb5ba1b4f437_1428x264.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>One line. But it&#8217;s the line that turns &#8220;probably private&#8221; into &#8220;actually private,&#8221; and it&#8217;s exactly the kind of detail that&#8217;s easy to skip when you&#8217;re evaluating from a neutral position instead of comparing against something you wrote yourself first.</span></p><h2><span>The Loop I Built Instead</span></h2><p><span>I didn&#8217;t design this all at once. It came together step by step, each addition responding to a specific way the &#8220;just accept it&#8221; habit had already failed me.</span></p><h3><span>Step 1: Write Your Own Approach Before Asking for One</span></h3><p><span>Before I ask Claude Code or Codex to implement anything non-trivial, I write, in plain language, how I think it should work. Not code. A paragraph, sometimes just a few sentences. What matters isn&#8217;t the polish, it&#8217;s that I commit to an opinion before I see someone else&#8217;s, even an AI&#8217;s.</span></p><p><span>This sounds like a small thing, but it changes the psychology of the whole exchange. When you ask first and see the answer second, you&#8217;re evaluating from a neutral position, and neutral positions default to &#8220;looks fine&#8221; far more often than they should. When you write your own approach first, you have something to compare against, and comparison is a completely different cognitive act than approval. You&#8217;re no longer asking &#8220;does this look right?&#8221; You&#8217;re asking &#8220;where does this differ from what I expected, and why?&#8221;</span></p><p><span>More than once, my written approach turned out to be missing something the AI&#8217;s version accounted for, and I learned from the gap. Just as often, my approach was actually right, and the AI&#8217;s first suggestion took a shortcut I didn&#8217;t want, which I only caught because I had something concrete to compare it to.</span></p><h3><span>Step 2: Let It Implement or Push Back, Not Replace</span></h3><p><span>Once there&#8217;s a direction, the AI&#8217;s role is to build within it, and to flag problems it can see that I can&#8217;t, not to substitute its own direction for mine by default. This is a subtle distinction, but it changes how I write prompts. Instead of &#8220;build a sync mechanism for offline notes,&#8221; I&#8217;ll say something closer to &#8220;here&#8217;s how I want to structure the sync mechanism, tell me what breaks.&#8221;</span></p><p><span>That framing invites pushback instead of discouraging it. And when the pushback comes, it&#8217;s usually specific and useful, because it&#8217;s responding to a concrete proposal rather than generating one from scratch.</span></p><h3><span>Step 3: Ask &#8220;Why This, Not the Alternative&#8221; on Every Non-Trivial Call</span></h3><p><span>This is the step that actually catches the cases like the transcription example, the ones that are quietly wrong by default, not obviously wrong. If I can&#8217;t explain, in my own words, why a piece of implementation exists the way it does, I don&#8217;t move forward, regardless of whether the code compiles and the tests pass.</span></p><p><span>Sometimes the answer the AI gives is genuinely good, something I hadn&#8217;t considered, and I learn from it directly. Sometimes asking the question reveals that I framed the original request incorrectly, and the more useful fix is upstream of the code entirely. Either way, I come out of the exchange knowing something I didn&#8217;t know when I asked.</span></p><h3><span>Step 4: Close Every Session by Summarizing What You Learned</span></h3><p><span>Not what got built. What got understood? At the end of a session, I ask for a short summary of the concepts we touched, framed as though I had to explain them to someone else afterward, a teammate, an interviewer, my future self debugging this in six months.</span></p><p><span>This is the habit that turns a series of coding sessions into something that compounds instead of something that just accumulates. It&#8217;s also, practically speaking, what makes a project like this defensible later. When you can explain not just what a piece of code does but why it exists in that shape, you&#8217;re not reciting an AI&#8217;s explanation from memory, you&#8217;re demonstrating that the understanding is actually yours.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2Sc8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 424w, /__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 848w, /__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2Sc8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png" width="1456" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 424w, /__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 848w, /__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2Sc8!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b52a7c-556e-4fb3-942b-c9f37233b123_1600x640.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><span>What Changed</span></h2><p><span>Fio still isn&#8217;t public, so I&#8217;m not going to pretend this loop is the reason the app is good. What I can say with confidence is narrower and, I think, more useful: I know exactly why every non-trivial decision in it was made. That wasn&#8217;t true a few weeks earlier, when I was moving faster and understanding less, and it&#8217;s a different thing entirely from knowing that the code works.</span></p><p><span>That distinction matters more than it might seem to at first. Code that works is a snapshot. Understanding why it works, and why the alternative wasn&#8217;t chosen, is what lets you extend it, debug it under pressure, or explain it convincingly to someone else, none of which &#8220;it works&#8221; guarantees on its own.</span></p><p><span>I think this is the trade worth naming clearly, because it&#8217;s easy to miss in the current wave of AI-assisted development: speed was never actually the constraint holding most developers back. Understanding was, and it&#8217;s always been the harder, slower thing to build, which is exactly why it was the first thing to get cut whenever a faster path appeared. AI is, among other things, a very fast path. It removed a real excuse people used to have for skipping the &#8220;why&#8221;, there simply wasn&#8217;t time, someone had to just ship the thing. That excuse is mostly gone now. What&#8217;s left is a choice, made consciously or not, every time you accept a suggestion: build the loop that forces understanding, or don&#8217;t, and get code that works until, one day, it doesn&#8217;t, and you&#8217;re left debugging something you never actually understood in the first place.</span></p><p><span>The question worth asking isn&#8217;t &#8220;am I using AI?&#8221; anymore. At this point, most of us are, and the answer says less than it used to. The more useful question is narrower: after this session, do I know more than I did before it started, or am I just further along?</span></p><p><span>If you&#8217;re building something with AI as an active part of your process and want to compare notes on what&#8217;s working and what isn&#8217;t, feel free to reach out. I&#8217;m always happy to talk through it.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!zqyB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 424w, /__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 848w, /__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 1272w, /__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!zqyB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 424w, /__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 848w, /__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 1272w, /__u/substackcdn.com/image/fetch/$s_!zqyB!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef424f14-44ee-41ba-bc91-26bdaa8148a2_1600x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe if you&#8217;re new here! &#128075; Every Wednesday news, every Sunday tips from devs!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 281]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-281</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-281</guid><pubDate>Wed, 26 Aug 2026 20:38:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>Ship day gets the screenshots, the release notes, and the celebratory post. Day two gets the bug reports.</p><p>This week&#8217;s reads are about that much longer stretch of software life: a 14-year-old app replacing its database, an open-source maintainer asking others to take ownership, a developer measuring what iOS background scheduling actually does in the wild, and an engineering lead making decisions before certainty arrives.</p><p>Hit reply and tell us: what&#8217;s the oldest piece of software you&#8217;re still responsible for keeping alive?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!psG3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!psG3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:382418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210653241?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h1>Shipping Is the Easy Part. Sustaining It Is the Job.</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer</em></p><p>Ship day gets all the ceremony. The build goes green, App Review says yes, and for a few hours the project feels finished.</p><p>Then somebody finds the edge case.</p><p>Maybe it is an old device you no longer own. Maybe it is data created six versions ago. Maybe it is not even your bug, but it is happening inside your app, so the distinction is not especially useful to the person staring at a broken screen.</p><p>That is the part of shipping we rarely celebrate: the years after the release, when the job becomes less about adding something new and more about keeping a promise you already made.</p><p>Daniel Saidi&#8217;s Wally is a good example. The app is 14 years old, and version 7 replaces Realm with SwiftData. Saidi describes a much cleaner architecture, less storage code, better integration with modern Apple frameworks, and private iCloud sync. It is tempting to summarize that as a straightforward modernization. It probably did not feel straightforward while changing the foundation of an app that has been accumulating users and data since 2012.</p><p>There is a point in every long-lived codebase when leaving the old system alone stops being the conservative choice. The workaround has a workaround. A dependency no longer fits the direction of the platform. The code still runs, but every new feature pays rent to an architectural decision made years ago. Replacing it is risky. Keeping it is risky too.</p><p>Matt Massicotte&#8217;s post sits nearby, although the debt is human rather than technical. He lists the open-source projects he can no longer maintain properly and asks people to take them over. I appreciated how direct the post is. Open source has plenty of launch energy and very little succession planning. We talk about adoption, stars, and contributors; we talk much less about what happens when the person whose name is on the repository no longer has the time to be its unpaid support team.</p><p>Asking for maintainers is not abandoning a project. Done early enough, it may be the most responsible maintenance decision available.</p><p>Irving Popovetsky&#8217;s post on iOS background tasks is the kind of article that only gets written after the happy path has stopped being useful. He instrumented <code>BGTaskScheduler</code> on his own device and watched what happened over time: refreshes arrived hours later than requested, resubmitting could accidentally push a pending task further into the future, and background launches became less frequent when the app went unopened.</p><p>The useful part is not a magic configuration that makes iOS behave like <code>cron</code>&#8212;there isn&#8217;t one. It is the record of all the small decisions required to make an unreliable system reliable enough: keeping refresh work short, handling expiration races, anchoring the next request to the last run, and being honest with users about what the operating system controls. This is maintenance in its purest form. The API call is easy; learning how it behaves after weeks of real use is the job.</p><p>And sometimes the maintenance problem is outside your repository. Jeff Johnson&#8217;s latest App Store post looks at suspicious gaps between ratings and written reviews, along with developers submitting apps at remarkable volume. You can improve your architecture, tests, and release process and still depend on a distribution system whose failures you cannot patch.</p><p>So I kept coming back to Mohammad Faani&#8217;s decision framework, especially his 70% rule: when one option looks roughly 70% right, choose it and adjust as you learn. That is useful advice for leads, but it is also a fair description of maintenance work. Most choices arrive with incomplete information. Wait for certainty and the backlog continues making decisions for you.</p><p>Working on SDKs has changed what I count as a successful release. A launch can be exciting, but the work that builds trust happens afterward: integrations continue working, old assumptions are tested against new platform behavior, and users do not need to know how much changed underneath them. &#8220;Nothing broke&#8221; is not much of a headline. It is still an outcome worth being proud of.</p><p>There is no tidy lesson here. Sometimes the right call is a migration. Sometimes it is one more compatibility fix. Sometimes it is admitting that a project needs a new maintainer. The hard part is noticing when the decision has changed&#8212;and making it before neglect makes it for you.</p><p><strong>Hit reply and tell me: what are you still sustaining years after you shipped it, and would you make the same choices again?</strong></p><h1 style="text-align: center;">Related reading on this week's theme &#128218;</h1><h3><a href="https://danielsaidi.com/blog/2026/08/20/wally-7">Wally 7</a></h3><p>Daniel Saidi releases version 7 of Wally, the wallet app he first built in 2012. The biggest change is underneath: Realm is gone, SwiftData is in, and the new storage layer removes a lot of code while adding private iCloud sync.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.massicotte.org/blog/looking-for-maintainers/">Looking for Maintainers!</a></h3><p>Matt Massicotte has more open-source projects than he can properly support, so he names them and asks for new maintainers. A candid post about ownership, handoffs, and the part of open source that begins after people depend on your work.</p><p><strong>&#128205;Level: Beginner</strong></p><h3><a href="https://calcopilot.app/blog/posts/running-ios-background-tasks-reliably-part1/?utm_source=chatgpt.com">Running iOS Background Tasks Reliably, Part 1</a></h3><p>Irving Popovetsky instrumented <code>BGTaskScheduler</code> on a real device and documented what actually affects background execution: task expiration, accidental rescheduling, energy budgets, force-quitting, and how foreground usage changes the system&#8217;s willingness to wake an app. A valuable field report on building around behavior iOS deliberately does not guarantee.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://mfaani.com/posts/career/a-framework-to-make-decisions-faster-as-a-lead-software-engineer/">A Framework to Make Decisions Faster as a Lead Software Engineer</a></h3><p>Mohammad Faani offers a practical framework for decisions that cannot wait for perfect information: separate reversible choices from irreversible ones, timebox the research, write down the uncertainty, and use the 70% rule when it is time to commit.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://lapcatsoftware.com/articles/2026/8/9.html">More Incredible Tales of App Store Curation</a></h3><p>Jeff Johnson continues documenting App Store curation problems, including suspicious rating patterns and developers shipping apps at astonishing volume. A reminder that keeping an app healthy also means living with systems you do not control.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://swiftpackageindex.com/blog/what-is-a-package-registry">What Is a Swift Package Registry?</a></h3><p>Dave Verwer explains the difference between SwiftPM, a package index, and a package registry&#8212;and why verified, immutable source archives can be faster and safer than fetching every dependency through Git.</p><p><strong><span>&#128205;Level: </span>Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://azamsharp.com/2026/08/22/protecting-swiftui-views-with-authentication.html">Protecting SwiftUI Views With Authentication</a></h3><p>A reusable <code>RequiresAuthentication</code> container for gating SwiftUI screens behind login, including inline and sheet-based flows, dismissal handling, and a view-modifier alternative. One important caveat is included too: hiding a screen does not replace server-side authorization.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://kylebrowning.com/posts/swiftui-empty-states-contentunavailableview/">Empty States in SwiftUI with ContentUnavailableView</a></h3><p>Kyle Browning walks through the <code>ContentUnavailableView</code> initializers and builds a reusable approach for search results, errors, offline screens, and other empty states.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://damian.fyi/swift/2026/08/16/curious-case-of-missing-click.html">The Curious Case of the Missing SwiftUI Clicks</a></h3><p>Buttons inside a bidirectional <code>ScrollView</code> stop responding after a few taps. Switching to vertical-only scrolling fixes the problem, although the reason remains unexplained. One to remember for the next impossible-looking SwiftUI bug.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://adincebic.com/2026/08/23/preventing-transitive-swift-imports-with.html">Preventing Transitive Swift Imports with Bazel</a></h3><p>Swift permits a module to import dependencies it never declared directly. Adin &#262;ebi&#263; shows how the <code>rules_swift</code> layering check makes those accidental imports fail at build time, before they become part of the architecture.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="/__u/antongubarenko.substack.com/p/ios-27-statereporter">iOS 27: StateReporter</a></h3><p>Anton Gubarenko explores StateReporting, a new iOS 27 framework that attaches app-state context to MetricKit and Instruments. Instead of seeing only that a hang occurred, you can see what the app was doing when it happened.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://livsycode.com/uikit/nstexttable-in-swift/">NSTextTable in Swift</a></h3><p>iOS 27 brings <code>NSTextTable</code>, <code>NSTextTableBlock</code>, and related TextKit APIs to UIKit, making real tables possible inside <code>NSAttributedString</code>. It is meant for rich text&#8212;documents, invoices, reports&#8212;not as a replacement for <code>UITableView</code>.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=gmws0jgp">Changes for Apps in the European Union</a></h3><p>Apple announced new EU business terms taking effect October 1. The update replaces the per-install Core Technology Fee with a 5% commission on digital transactions in apps distributed outside the App Store, revises other commission rates, expands alternative-distribution eligibility, and adds child-safety rules for alternative payments.</p><h3><a href="https://www.swift.org/blog/embedded-swift-improvements-coming-in-swift-6.4/">Embedded Swift Improvements Coming in Swift 6.4</a></h3><p>Swift.org previews broader language support for Embedded Swift, including generalized existential types, untyped throws, and metatypes, plus floating-point parsing and error handling for concurrent operations on constrained targets.</p><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://peterfriese.dev/blog/2026/hybrid-ai-apple-foundation-models-gemini">Apple Foundation Models: Hybrid AI with Dynamic Profiles</a></h3><p>Peter Friese builds a router that keeps smaller prompts on Apple&#8217;s on-device model and sends larger ones to Gemini. Dynamic Profiles hold the model choice, token-budget check, and model-specific instructions so the call site stays clean.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://cuteios.dev/2026/08/17/localizations-translations/">Translation Sub-Agents Go Brrrrrrrr</a></h3><p>Amy Delves shares a localization workflow built around <code>LocalizedStringResource</code>, a strings catalog for each view, detailed translator comments, and Xcode 27&#8217;s translation skill. It is a useful example of shaping a codebase so both people and coding agents have the context they need.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://fatbobman.com/en/weekly/issue-150/?utm_source=chatgpt.com">AI Wanted to Give Up. The Human Didn&#8217;t.</a></h3><p>Fatbobman reflects on Linus Torvalds&#8217;s &#8220;debug session from hell&#8221;: 24 debugging patches and 18 kernel boots to find a one-line fix. AI helped with the repetitive work, but human judgment supplied the persistence. A timely reminder that faster tools do not remove the hardest part of debugging&#8212;knowing when the evidence still does not add up..</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://tanaschita.com/swiftui-alert-identifiable-data/">Presenting Alerts and Confirmation Dialogs from Identifiable Data in SwiftUI</a></h3><p>Natascha Fadeeva demonstrates the new iOS 27 item-based APIs for presenting alerts and confirmation dialogs. Binding presentation directly to an optional <code>Identifiable</code> value removes the separate Boolean state&#8212;and the synchronization bugs that can come with it.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Video&#127909;</h1><h3><a href="https://www.youtube.com/watch?v=oatrwczkdco">AI-Assisted TDD in Practice (Swift + AI)</a></h3><p>Quality Coding demonstrates how test-driven development can put useful boundaries around AI-generated Swift code. The tests define the expected behavior, while the coding assistant works toward small, verifiable changes instead of producing an entire implementation at once.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Devs for Devs: Short Eye Long Eye]]></title><description><![CDATA[From world-class developers, straight to you.]]></description><link>https://thosewhoswift.substack.com/p/devs-for-devs-short-eye-long-eye</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/devs-for-devs-short-eye-long-eye</guid><pubDate>Sun, 23 Aug 2026 20:51:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello! &#128075;</p><p>Another Sunday, another &#8220;<em>Devs for Devs</em>&#8221; issue!</p><p>Meet <strong>Faiq Khan</strong> , an experienced iOS engineer with a strong background in building and shipping mobile products.</p><p>Today, he answers a simple question many indie devs face: <em><strong>what should an indie dev keep in mind while developing?</strong></em></p><p>With his years of hands-on development experience and practical knowledge from working across different projects and teams, he shares his tips on how to keep moving forward.</p><p>P.S. You can check out and follow Faiq&#8217;s work on <strong><a href="http://linkedin.com/in/faiq-khan-42072677">LinkedIn</a></strong> and <strong><a href="https://www.faiq.co.uk/">website</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!fkOT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!fkOT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:313679,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/211269758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!fkOT!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0638bc7-baab-482e-948d-95d9c4c30742_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!X8JC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!X8JC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!X8JC!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19cefb79-2c9b-48e9-a57a-2c64ef7c4223_1408x768.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>A Strategy for Indie Developers</h3><p><span>As indie developers, we lack the safeguarding structure that full-sized product teams enjoy. We don&#8217;t have a dedicated PM, a scrum master, or the formal structure of a sprint or squad environment, systems designed to handle heavy planning, detailed estimation, and peer discussion.</span></p><p><span>You are often completely on your own making those decisions.</span></p><p><span>While traditional agile processes can work, as indie devs we need to relentlessly streamline how much energy we assign to planning overhead in order to deliver features in a reasonable time.</span></p><p><span>It&#8217;s easy to get caught up thinking about the distant product we want to build:</span></p><p><span>The big vision.</span></p><p><span>The polished UI.</span></p><p><span>The features we haven&#8217;t even started yet.</span></p><p><span>The version that exists somewhere months down the road.</span></p><p><span>Having that long-term vision is important. It gives you direction and something to work towards.</span></p><p><span>But there&#8217;s a danger in staring at the destination for too long: </span><strong><span>you can lose sight of what actually needs to happen today.</span></strong></p><p><span>I&#8217;ve found it much more useful to think in two layers:</span></p><p><strong><span>Long Eye:</span></strong><span> Where am I ultimately trying to take this product?</span></p><p><strong><span>Short Eye:</span></strong><span> What specifically needs to happen today to move me one step closer?</span></p><p><span>And that short-term vision should get </span><em><span>really</span></em><span> short.</span></p><p><span>Not </span><em><span>&#8220;build the new creation system this week.&#8221;</span></em></p><p><span>Instead:</span></p><p><em><span>&#8220;Today, get the item selection working.&#8221;</span></em></p><p><span>Tomorrow might be:</span></p><p><em><span>&#8220;Connect the selected item to the inventory system.&#8221;</span></em></p><p><span>Small, achievable steps.</span></p><p><span>There&#8217;s another benefit to working this way: </span><strong><span>small steps make it harder to fall down rabbit holes.</span></strong></p><p><span>We&#8217;ve all been there. You start working on one feature, notice something that could be improved, start refactoring it, discover another problem, research a new approach&#8230; and suddenly three hours have disappeared and you&#8217;re nowhere near what you originally set out to do.</span></p><h3><span>Daily Goals</span></h3><p><span>A clearly defined daily goal gives you something to anchor yourself to.</span></p><p><span>You can still explore. You can still experiment. But you always have a destination for the day.</span></p><p><span>For me, a good daily goal should be (</span><em><span>MASS</span></em><span>):</span></p><p><strong><span>Meaningful</span></strong><span>:  it should move the product forward, even if only slightly.</span><strong><span><br>Achievable</span></strong><span>: something I genuinely have time to complete.</span></p><p><strong><span>Simple</span></strong><span>:  clear enough that I don&#8217;t spend half the day deciding what to do.</span></p><p><strong><span>Small</span></strong><span>: scoped to fit within the day.</span></p><p><span>And there&#8217;s one task I always want to finish the day with:</span></p><p><strong><span>Review tomorrow&#8217;s agenda.</span></strong></p><p><span>Before closing the laptop, decide what tomorrow&#8217;s small win looks like.</span></p><p><span>That way, when you sit down the next morning, you&#8217;re not asking:</span></p><p><em><span>&#8220;Where do I start?&#8221;</span></em></p><p><span>You already know.</span></p><p><span>The </span><strong><span>Long Eye</span></strong><span> tells you where you&#8217;re going.</span></p><p><span>The </span><strong><span>Short Eye</span></strong><span> tells you what to do next.</span></p><p><span>Keep the steps small, stay out of the rabbit holes, and keep moving forward.</span></p><p><strong><span>Think big. Plan small. Ship every day.</span></strong></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 280]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-280</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-280</guid><pubDate>Wed, 19 Aug 2026 20:31:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>This week&#8217;s articles share a common thread: frameworks can change significantly beneath APIs that look exactly the same.</p><p>SwiftUI&#8217;s compiler performance is improving, <code>@State</code> has a new underlying implementation, and developers are still debating whether the framework&#8217;s long-standing limitations are acceptable. Together, these pieces show why understanding the mechanism&#8212;not just the API&#8212;often leads to faster debugging and better engineering decisions.</p><p>Have you ever had to investigate a SwiftUI or UIKit behavior that the documentation couldn&#8217;t explain? Hit reply&#8212;I&#8217;d love to hear what you found.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!psG3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!psG3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:382418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210653241?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h1>Under SwiftUI's Hood, Nothing Is As Simple As It Looks</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer</em></p><p>Seven years after its introduction, SwiftUI still asks developers to trust a considerable amount of hidden machinery. This week&#8217;s reading made a strong case for looking beneath that abstraction.</p><p>Start with <code>ContentBuilder</code>. Apple introduced it at WWDC26 as a way to improve SwiftUI type-checking performance. But as Fatbobman explains, the improvement does not come from adding another builder type. It comes from restructuring the shared builder APIs used by containers such as <code>Group</code> and <code>ForEach</code>.</p><p>By relying on <code>TupleContent</code> and deferred conditional conformance, SwiftUI gives the type checker less work to perform. The code developers write remains largely unchanged, while the compiler does substantially less work behind the scenes.</p><p>That distinction matters. When build performance improves without an obvious source change, it is easy to treat it as compiler magic. Understanding the implementation gives us something more useful: a clearer mental model for why certain view structures are expensive and why newer APIs may compile faster.</p><p>A similar change is happening with <code>@State</code>.</p><p>Stewart Lynch found that in Xcode 27, <code>@State</code> is implemented as a macro rather than a property wrapper. The syntax remains familiar, but the initialization behavior changes in an important way.</p><p>Previously, the initializer expression could be evaluated during every view recreation, even when SwiftUI ultimately preserved the existing state value. With the macro implementation, that expression is evaluated lazily.</p><p>For a simple integer or Boolean, the difference is unlikely to matter. For state initialized through a database lookup, file operation, or expensive computation, it can eliminate work that developers may not have realized was happening.</p><p>These two changes approach the same problem from different directions. <code>ContentBuilder</code> improves compiler behavior beneath a stable API, while the new <code>@State</code> implementation changes the underlying mechanism without changing how the declaration looks. Both improvements are nearly invisible unless someone profiles the behavior, examines the generated code, or asks why the result changed.</p><p>That brings us to Yakov Manshin&#8217;s &#8220;SwiftUI After 7 Years: A Story of Mediocrity,&#8221; a deliberately sharp retrospective that generated more than 300 comments on Hacker News.</p><p>His central argument is difficult to dismiss completely: after seven years, &#8220;it is still a young framework&#8221; becomes a less convincing explanation for persistent problems. Focus management, drag-and-drop, platform inconsistencies, and difficult edge cases have survived several release cycles.</p><p>I do not agree with every conclusion in the article, but the larger tension is real. SwiftUI&#8217;s internals continue to improve, while some visible limitations remain stubbornly familiar.</p><p>Those are separate measures of maturity. Compiler performance can improve dramatically while developers still struggle with basic interactions. A framework can gain powerful new APIs without resolving gaps in older ones. When we say SwiftUI has come a long way, it is worth being precise about which part of SwiftUI we mean.</p><p>Chang-Jui Lin&#8217;s article on building an EPUB reader with CoreText offers a practical counterpoint. Instead of adapting a WebView or relying on a higher-level text component, Lin built directly on CoreText to support reflowable content, fixed layouts, media overlays, and bidirectional text.</p><p>It is a much lower level of abstraction&#8212;and a much larger engineering commitment. But it also provides the control required for a problem that higher-level frameworks do not solve cleanly.</p><p>That is not an argument for rebuilding every framework primitive. Most abstractions are valuable precisely because they prevent us from owning that complexity. But when an abstraction becomes the constraint, understanding the layer below it can reveal options that are otherwise easy to miss.</p><p>The broader lesson from this week is not that SwiftUI is good or bad. It is that no framework should remain a complete black box.</p><p>The engineers who diagnose difficult problems fastest are often the ones willing to inspect the generated code, profile the rebuild, trace the macro expansion, or move down the stack when the current abstraction stops being useful.</p><p>Frameworks will continue to improve while retaining frustrating gaps&#8212;sometimes within the same release. The durable skill is learning how to investigate what the framework is actually doing. That understanding makes debugging faster, design decisions clearer, and point-release surprises far less surprising.</p><p>What is the last SwiftUI, UIKit, or Swift behavior you had to reverse-engineer because the documentation did not explain enough?</p><h1 style="text-align: center;">Related reading on this week's theme &#128218;</h1><h3><a href="https://fatbobman.com/en/posts/contentbuilder-explained/">ContentBuilder Explained: The Secret Behind SwiftUI's Type-Checking Speedup</a></h3><p>An investigation into how Apple improved SwiftUI type-checking performance through <code>TupleContent</code>, shared builder APIs, and deferred conditional conformance. A useful read if you want to understand what changed beneath the WWDC26 performance claims.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://www.createchsol.com/blog/2026-08-12-a-change-of-state.html">A Change of State</a></h3><p>A focused demonstration of <code>@State</code> becoming a macro in Xcode 27. The new implementation lazily evaluates its initializer, avoiding unnecessary work when SwiftUI recreates a view.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://ykvm.com/2026/07/swiftui-a-story-of-mediocrity/">SwiftUI After 7 Years: A Story of Mediocrity</a></h3><p>A critical assessment of SwiftUI&#8217;s maturity and the framework limitations that remain after seven years. You may not agree with every argument, but it is a useful prompt to reconsider which rough edges we have started treating as normal.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://chang-jui-lin.github.io/Yuedu-reader/2026/06/08/coretext-epub3-adaptation/">Adapting EPUB 3 Features to CoreText in Yuedu Reader</a></h3><p>A detailed look at implementing EPUB 3 rendering directly with CoreText, including reflowable text, fixed layouts, media overlays, and bidirectional content. It shows both the control and the complexity involved in owning a native text-rendering pipeline.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://damian.fyi/swift/2026/08/16/curious-case-of-missing-click.html">The Curious Case of the missing SwiftUI Clicks</a></h3><p>A real-time debugging log of SwiftUI buttons that quietly stop responding inside a horizontal ScrollView &#8212; fixed, but still without a clear answer for <em>why</em>. A fitting closer for this week's theme: sometimes going under the hood just leaves you with a better mystery.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://toyboy2.medium.com/swiftui-lies-your-animation-breaks-because-one-view-is-actually-multiple-layers-56c1abdc1790">SwiftUI Lies: Your Animation Breaks Because One View Is Actually Multiple Layers</a></h3><p>A first-person debugging story showing why a button&#8217;s label and background can animate independently &#8212; and how ZStack, drawingGroup, compositingGroup, and geometryGroup each solve (or half-solve) the problem for different reasons. A concrete companion to this week&#8217;s &#8220;nothing is as simple as it looks&#8221; theme.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://mysk.blog/2026/08/04/webkit-proxy-icloud-private-relay-ip-leak/">IP and DNS Leaks in WebKit Affecting Proxy Browsers and Apple iCloud Private Relay</a></h3><p>Researchers document a WebKit issue that can expose a user&#8217;s real IP address and DNS queries while using proxy-based browsers or iCloud Private Relay. Important context for teams making privacy guarantees around WebKit-based experiences.</p><p><strong><span>&#128205;Level: </span>Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://onmyway133.com/posts/how-to-stream-sse-with-urlsession-in-swift/">How to stream SSE with URLSession in Swift</a></h3><p>A practical implementation of Server-Sent Events using <code>URLSession.bytes(for:)</code>, along with a small test server. Particularly useful for apps consuming AI responses or other incrementally delivered data.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.pointfree.co/blog/posts/220-type-safe-json-and-jsonb-in-structuredqueries">Type-safe JSON and JSONB in StructuredQueries</a></h3><p>StructuredQueries 0.35 introduces schema-checked support for JSON and JSONB data in SQLite. The article shows how to retain type safety while working with semi-structured local data.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://swiftdevjournal.com/posts/top-functions/">Using Top Functions Mode in Instruments to Quickly Find the Slowest Code</a></h3><p>A concise guide to the Top Functions view in Xcode 26.4&#8217;s profiling instruments. Sorting by self-weight and inspecting flame graphs can make it much easier to identify where execution time is actually being spent.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.donnywals.com/installing-simulator-runtimes-from-the-command-line/">Installing simulator runtimes from the command line</a></h3><p>Command-line steps for installing simulator runtimes when Xcode 27 beta remains stuck on &#8220;fetching download information.&#8221; A useful workaround to keep nearby when the graphical installer fails.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.avanderlee.com/swift/sendable-protocol-closures/">Sendable and @Sendable closures explained with code examples</a></h3><p>A clear explanation of <code>Sendable</code> types and <code>@Sendable</code> closures, with examples showing how values move safely across concurrency boundaries. A solid reference when working through Swift 6 strict-concurrency warnings.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://swiftwithmajid.com/2026/06/23/taking-control-of-toolbar-items-in-swiftui/">Taking control of toolbar items in SwiftUI</a></h3><p>Explores SwiftUI toolbar placement, customization, and platform-specific behavior. Helpful for interfaces where the default toolbar layout does not provide enough control or consistency.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=kug6m2ea">Get ready for new creative assets on the App Store</a></h3><p>Apple previews new creative and marketing asset options for App Store product pages. Worth reviewing before planning your next product-page update or launch campaign.</p><h3><a href="https://developer.apple.com/help/app-store-connect/release-notes/">TestFlight Update</a></h3><p>The latest TestFlight release notes, covering recent changes to Apple&#8217;s beta-distribution workflow. A quick check before your next external-testing cycle may save some surprises.</p><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://www.polpiella.dev/cursor-xcode-27">Using Cursor in Xcode 27</a></h3><p>A hands-on guide to connecting Cursor to Xcode 27 through Agent Client Protocol support. It offers an early look at how external coding agents can participate directly in an Xcode-based workflow.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://agent-island.dev/blog/codex-token-replay-guard/">Build a Local Codex Token Usage Ledger Without Replay Errors</a></h3><p>A practical fix for tracking token usage across Codex/Claude coding-agent sessions without hitting replay errors &#8212; useful if AI agents are part of your build pipeline, even outside the Swift/iOS-specific tooling this newsletter usually covers.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://www.basbroek.nl/recording-voiceover">Recording VoiceOver on iOS &amp; macOS</a></h3><p>A practical guide to capturing VoiceOver audio for accessibility testing, bug reports, and demos. iOS supports the workflow through screen recording, while macOS requires a virtual-audio device.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Community&#129309;</h1><h3><a href="https://macguru.dev/swiftui-should-become-open-source/">SwiftUI should become Open-Source</a></h3><p>Makes the case that open-sourcing SwiftUI could help developers diagnose and address long-standing issues such as keyboard focus and drag-and-drop. Even if the proposal feels unlikely, the argument raises useful questions about framework transparency and community participation.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Devs for Devs: From XCUITest to Promo Video]]></title><description><![CDATA[From world-class developers, straight to you.]]></description><link>https://thosewhoswift.substack.com/p/devs-for-devs-from-xcuitest-to-promo</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/devs-for-devs-from-xcuitest-to-promo</guid><pubDate>Sun, 16 Aug 2026 19:30:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Another Sunday, another gem from top developers for you!</p><p>This week, our guest author is Noam Efergan, a Senior Mobile Engineer at Yazio specializing in iOS development.</p><p>A self-taught developer based in the UK, he&#8217;s also a technical writer with a particular interest in CI/CD, automation, and modern mobile development practices.</p><p>Beyond his engineering work, Noam is a core member of the SwiftLeeds team and an active contributor to the iOS community, sharing his experience through articles, conference talks, and open discussions about mobile engineering.</p><p>Let&#8217;s see how a coding task can lead to a marketing video matching the latest updates.</p><p>P.S. You can check out Noam&#8217;s work on <strong><a href="https://www.linkedin.com/in/noamefergan/">LinkedIn</a></strong>, <strong><a href="https://x.com/No_Wham">X</a></strong>, and <strong><a href="https://nowham.dev">website</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hSbB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hSbB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:327430,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210577607?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hSbB!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff529db27-3607-4d3a-836c-3ce3276d2482_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><h2><span>Treating Marketing Assets Like Build Artifacts</span></h2><p><span>Every time I made a meaningful change to Dee&#8217;s interface, I created a second task for myself: remake the marketing.</span></p><p><span>A label moved, a timer changed, or a new state appeared. Suddenly an App Store screenshot was stale, a clip no longer matched the product, or a translated screen had to be recorded again. Recreating the right state by hand was often slower than the UI change itself. Timers kept moving, animations settled at different moments, and sample data was never quite identical.</span></p><p><span>That is a familiar indie developer problem. The person building the product is also producing the screenshots, launch posts, and promo videos. Repeating fragile setup work is a poor use of that person&#8217;s time.</span></p><p><span>I eventually stopped treating marketing assets as files I created manually. I started treating them as build artifacts that should be reproducible from the real app.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xSxM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 424w, /__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 848w, /__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xSxM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png" width="430" height="934.4055201698513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2047,&quot;width&quot;:942,&quot;resizeWidth&quot;:430,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A deterministic capture of Dee's real workout screen&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A deterministic capture of Dee's real workout screen" title="A deterministic capture of Dee's real workout screen" srcset="/__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 424w, /__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 848w, /__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xSxM!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff24f60f-ac8e-4de3-8993-bfe75be14753_942x2047.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The raw source is the real SwiftUI workout screen, launched with controlled data and time</em></figcaption></figure></div><h2><span>Start with an Exact SwiftUI State</span></h2><p><span>Dee is a Muay Thai training app with time-based workout screens. That makes manual capture especially awkward. By the time I navigate to the correct round, dismiss the right controls, and start recording, the timer has already changed.</span></p><p><span>The solution begins inside the app. In debug builds, a launch argument selects a named marketing state. Each state creates the same typed models used by the product, but with controlled input. A frozen clock stops the timer from drifting while XCTest waits for the interface.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;rust&quot;,&quot;nodeId&quot;:&quot;19d6f3c0-0e8a-4a54-96ad-aaeed9fd9753&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-rust">#if DEBUG
enum MarketingScreenshotSeed {
    static let launchArgument = &#8220;-AppStoreScreenshotMode&#8221;

    enum Mode: String, CaseIterable, Sendable {
        case roundTimer = &#8220;round-timer&#8221;
        case restNext = &#8220;rest-next&#8221;
        case liveActivity = &#8220;live-activity&#8221;
    }

    static func makeClock() -&gt; TestClock {
        TestClock(now: Date(timeIntervalSince1970: 1_800_000_000))
    }
}
#endif</code></pre></div><p><span>The important part is not the particular launch argument. It is the boundary. Marketing fixtures control dependencies and data, but they do not replace the production view with a separate mock screen. If I change the actual workout layout, the next capture contains that change.</span></p><p><span>Keeping the fixtures debug-only also prevents this tooling from becoming a hidden route through the release app.</span></p><h2><span>Let XCUITest Operate the Camera</span></h2><p><span>Once the app can launch directly into a stable state, XCUITest becomes a reliable camera operator. The test starts the requested mode and locale, waits for the real screen, and stores the screenshot as a named attachment.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;1761fc0f-91ad-4093-aea4-3db989d2b85d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">private func captureMarketingLocale(_ locale: String) {
    for (name, mode) in marketingScreens {
        let app = launchWorkout(locale: locale, mode: mode)
        settle(seconds: 1.5)

        let attachment = XCTAttachment(screenshot: app.screenshot())
        attachment.name = &#8220;\(locale)_\(name)&#8221;
        attachment.lifetime = .keepAlways
        add(attachment)

        app.terminate()
    }
}</code></pre></div><p><span>I currently run the capture flow across six locales. Locale is just another launch input, so translated screens follow the same path as English instead of becoming a separate manual checklist.</span></p><p><span>Animations introduced another source of flakiness. A view can be accessible before the simulator has produced a complete frame. For the more animated screens, the test samples screenshots until it receives the same PNG twice. If the compositor never settles, the test fails rather than quietly exporting a broken image.</span></p><p><span>That failure is useful. When a UI change invalidates a fixture or makes a screen unstable, I find out during capture. I do not discover it weeks later while assembling launch material from an old folder.</span></p><h2><span>Move from XCTest to Remotion</span></h2><p><span>The XCTest attachments are extracted from the result bundle and copied into a small marketing workspace. From there, Remotion turns the real app captures into code-driven vertical video.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;83fdf0b4-9c15-463f-8dc9-3111e3bdcc81&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&lt;AbsoluteFill&gt;
  &lt;TransitionSeries&gt;
    &lt;TransitionSeries.Sequence durationInFrames={120}&gt;
      &lt;FastHookScene screenshotPath={roundScreenshotPath} /&gt;
    &lt;/TransitionSeries.Sequence&gt;
    &lt;TransitionSeries.Transition
      presentation={slide({direction: &#8220;from-right&#8221;})}
      timing={springTiming({durationInFrames: 15})}
    /&gt;
    &lt;TransitionSeries.Sequence durationInFrames={150}&gt;
      &lt;FastProofScene
        nextScreenshotPath={nextScreenshotPath}
        summaryScreenshotPath={summaryScreenshotPath}
      /&gt;
    &lt;/TransitionSeries.Sequence&gt;
  &lt;/TransitionSeries&gt;

  {deeCueAudioPath ? (
    &lt;Sequence from={105} durationInFrames={135}&gt;
      &lt;Audio src=/__u/thosewhoswift.substack.com/%7BstaticFile(deeCueAudioPath)%7D /&gt;
    &lt;/Sequence&gt;
  ) : null}
  &lt;TimedCaptions captions={captions} /&gt;
&lt;/AbsoluteFill&gt;</code></pre></div><p><span>The composition controls timing, transitions, captions, framing, and audio. The current example renders at 1080 by 1920, 30 frames per second, and 12 seconds. It uses Dee&#8217;s captured screens, and the composition can include a cue copied from the app&#8217;s shipped resources rather than recreating the interface or sound for the advertisement.</span></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;4ddbc074-94c1-4fdb-88ad-9d40f11a2867&quot;,&quot;duration&quot;:null}"></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!mDf6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 424w, /__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 848w, /__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!mDf6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png" width="1456" height="502" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:502,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The deterministic marketing pipeline&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The deterministic marketing pipeline" title="The deterministic marketing pipeline" srcset="/__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 424w, /__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 848w, /__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mDf6!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F523dedee-6ea0-4ad2-81f6-c94124011b4d_1800x620.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The product produces the evidence. The marketing layer selects, composes, and validates it.</em></figcaption></figure></div><p><span>I also added a capture manifest and hashes around the process. The manifest binds the exact screenshots, audio, and composition properties used by a render. Preflight checks dimensions, captions, asset provenance, and whether inputs changed after capture. Human review remains the final step.</span></p><p><span>This is more machinery than a single promo clip needs. It becomes valuable because the output is recurring. One source capture can support App Store screenshots, social video, carousels, and localized variants without pretending that a design mock is the shipping product.</span></p><h2><span>What was Worth Automating</span></h2><p><span>Coding agents helped me move faster through repetitive plumbing, test cases, and review. They were useful for tracing asset paths and checking consistency across the Swift and TypeScript sides. They did not decide what the product should claim, which screen represented it honestly, or whether the final creative was ready to publish. Those decisions stayed with me.</span></p><p><span>The pipeline still has a maintenance cost. Fixtures must evolve with the app. UI tests need care around animations and simulator behaviour. Remotion adds another toolchain. If I needed one screenshot for one launch, I would take it manually.</span></p><p><span>I would consider this approach when an app has dynamic screens, several locales, frequent UI changes, or an ongoing need for product content. Start with one painful state, not a complete marketing platform. Add a launch argument, freeze its dependencies, capture it in a UI test, and only automate the next stage when repetition justifies it.</span></p><p><span>The larger lesson for me is that testability has uses beyond tests. When an app can reproduce an exact state on demand, it becomes easier to debug, demonstrate, localize, and market. The best part of this workflow is not that it produces a video. It is that the video remains connected to the product that users will actually open.</span></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for FREE to receive Sunday&#8217;s gems from devs and Wednesday&#8217;s latest news. &#128071;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 279]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-279</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-279</guid><pubDate>Wed, 12 Aug 2026 20:30:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>Swift concurrency stopped being the scary new thing a while ago &#8212; it&#8217;s just how we write Swift now. But &#8220;we adopted it&#8221; and &#8220;we understand it&#8221; are different claims, and this week&#8217;s picks live in the gap between them. The theme: concurrency that&#8217;s grown past the tutorials and into the parts of real apps where the edges actually are.</p><p>Wrestling with an isolation error that makes no sense? Reply &#8212; those are the best ones to dig into together.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!psG3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!psG3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:382418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210653241?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!psG3!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c13ffd8-7b88-485e-be23-b7d8b9f79ef8_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h1>The Delegate Is Dead. Long Live the Actor.</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer</em></p><p>Every Apple framework of a certain age carries the fingerprints of the era it was born in. Open CoreBluetooth, or CoreLocation, or any of the old guard, and you&#8217;re not just reading an API &#8212; you&#8217;re reading 2011. The delegate pattern everywhere. State machines you assemble by hand across six callbacks that fire in an order the compiler knows nothing about. A &#8220;did&#8221; method for every possible thing that could happen, and a strong-reference dance you have to get exactly right or the whole thing quietly deallocates out from under you.</p><p>For a decade, that was just the cost of doing business on Apple platforms. We learned it, we internalized it, and we mostly stopped noticing how strange it was. You want to read one value off a Bluetooth sensor? Sixty lines, seven delegate methods, and a comment somewhere that says <code>// now what?</code> for the disconnect case nobody fully handled.</p><p>What&#8217;s happening in Swift right now is the slow, deliberate dismantling of that world &#8212; and I don&#8217;t think we talk about it plainly enough. Structured concurrency didn&#8217;t just give us a nicer way to write async code. It changed what the <em>shape</em> of correct code looks like. The delegate era scattered your logic across callbacks because callbacks were the only tool for &#8220;tell me when this happens later.&#8221; Async/await collapsed that back into something you can read top to bottom: wait for the radio, find the device, connect, stream the readings. The program finally looks like the sentence you&#8217;d use to describe it.</p><p>But here&#8217;s the part I actually want to make the case for, because it&#8217;s subtler than &#8220;async is nicer.&#8221; The real shift isn&#8217;t syntax. It&#8217;s <em>who enforces correctness</em>. In the delegate world, thread-safety was a promise you made to yourself in a comment &#8212; &#8220;these callbacks arrive on this queue, so be careful.&#8221; Nobody checked. You just had to be right, every time, forever, including the time six months from now when a tired version of you touches that file at 4pm on a Friday. Swift 6&#8217;s isolation model takes that promise and hands it to the compiler. The actor doesn&#8217;t ask you to be careful about which context your state is touched from. It makes touching it from the wrong context <em>not compile.</em></p><p>That is a genuinely different relationship with your own code. And it&#8217;s why the isolation errors everyone complains about are, I&#8217;d argue, mostly a good thing wearing an annoying costume. When the compiler rejects your code with some knotty message about a non-Sendable type crossing an actor boundary, it is usually not being pedantic. It&#8217;s telling you about a data race that, in the old world, would have shipped &#8212; and surfaced three weeks later as a one-in-ten-thousand crash you could never reproduce. The friction moved earlier. That&#8217;s the whole trade. You pay at compile time instead of paying at 2am when the pager goes off.</p><p>The catch &#8212; and there&#8217;s always a catch &#8212; is that the model is subtle exactly where it matters most. Protocols and global actors interact in ways that surprise even people who&#8217;ve been doing this for years. The difference between isolating a protocol, a conformance, and a requirement is real, and getting it wrong produces errors that feel arbitrary until the mental model clicks. That&#8217;s the actual work of this era: not memorizing which keyword goes where, but building an intuition for what the compiler is protecting you from, so the errors read as help instead of harassment.</p><p>So if you&#8217;ve been treating Swift concurrency as a box you check &#8212; &#8220;yes, we migrated, yes, it compiles&#8221; &#8212; I&#8217;d gently push on that. The migration is the easy part. The understanding is the part that pays off, because it&#8217;s the difference between fighting the compiler and letting it do the thing it&#8217;s uniquely good at: proving, before your code ever runs, that an entire category of bug simply cannot happen.</p><p>The delegate taught us to be careful. The actor lets us stop having to be. That&#8217;s not a small upgrade. That&#8217;s the ground moving.</p><p>What concurrency concept finally clicked for you &#8212; and what&#8217;s still fighting you? Hit reply. The best answers make next week&#8217;s issue.</p><h1 style="text-align: center;">Related reading on this week's theme &#128218;</h1><p>Concurrency past the tutorials &#8212; where the real edges are.</p><h3><a href="https://kylebrowning.com/posts/bluetooth-without-the-delegate-dance/">Bluetooth Without the Delegate Dance</a></h3><p>Kyle Browning rebuilds CoreBluetooth for the Swift 6.2 era &#8212; writing the same heart-rate feature three ways (raw delegates, a 2021 wrapper, and a modern actor-based design) to show exactly how much the language moved. The payoff: tying an actor's isolation directly to CoreBluetooth's delivery queue via custom executors, so events arrive already isolated. A masterclass.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://www.massicotte.org/blog/protocols-and-global-actors/">An Even Closer Look at Protocols and Global Actors</a></h3><p>Matt Massicotte on the genuinely subtle interaction between protocols and global actors &#8212; the difference between isolating a protocol, a conformance, and a requirement, and why getting it wrong produces errors that feel arbitrary until the model clicks.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://blakecrosley.com/blog/swift-6-2-concurrency-in-practice">Swift 6.2 Concurrency in Practice: Default to MainActor, Escape on Purpose</a></h3><p>Blake Crosley on the mental-model flip in Swift 6.2 &#8212; default your module to the main actor, then leave it on purpose in named places. The same data-race guarantee, far fewer false-positive errors, drawn from shipping it across a real app family.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://azamsharp.com/2026/08/02/building-testable-swiftdata-apps.html">Building Testable SwiftData Apps</a></h3><p>Mohammad Azam on structuring SwiftData so it's actually testable &#8212; keeping persistence at arm's length so your logic runs in tests without a live store fighting you at every step.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.swift.org/blog/whats-new-in-swift-july-2026/">What's New in Swift: July 2026 Edition</a></h3><p>The official Swift.org digest rounds up the month across the project &#8212; releases, evolution proposals, community talks, and the news that Swift now runs in a broader range of IDEs including Cursor, VSCodium, Kiro, and Antigravity via the Open VSX Registry.</p><p><strong><span>&#128205;Level: Beginner</span></strong></p><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://tanaschita.com/swiftui-focus-state/">Managing Focus in SwiftUI with FocusState</a></h3><p>Natascha Fadeeva on driving focus properly in SwiftUI &#8212; FocusState, programmatic focus changes, and the keyboard-management details that make forms feel right.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://sagarunagar.com/blog/swiftui-document-apis-2027-whats-new/">SwiftUI Document APIs in the 2027 Releases: Everything You Need to Know</a></h3><p>Sagar Unagar on the new Document protocol &#8212; snapshot-based updates, efficient disk access, and how it layers on top of the existing FileDocument world without breaking it.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://artemnovichkov.com/blog/using-swiftui-contentbuilder-with-non-view-types">Using SwiftUI's ContentBuilder with Non-View Types</a></h3><p>Artem Novichkov digs into ContentBuilder &#8212; the unified builder replacing per-container overloads &#8212; and how to use it with non-view types, plus what it means for compile times.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="/__u/antongubarenko.substack.com/p/ios-27-media-intelligence-framework">iOS 27: Working with the Media Intelligence Framework</a></h3><p>Anton Gubarenko digs into iOS 27&#8217;s new Media Intelligence framework &#8212; what it exposes, what it&#8217;s actually good for, and where it fits alongside the existing media APIs.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/hello/august26/">Hello, Developer: August 2026</a></h3><p>Apple's monthly developer digest for August &#8212; a guided tour of the biggest WWDC26 updates, a walkthrough of building App Store assets for iOS 27, and a profile of the team behind the hit game "Is This Seat Taken?"</p><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://alexanderweiss.dev/blog/2026-08-09-concentric-button-os-27-swiftui-apis">Concentric Buttons with OS 27's SwiftUI APIs</a></h3><p>Alexander Weiss on the new concentric-shape APIs in OS 27 &#8212; building nested, concentric button shapes that stay aligned the way the new design language expects.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://nilcoalescing.com/blog/AdaptiveSwiftUIToolbarsInIOS27/">Adaptive SwiftUI Toolbars in iOS 27</a></h3><p>Natalia Panferova on the new adaptive toolbar behavior in iOS 27 &#8212; how toolbars reflow across size classes and what you get for free versus what you still configure.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://swiftrocks.com/using-ai-without-losing-critical-thinking">Using AI Without Losing Your Critical Thinking</a></h3><p>Bruno Rocha on staying sharp while leaning on AI tools &#8212; a thoughtful, non-hype take on where agents genuinely help and where offloading judgment quietly costs you.</p><p><strong>&#128205;Level: Beginner</strong></p><h3><a href="https://mfaani.com/posts/ai/how-to-use-git-worktree-and-how-its-used-by-ai-agents/">How to Use Git Worktree &#8212; and How AI Agents Use It</a></h3><p>Mohammad Faani on git worktrees &#8212; the underused feature that lets you check out multiple branches at once, and why it's suddenly relevant as AI agents work across branches in parallel.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.amyworrall.com/blog/previewing-sf-symbols-with-apples-own-renderer">Previewing SF Symbols with Apple's Own Renderer</a></h3><p>Amy Worrall wires up Apple's own SF Symbols renderer to preview symbols exactly as the system draws them &#8212; a neat bit of tooling for anyone who's been squinting at approximations.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Devs for Devs: Preparing Your Apps for iOS 27]]></title><description><![CDATA[From world-class developers, straight to you.]]></description><link>https://thosewhoswift.substack.com/p/devs-for-devs-preparing-your-apps</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/devs-for-devs-preparing-your-apps</guid><pubDate>Sun, 09 Aug 2026 20:30:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey, the <em><strong>Those Who Swift</strong></em> team is here! &#128075;</p><p>Not on Wednesday as usual, from now on we&#8217;ll see each other twice a week. Welcome to our new newsletter segment, &#8220;<em><strong>Devs for Devs</strong></em>&#8221;</p><p>We used to run a whole separate newsletter for this called &#8220;<em><strong>Indie App Devs</strong></em>&#8221; Now, every Sunday, we&#8217;ll feature a new segment from world-class, well-known devs here.</p><p>We&#8217;re starting with Natalia Panferova. I&#8217;m sure she doesn&#8217;t need to be introduced to you. She&#8217;s a software engineer, author, and former member of Apple&#8217;s core SwiftUI team, where she helped design and build SwiftUI APIs.</p><p>She has worked with startups and large companies across Europe and New Zealand, building web and mobile applications.</p><p>And without further ado, let&#8217;s jump into today&#8217;s topic and prepare our apps for iOS 27.</p><p>P.S. You can check out Natalia&#8217;s work on <strong><a href="https://www.linkedin.com/in/nataliapanferova/">LinkedIn</a></strong>, <strong><a href="https://x.com/natpanferova">X</a></strong>, and her <strong><a href="https://nilcoalescing.com">website</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6UZe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6UZe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:347072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210277491?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6UZe!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e39e294-848d-434f-aeea-9a9b075cc15e_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><p>Since WWDC, I&#8217;ve been spending a lot of time exploring the changes coming in iOS 27 and working through what they mean for the apps I maintain, from rebuilding them with Xcode 27 and testing layouts at different sizes to reviewing SwiftUI changes that may affect existing code.</p><p>There are plenty of new APIs to explore, and it&#8217;s always tempting to start adding them straight away. But for an existing app, I think it&#8217;s more useful to begin by checking how well it works with the new SDK and system behavior. Much of this preparation isn&#8217;t about adopting new APIs at all. It&#8217;s about making sure existing layouts work when the app is resized, reviewing the visual changes that come from rebuilding with Xcode 27, and addressing new compiler errors and warnings in existing SwiftUI code.</p><p>The amount of work will be different for every app, but these are the main areas I&#8217;d recommend reviewing.</p><h2>Supporting Resizable iPhone Apps</h2><p>One of the most significant changes in iOS 27 is that iPhone apps can now appear at more flexible sizes. This makes it increasingly difficult to assume that an iPhone app will always run in a narrow portrait window or at one of a small set of familiar screen dimensions.</p><p>Until recently, our walking app Strolly only supported portrait orientation on iPhone. It makes heavy use of non-modal sheets placed over a map, allowing users to adjust their route preferences while continuing to interact with the content underneath. When we added landscape support in preparation for iOS 27, we found that the system sheet didn&#8217;t preserve its non-modal presentation after rotation. It became a full-screen sheet and covered most of the map.</p><p>We ended up building an adaptive panel that appears along the bottom in a narrow layout and moves to the trailing edge when enough width becomes available. The layout decision is based on the actual scene width rather than the device type or horizontal size class. This lets the same presentation adapt to iPhone rotation, iPad multitasking, and window resizing.</p><p>Not every app will need a custom presentation, but it&#8217;s worth checking for similar assumptions throughout the interface. Fixed frames, hard-coded screen dimensions, and layouts that switch only on device idiom can all become problematic when the available space changes.</p><p>Xcode 27 includes resize handles in SwiftUI previews and a resizable iOS simulator, which make it easier to test a range of widths without relying only on predefined devices. I&#8217;d pay particular attention to toolbars, sheets, overlays, forms, keyboards, and any screen that places several controls side by side.</p><p>It&#8217;s also important to check that state remains stable while the available size changes. Controls shouldn&#8217;t disappear or become difficult to reach, and resizing shouldn&#8217;t unexpectedly reset navigation, scroll position, selections, or data owned by the view hierarchy.</p><h2>Reviewing the Liquid Glass Appearance</h2><p>Apps built with Xcode 27 automatically receive the latest refinements to the Liquid Glass design. Many of these changes come through standard SwiftUI and UIKit components, so rebuilding the app and inspecting the result should come before adding custom glass effects.</p><p>Navigation bars, tab bars, sheets, menus, toolbars, and standard controls may all look slightly different. Custom interfaces can also produce unexpected results when they place translucent controls over photographs, maps, gradients, or similarly colored content.</p><p>I&#8217;d test these screens with accessibility settings such as Increased Contrast and Reduce Transparency. Users have more control over the appearance of Liquid Glass in iOS 27, so the interface should remain clear across those variations rather than depending on one specific level of transparency.</p><p>Toolbars need some extra attention now that apps can appear at more sizes. Xcode 27 adds SwiftUI APIs for controlling which toolbar items remain visible and which move into the overflow menu. We can assign a visibility priority to important groups, deliberately place less frequently used actions in a <code>ToolbarOverflowMenu</code>, and use the <code>topBarPinnedTrailing</code> placement for an action that should always remain available.</p><p>Before adopting these APIs, I&#8217;d resize the existing toolbar and see what the system does by default. Standard behavior may already be sufficient. Where it&#8217;s not, the new controls let us express which actions are most important without replacing the system toolbar with a custom implementation.</p><h2>Building the Existing App with Xcode 27</h2><p>I like to begin a new SDK migration by building the existing project before introducing any new features. This keeps compiler errors and warnings caused by the new SDK separate from issues introduced while adopting new APIs.</p><p>Building with Xcode 27 brings a few SwiftUI changes worth checking. One of the most notable is that <code>@State</code> is now a macro rather than a property wrapper. This fixes a long-standing performance issue when an <code>@Observable</code> class is used as the default value of a state property. The initial expression is now evaluated lazily, so the observable model is created only when SwiftUI sets up the state storage rather than every time the view value is recreated.</p><p>We should still avoid assigning an observable model to <code>@State</code> inside a view initializer. This creates a new model whenever the initializer runs, even though SwiftUI preserves only the first value in its state storage. If the model depends on changing input from the parent, it can also retain stale data because later assignments are ignored.</p><p>Custom environment values are another area to check. Xcode 27 now warns when an <code>@Entry</code> declaration creates a new class instance directly in its default expression. Every fallback environment lookup would otherwise return a different reference, which can make SwiftUI treat the value as changed and reevaluate dependent views unnecessarily.</p><p>Some existing view expressions can produce new ambiguity errors because SwiftUI&#8217;s result builders are now unified under <code>ContentBuilder</code>. For example, expressions passed directly to overloaded APIs such as <code>overlay</code> and <code>background</code> may need to use their trailing-closure variants so the compiler can select the intended overload.</p><h2>Adopting New SwiftUI APIs</h2><p>Once the app builds and works correctly, we can start looking for places where the new APIs solve an existing problem or let us remove custom code.</p><p>Swipe actions are no longer limited to rows inside a <code>List</code>. In iOS 27, applying <code>swipeActionsContainer()</code> to a <code>ScrollView</code> enables coordinated swipe actions for rows in a <code>LazyVStack</code>, <code>LazyVGrid</code>, or custom layout.</p><p>SwiftUI also has new native reordering APIs for stacks, grids, and other containers. We apply <code>reorderable()</code> to the dynamic content and <code>reorderContainer(for:)</code> to the enclosing container. SwiftUI manages the drag preview, insertion placeholder, and animation, while the app receives a <code>ReorderDifference</code> to apply to its model.</p><p><code>AsyncImage</code> has gained new initializers that accept a <code>URLRequest</code>, giving us control over request headers, cache policy, and timeout without requiring a separate image-loading implementation. A new <code>asyncImageURLSession()</code> modifier can provide a custom session to asynchronous images in part of the view hierarchy.</p><p>These are all useful improvements, but an app doesn&#8217;t need to adopt them simply because they are new. I&#8217;d start with areas where the current implementation is limiting the interface, requires significant custom coordination, or has been difficult to maintain.</p><p>If the app continues supporting older versions of iOS, new APIs will also need an availability strategy. In some cases, the new behavior can be an enhancement on iOS 27 while the existing implementation remains as the fallback. In others, it may be better to wait until the deployment target can move forward rather than maintain two complicated code paths.</p><h2>Testing Before the Public Release</h2><p>An app prepared for iOS 27 still needs to work correctly on every version it supports. I&#8217;d test the main flows on both iOS 27 and the oldest supported system, paying particular attention to code guarded by availability checks.</p><p>Accessibility and localization can expose layout issues that don&#8217;t appear with default settings. I&#8217;d check the main screens with large Dynamic Type sizes, VoiceOver, Increased Contrast, Reduce Motion, and longer localized strings. These tests become especially useful alongside resizing because the most difficult layouts often combine a narrow width with larger content.</p><p>For performance-sensitive apps, Instruments 27 adds Run Comparisons for measuring changes between profiling sessions and expands the Swift executors instrument for investigating work running on the main actor and other executors. iOS 27 also introduces a new Swift-first MetricKit API. It continues to deliver app-health metrics and crash and hang diagnostics, while adding memory exception diagnostics and the ability to break metrics down by app-defined states.</p><p>Finally, I&#8217;d avoid leaving all of this work until the last beta. APIs and behavior can still change throughout the beta period, but testing early gives us more time to report issues through Feedback Assistant and adjust the app without rushing just before the public release.</p><div><hr></div><h2>SwiftUI Books with 20% off! &#128218;</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XKb2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 424w, /__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 848w, /__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XKb2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png" width="1456" height="436" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b828e329-4ff7-4ed2-a778-973274c35774_2538x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:436,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283978,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/210277491?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 424w, /__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 848w, /__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XKb2!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb828e329-4ff7-4ed2-a778-973274c35774_2538x760.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>New SDK releases are exciting, but they also remind me how important it is to understand the behavior behind the APIs we use. Many of the issues Xcode 27 now helps us identify are related to the same fundamental topics we deal with every year: view identity, state ownership, data dependencies, layout, and performance.</p><p>I cover these foundations in <a href="https://books.nilcoalescing.com/swiftui-fundamentals">SwiftUI Fundamentals</a>, which explains SwiftUI&#8217;s core principles and underlying mechanisms in depth. My newer book, <a href="https://books.nilcoalescing.com/the-swiftui-way">The SwiftUI Way</a>, builds on that foundation with practical guidance for structuring production apps, managing data flow, minimizing unnecessary view updates, and avoiding subtle anti-patterns as projects grow.</p><p>Both books include free lifetime updates. I recently released a substantial update to &#8220;The SwiftUI Way&#8221; with expanded guidance on data flow, view performance, stable custom bindings, environment values, and the changes to <code>@State</code> in Xcode 27.</p><p>Readers of this newsletter can use the coupon code <strong>ThoseWhoSwift"</strong> to get <strong>20% off</strong> any of my books or book bundles until the end of August. You can find all the available options on the <strong><a href="https://books.nilcoalescing.com/">Nil Coalescing books website</a>.</strong></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 278]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-278</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-278</guid><pubDate>Wed, 05 Aug 2026 20:00:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>iOS 27 shipped, and now the real work starts &#8212; not adopting the shiny new features, but finding where they rub against the app you&#8217;ve already built. Liquid Glass is the most visible example: stunning in the keynote, strange in a UIKit view that predates it by a decade. But it&#8217;s the same story across the cycle &#8212; the gap between what demos cleanly and what survives contact with a real, aging codebase. This week is about that gap, and the field notes people are writing as they hit it.</p><p>Hit an iOS 27 surprise in your own app? Reply and tell me &#8212; I&#8217;m collecting the good war stories.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h1>When the Glass Meets the Girder</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer</em></p><p>There&#8217;s a particular moment in every major design transition that nobody puts in the keynote. It&#8217;s the moment you build your project against the new SDK, launch the app you&#8217;ve shipped for years, and watch something you didn&#8217;t touch look subtly, unmistakably wrong. A button with the wrong corner. A bar that doesn&#8217;t blur where it used to. A control that was crisp yesterday and is now floating in a way you never asked for. Welcome to Liquid Glass in production.</p><p>I want to talk about that moment honestly, because the discourse around a new design language tends to split into two unhelpful camps. One says it&#8217;s gorgeous and you should adopt it everywhere immediately. The other says it&#8217;s a regression and you should fight it. Both miss the actual engineering reality, which is more interesting and more useful: a system-wide design language is not a coat of paint you apply. It&#8217;s a set of assumptions the framework now makes about your views &#8212; and the friction you feel is the distance between those new assumptions and the ones your codebase was built on.</p><p>Here&#8217;s the thing about Liquid Glass specifically. It&#8217;s a material, and materials are contextual by nature. A glass button assumes it sits on top of something worth seeing through. A minimizing bar assumes there&#8217;s content behind it that benefits from the effect. These are reasonable assumptions &#8212; until they meet a ten-year-old UIKit view hierarchy that was architected when every surface was opaque and every layer was flat. The framework does its best to adapt your old views to the new material, and most of the time it succeeds. The pitfalls live in the cases where it can&#8217;t, and those cases are exactly the ones a keynote demo will never show you, because keynote demos are built fresh, in the new world, with none of the accumulated assumptions of a real app.</p><p>This is why &#8220;just adopt it&#8221; is bad advice and &#8220;just fight it&#8221; is worse. The right posture is the one experienced engineers take toward any system-level change: understand what the framework now assumes, audit where your app violates those assumptions, and decide &#8212; deliberately, view by view &#8212; where to adapt and where to opt out. Liquid Glass gives you compatibility escape hatches for a reason. They&#8217;re not admissions of failure. They&#8217;re the framework acknowledging that your app has history, and history has weight.</p><p>The deeper lesson here isn&#8217;t about glass at all. It&#8217;s about what a design language actually is, underneath the marketing. It&#8217;s a contract about how surfaces relate to each other &#8212; depth, translucency, hierarchy, motion. When Apple changes that contract, every view you own is silently re-signed under the new terms, whether you read them or not. The apps that transition well aren&#8217;t the ones that adopt fastest or resist hardest. They&#8217;re the ones that treat the new contract as something to actually read &#8212; to understand where their existing UI agrees with it, where it conflicts, and where a five-minute opt-out saves a week of chasing a visual bug that was never a bug, just a disagreement about assumptions.</p><p>And Liquid Glass is only the most visible instance of a pattern that runs through this whole release. The same gap shows up everywhere real apps meet iOS 27: in the rendering model, in the architecture decisions that determine how easily you adapt, in the long-standing rough edges the framework quietly smoothed while you weren&#8217;t looking. The friction isn&#8217;t a bug in the release. It&#8217;s the tax every mature codebase pays when the platform moves &#8212; and the apps that pay it cheaply are the ones built to bend.</p><p>So if you&#8217;re staring at a control that looks wrong this week and you didn&#8217;t change it, you&#8217;re not losing your mind. The framework changed the terms. Go read them &#8212; the field guides are already being written, and the good ones map the pitfalls before you fall in. That&#8217;s the whole job this cycle: not adopting blindly, not resisting reflexively, but understanding precisely where the new platform meets the girder of everything you already built.</p><div class="pullquote"><p>What&#8217;s the strangest Liquid Glass behavior you&#8217;ve encountered in a real app? Hit reply&#8212;the best examples may appear in next week&#8217;s issue.</p></div><h1 style="text-align: center;">Related reading on this week's theme &#128218;</h1><p>iOS 27 meets real apps &#8212; the friction, the fixes, and the field notes. Liquid Glass leads, but the theme runs deeper: rendering, architecture, and the rough edges the framework quietly smoothed.</p><h3><a href="https://fatbobman.com/en/posts/liquid-glass-a-field-guide-to-uikit-compatibility-pitfalls/">Liquid Glass: A Field Guide to UIKit Compatibility Pitfalls</a></h3><p>Fatbobman documents the issues appearing when Liquid Glass meets existing UIKit code, including <code>UIBarButtonItem</code>, <code>UITabBarController</code>, <code>WKWebView</code>, and <code>UIStepper</code>, with practical workarounds for each.</p><p>A strong field guide for teams updating mature UIKit apps.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://livsycode.com/swiftui/changing-the-shape-of-glass-buttons-in-swiftui/">Changing the Shape of Glass Buttons in SwiftUI</a></h3><p>Livsy Code explores how Liquid Glass interacts with custom SwiftUI button shapes&#8212;and how to keep control of the corners when the defaults don&#8217;t fit your design.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.sagarunagar.com/blog/asyncimage-caching-wwdc-2026/">AsyncImage Finally Gets Caching in SwiftUI</a></h3><p>Sagar Unagar examines the new caching behavior in <code>AsyncImage</code> and what it means for network usage, repeated image loads, and scrolling performance.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.swiftbysundell.com/articles/swift-protocols-and-the-main-actor/">Swift Protocols and the Main Actor</a></h3><p>John Sundell on how actor isolation actually works with protocols &#8212; one of those foundational topics that quietly trips up even experienced developers as concurrency tightens.</p><p><strong><span>&#128205;Level: Advanced</span></strong></p><h3><a href="https://soumyamahunt.medium.com/stop-using-unchecked-sendable-2e00bd6cb122?source=rss-41d824adb39d------2">Stop Using @unchecked Sendable</a></h3><p>Soumya Mahunt makes the case against reaching for @unchecked Sendable as an escape hatch &#8212; what it really costs you, and the safer patterns that get you the same result.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://danielsaidi.com/blog/2026/06/08/introducing-listkit">Introducing ListKit: An Open-Source Library for SwiftUI Lists</a></h3><p>Daniel Saidi open-sources ListKit &#8212; reusable view components and extensions for the list problems everyone re-solves from scratch, from sectioning to selection to reordering.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.nsvasilev.com/posts/approachable_concurrency/">Demystifying Thread Hopping with Swift 6.2 Approachable Concurrency</a></h3><p>Nikita Vasilev breaks down what actually happens when your code hops threads under Swift 6.2's approachable concurrency &#8212; and how to reason about it instead of guessing.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://www.pointfree.co/blog/posts/219-new-in-sqlitedata-sectioned-queries">New in SQLiteData: Sectioned Queries</a></h3><p>Point-Free adds sectioned queries to SQLiteData &#8212; a clean way to drive sectioned SwiftUI lists straight from your database without hand-rolling the grouping.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=grx7lcto">Hello Developer: July 2026</a></h3><p>Apple's monthly developer digest rounds up the latest across the 27 platform releases &#8212; new documentation, sample code, and release notes, plus design resources and WWDC26 follow-ups worth a scan.</p><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://nilcoalescing.com/blog/KeepingCanvasInteractionsResponsiveWithFrameReprojection/">Keeping Canvas Interactions Responsive with Frame Reprojection</a></h3><p>Matthaus Woolard on maintaining responsive canvas interactions under the new rendering model using frame reprojection &#8212; a look under the hood of how modern SwiftUI stays smooth under load.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://livsycode.com/best-practices/the-ios-testing-strategy-agent-skill/">The iOS Testing Strategy Agent Skill</a></h3><p>Artem Mirzabekian shares an agent skill built around a practical iOS testing strategy.<br>It&#8217;s a useful example of turning team conventions&#8212;what to test, how to structure tests, and which edge cases matter&#8212;into repeatable instructions an AI coding agent can follow.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://rudrank.com/a-sols-work-shipping-with-gpt-5-6-sol">A Sol's Work: Shipping with GPT-5.6 Sol</a></h3><p>Rudrank Riyam gives a coding agent  a real engineering task, step away fro several hours, and the checks whether the final report matches what actually happened. <br>An honest account of where long-running agent work succeeds- and where human verification is still essential.</p><p><strong>&#128205;Level: Intermediate</strong></p><p></p><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://toyboy2.medium.com/create-your-keyboard-for-app-theme-customizing-keyboard-in-swiftui-9c5283ed34e4">Building a Custom In-App Keyboard in SwiftUI</a></h3><p>Lee young-jun needed an in-app numeric keyboard and discovered SwiftUI's <code>TextField</code> gives you no clean hook for it &#8212; so he went spelunking through the UIKit view hierarchy to find the underlying <code>UITextField</code> and swap its <code>inputView</code>. A genuinely instructive walk through the messy reality of bridging SwiftUI and UIKit, dead ends included, ending with a sharp note on why banking and OTP apps ship custom keyboards in the first place.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://thorsten-stark.de/posts/2026-08-13-Shipping-A-SwiftData-App-With-iCloud-Sync-Part-3/">Shipping a SwiftData App with iCloud Sync</a></h3><p>Thorsten Stark walks through taking a SwiftData app from local persistence to multi-device CloudKit sync, including model constraints, container setup, and duplicate- record problems caused by concurrent device updates.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=zfEt6PLICr8">SwiftUI Image Caching Explained: Faster Lists and Better Performance</a></h3><p>Stewart Lynch explains image caching in SwiftUI end to end &#8212; why uncached liimage loading hurts scrolling performance, how a caching layer helps, and how to build one clearly.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 277]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-277</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-277</guid><pubDate>Wed, 29 Jul 2026 20:01:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>Last week the iOS 27 beta landed and everyone braced for what breaks. This week is the other side of that coin &#8212; the quiet, genuinely useful APIs Apple slipped into iOS 27 that make code you already write simpler. The stuff that never gets a keynote slide, but shows up in your codebase for years.</p><p>Got a favorite iOS 27 API nobody&#8217;s talking about? Hit reply &#8212; I&#8217;m collecting them.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!OSFg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 424w, /__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 848w, /__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 1272w, /__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!OSFg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png" width="1200" height="50" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:50,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4106,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/208699686?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 424w, /__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 848w, /__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 1272w, /__u/substackcdn.com/image/fetch/$s_!OSFg!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa90e69de-2f4e-482f-babd-c9de8ec2f9e5_1200x50.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h3><a href="https://www.revenuecat.com/release/meet-rico-your-embedded-app-growth-advisor-2026-05-05/?utm_medium=sponsored&amp;utm_source=iOSDevTools&amp;utm_campaign=newsletter&amp;utm_content=rico">The AI Agent for Your RevenueCat Data</a></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6k4F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 424w, /__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 848w, /__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6k4F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png" width="554" height="377.8517298187809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:828,&quot;width&quot;:1214,&quot;resizeWidth&quot;:554,&quot;bytes&quot;:388675,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/208699686?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 424w, /__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 848w, /__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6k4F!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bbff3a9-c205-485d-b274-ede1253d7b9c_1214x828.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Meet Rico! &#128075;</h4><p>RevenueCat&#8217;s embedded AI app growth advisor for subscription apps. Ask questions about churn, trials, pricing, paywalls, or retention and get answers using your app&#8217;s real subscription data directly inside RevenueCat and Slack.</p><p>Built to help iOS developers make smarter monetization decisions faster.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.revenuecat.com/release/meet-rico-your-embedded-app-growth-advisor-2026-05-05/?utm_medium=sponsored&amp;utm_source=iOSDevTools&amp;utm_campaign=newsletter&amp;utm_content=rico&quot;,&quot;text&quot;:&quot;Try Rico today!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.revenuecat.com/release/meet-rico-your-embedded-app-growth-advisor-2026-05-05/?utm_medium=sponsored&amp;utm_source=iOSDevTools&amp;utm_campaign=newsletter&amp;utm_content=rico"><span>Try Rico today!</span></a></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h1>The Quiet Half of iOS 27</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer, creator of FoundationModelsKit</em></p><p>Every WWDC has two halves. There&#8217;s the loud half &#8212; the keynote feature, the framework everyone live-tweets, the thing that lands on every &#8220;what&#8217;s new in iOS 27&#8221; listicle by Tuesday afternoon. And then there&#8217;s the quiet half: the small API refinements that never trend, never get a session to themselves, and turn out to matter far more to your day-to-day code than the headline act ever will.</p><p>I want to make the case for the quiet half &#8212; because this year it&#8217;s unusually good, and because the quiet changes are the ones that actually change how you write things.</p><p>Here&#8217;s the pattern I keep noticing in iOS 27. For years, a whole category of ordinary UI work lived in an awkward middle ground: not hard exactly, but not supported either. Swipe actions only worked inside List. Reordering only worked inside List. Adaptive panels meant hand-rolling a detent system and hoping it behaved in landscape. Toolbar customization meant quietly fighting the framework&#8217;s defaults. You could do all of it &#8212; you just did it by working around the framework instead of with it. Every iOS codebase of a certain age has a folder full of these workarounds, and everyone who&#8217;s touched one knows the specific dread of opening it.</p><p>What iOS 27 quietly does is close a lot of those gaps at once. Swipe actions work outside List now. Reordering has real APIs instead of a custom drop-delegate dance. Size classes gave way to a more honest model of available space &#8212; which suddenly matters, now that iPhone apps resize. None of these got a dramatic reveal. All of them delete code you currently maintain.</p><p>And that&#8217;s the real point, the one I&#8217;d underline twice. The loud features <em>add capability</em> &#8212; new things your app can do. The quiet features <em>remove liability</em> &#8212; workarounds you no longer have to own. Those two are not equally valuable, and we consistently act like they are. A new capability is something you adopt when you have the time and the reason. A removed workaround is tech debt that stops being your problem the moment you migrate &#8212; no adoption required, no feature to design, just deletion. And deletion compounds. Every custom reordering implementation you delete is code you no longer test, no longer debug, no longer explain to the engineer who inherits that file in eighteen months.</p><p>There&#8217;s a reason this half gets ignored, and it isn&#8217;t laziness. It&#8217;s that the quiet changes don&#8217;t announce themselves. Nobody writes a breathless thread titled &#8220;swipe actions now work in a ScrollView.&#8221; It doesn&#8217;t demo well. It doesn&#8217;t screenshot. But six months from now, the teams that went looking for these changes will have measurably simpler codebases than the teams that only adopted the headline features &#8212; not because they&#8217;re better engineers, but because they read past the first screen of the release notes.</p><p>So here&#8217;s my actual advice for this cycle, and it&#8217;s almost aggressively practical: before you build anything custom in iOS 27, check whether Apple already built it. The odds this year are genuinely good that they did. The framework spent this release catching up to a pile of things we&#8217;ve been hand-rolling for half a decade, and the catch-up is sitting in the quiet half, waiting for someone to notice.</p><p>Read the release notes to the end. That&#8217;s the whole tip. The loud half will find you on its own &#8212; it always does. The quiet half you have to go looking for, and this year, it more than pays for the trip.</p><div><hr></div><h1>Related reading on this week's theme &#128218;</h1><h3><a href="https://nilcoalescing.com/blog/BuildingAdaptiveNonModalPanelsInSwiftUI/">Building Adaptive Non-Modal Panels in SwiftUI</a></h3><p>Matthaus Woolard builds a detent-based, non-modal sheet that adapts from a bottom panel in portrait to an edge-aligned one in landscape &#8212; exactly the kind of thing you used to hand-roll and pray over.</p><p><strong>&#128205;Level: Advanced</strong></p><h3><a href="https://swiftwithmajid.com/2026/06/23/taking-control-of-toolbar-items-in-swiftui/">Taking Control of Toolbar Items in SwiftUI</a></h3><p>Majid Jabrayilov on iOS 27's new toolbar APIs &#8212; finer control over appearance now that the design language splits content and controls into separate layers.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://danielsaidi.com/blog/2026/05/22/making-a-swiftui-sheet-automatically-size-to-fit-its-content">Making a SwiftUI Sheet Automatically Size to Fit Its Content</a></h3><p>Daniel Saidi on getting sheets to size to their content instead of defaulting to half the screen &#8212; a small, satisfying win over a default everyone has fought at some point.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="/__u/antongubarenko.substack.com/p/ios-27-uibarminimization">iOS 27: UIBarMinimization</a></h3><p>Anton Gubarenko on iOS 27&#8217;s new bar-minimization behavior &#8212; how to control the way bars collapse and expand, and where it fits in a modern multi-window layout.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://serialcoder.dev/text-tutorials/swiftui/wwdc26-reordering-items-in-swiftui-lists-and-grids/">WWDC26: Reordering Items in SwiftUI Lists and Grids</a></h3><p>Gabriel Theodoropoulos walks through the new reorderable and reorderContainer APIs &#8212; native drag-to-reorder that finally works beyond List.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://fatbobman.com/en/posts/from-size-class-to-available-space/">From Size Class to Available Space</a></h3><p>Fatbobman on why iOS 27 moves past size classes toward a more honest model of available space &#8212; and why that matters now that iPhone apps resize.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://tanaschita.com/ios-code-signing-provisioning/">Understanding Code Signing and Provisioning in iOS</a></h3><p>Natascha Fadeeva demystifies the whole signing chain &#8212; certificates, provisioning profiles, entitlements &#8212; as a practical mental model instead of a black box you fight at build time.</p><p><strong><span>&#128205;Level: Intermediate</span></strong></p><h3><a href="https://tanaschita.com/swiftdata-persistence-boundaries/">Keeping SwiftData Behind a Boundary</a></h3><p>Natascha Fadeeva on wrapping SwiftData behind a protocol boundary so your app isn't married to the framework &#8212; cleaner tests, easier migration, fewer surprises down the line.</p><p><strong>&#128205;Level: Intermediate</strong></p><h3><a href="https://swiftwithmajid.com/2026/06/16/swipe-actions-outside-of-list-in-swiftui/">Swipe Actions Outside of List in SwiftUI</a></h3><p>Majid Jabrayilov on one of iOS 27&#8217;s most overdue additions: swipeActions now works in a ScrollView and custom layouts, not just List.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.avanderlee.com/xcode/ios-time-zone-testing-physical-iphone/">Test iOS Apps in Different Time Zones</a></h3><p>Antoine van der Lee on catching an entire class of date bugs before your users do &#8212; how to actually run your app under a different time zone on a physical device.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=awedznci">New Business Terms for Link-Out Purchases</a></h3><p>Apps that communicate or promote offers for digital goods outside the App Store will be subject to new terms &#8212; an initial acquisition fee, a store services fee, and, for the EU External Purchase Link Entitlement, the Core Technology Commission.</p><h3><a href="https://developer.apple.com/help/app-store-connect/reference/app-uploads/on-demand-resources-size-limits/">On-Demand Resources Are Deprecated in iOS 27</a></h3><p>Apple's App Store Connect docs now list On-Demand Resources (and the NSBundleResourceRequest API) as deprecated across iOS 27, iPadOS 27, tvOS 27, and watchOS 27, with support to be removed in a future release. Apple recommends migrating to Background Assets.</p><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://nilcoalescing.com/blog/BlendModesInSwiftUI/">Blend Modes in SwiftUI</a></h3><p>Natalia Panferova walks every SwiftUI blend mode through focused visuals and real use cases &#8212; and shows how to control exactly which views participate in each operation.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://www.avanderlee.com/debugging/introducing-diagnostics-improved-debugging-and-user-support/">User Diagnostics Reports: Solving Bugs Faster with AI Agents</a></h3><p>Antoine van der Lee on turning real user diagnostic reports into fixes &#8212; feeding crash context to an AI agent and getting back a reviewed pull request instead of a raw stack trace.</p><p><strong>&#128205;Level: Intermediate</strong></p><p></p><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://rudrank.com/exploring-foundation-models-bridging-gemini-video-with-customsegment">Bridging Gemini Video with Foundation Models and CustomSegment</a></h3><p>Rudrank Riyam routes video through a LanguageModelSession to Gemini &#8212; Apple's on-device model takes images but not video, so he bridges the gap with a custom Transcript.CustomSegment and a LanguageModelExecutor, verifying each layer along the way.</p><p><strong>&#128205;Level: Advanced</strong></p><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=N_0P9mp5T6w">iOS 27 SwiftUI Updates in Action</a></h3><p>A hands-on tour of this cycle's SwiftUI changes in a real project &#8212; reorderable views, swipe actions outside List, and the new navigation and presentation APIs, shown in code.</p><p><strong>&#128205;Level: Intermediate</strong></p><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 276]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-276</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-276</guid><pubDate>Wed, 22 Jul 2026 20:01:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>The iOS 27 public beta shipped on July 13 &#8212; which means the conversation just shifted from &#8220;what did Apple announce&#8221; to &#8220;what happens when I actually run this.&#8221; This issue is about that gap.</p><p>If you&#8217;ve installed the beta and hit something surprising, hit reply &#8212; I&#8217;m collecting real-world beta friction for a future issue.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h1>The Public Beta Isn&#8217;t a Preview. It&#8217;s a Deadline.</h1><p><em>with Divya Ravi &#8212; Technical Editor, iOS engineer, creator of FoundationModelsKit</em></p><p>Every year the public beta gets framed as a gift: try the new features early, play with Siri, see what&#8217;s coming. That framing is comfortable, and for most users it&#8217;s correct. For developers, it&#8217;s a trap &#8212; because the public beta isn&#8217;t the moment you <em>preview</em> iOS 27. It&#8217;s the moment the clock on your existing app starts ticking out loud.</p><p>Here&#8217;s the mental model shift I&#8217;d push this cycle: a beta is not a demo of the future. It&#8217;s a dry run of a migration you have already been assigned, whether you&#8217;ve accepted the ticket or not.</p><p><strong>Why &#8220;it still works on my device&#8221; is the most dangerous sentence in July.</strong></p><p>The trap with betas is that your app usually <em>does</em> still launch. You install iOS 27, open your app, tap around, and nothing obviously breaks. That&#8217;s the false negative that costs teams their September. Because the things that break in a major OS transition rarely break at runtime on day one &#8212; they break at the boundaries: at build time when you move to the new SDK, at submission time when a new requirement gets enforced, and at the edges of APIs whose behavior shifted by a few degrees rather than flipping outright.</p><p>Consider the shape of this year&#8217;s mandates. Building against the iOS 27 SDK now enforces the UIScene lifecycle &#8212; an app that hasn&#8217;t migrated doesn&#8217;t degrade gracefully, it fails to launch. The Liquid Glass opt-out that teams leaned on for a year to buy time is now simply ignored. These aren&#8217;t features you opt into. They&#8217;re floors you fall through if you weren&#8217;t ready. And critically: none of them show up if you only test by installing the beta on a phone and tapping around. They show up when you rebuild.</p><p><strong>The real work is boundary testing, not feature testing.</strong></p><p>The instinct in beta season is to test the new stuff &#8212; the shiny APIs, the headline features. That&#8217;s backwards. The new stuff isn&#8217;t shipping in your app until you write it. What&#8217;s shipping in your app in September is <em>everything you already wrote</em>, recompiled against a new SDK, running on an OS whose assumptions moved. So the highest-value beta work is regression work: rebuild against the new SDK today, and watch what your existing code does at the three boundaries that actually matter &#8212;</p><p><em>Build boundary:</em> does the project compile against the iOS 27 SDK, and do the new SDK-enforced requirements (scene lifecycle, launch storyboard, design compatibility) pass? This is where &#8220;won&#8217;t launch&#8221; bugs live, and it&#8217;s a compile-and-run-once check, not a feature you have to exercise.</p><p><em>Behavioral boundary:</em> do the APIs you already depend on still behave identically? Major-version transitions are where a method that returned one thing quietly starts returning another under specific conditions. These are the expensive bugs, because your code is &#8220;correct&#8221; and the ground moved.</p><p><em>Submission boundary:</em> will App Store Connect accept the build? Some requirements aren&#8217;t enforced at runtime at all &#8212; they&#8217;re enforced at upload, in September, when you have no runway left.</p><p><strong>Why this is really an architecture question in disguise.</strong></p><p>If migrating to a new SDK is a scramble every single year, that&#8217;s not an Apple problem &#8212; it&#8217;s a signal about your codebase. The teams that move through a beta cycle in an afternoon are the ones whose apps were built so the OS is a dependency they can swap, not a foundation poured into every layer. Clean scene management, a UI layer that doesn&#8217;t assume a specific design system, submission requirements encoded in CI rather than in someone&#8217;s memory &#8212; these are the things that turn &#8220;OS migration&#8221; from a summer-eating project into a checklist.</p><p>The public beta is the cheapest, lowest-stakes environment you will ever get to find out which kind of codebase you actually have. Use it as the dry run it is &#8212; not the preview it&#8217;s dressed up as. The teams treating July as playtime are the same teams that will be firefighting in September. The ones treating it as a deadline will ship the day iOS 27 goes GA and never think about it again.</p><p>Rebuild against the SDK this week. Not because the new features demand it &#8212; because your existing app already does.</p><p><em>Agree, disagree, already knee-deep in a scene-lifecycle migration? Hit reply &#8212; I read every one.</em></p><blockquote><p>New here? Subscribe free to get &#8220;Under the Hood&#8221; and the week&#8217;s best iOS picks every issue.</p></blockquote><div><hr></div><h1>Related reading on this week's theme &#128218;</h1><h3><a href="https://blog.makwanbk.com/ios-27-sdk-3-major-requirements-that-migh-break-your-app">iOS 27 SDK: 3 Major Requirements That Might Break Your App</a></h3><p>Makwan Barzan on the mandatory UIScene lifecycle, the ignored Liquid Glass opt-out, and the enforced launch screen.</p><h4><a href="https://blog.makwanbk.com/ios-27-sdk-3-major-requirements-that-migh-break-your-app">Read more.</a>&#128205;Level: Intermediate</h4><p></p><h3><a href="https://www.wesleymatlock.com/foundation-models-hybrid-platform/">Foundation Models Is Now a Hybrid Platform &#8212; and Picking the Tier Is the New Design Decision</a></h3><p>Wesley Matlock on routing one <code>LanguageModelSession</code> across on-device, Private Cloud, or frontier.</p><h4><a href="https://www.wesleymatlock.com/foundation-models-hybrid-platform/">Read more.</a>&#128205;Level: Advanced</h4><p></p><h3><a href="https://livsycode.com/swift/continuation-vs-checkedcontinuation-vs-unsafecontinuation-in-swift/">Continuation vs CheckedContinuation vs UnsafeContinuation</a></h3><p>The three ways to bridge callbacks into async/await, and exactly what each trades away.</p><h4><a href="https://livsycode.com/swift/continuation-vs-checkedcontinuation-vs-unsafecontinuation-in-swift/">Read more.</a>&#128205;Level: Advanced</h4><p></p><h3><a href="https://nathanfennel.com/blog/swiftui-animation-techniques-2026">SwiftUI Animation Techniques: The iOS 27 Update</a></h3><p>Nathan Fennel on layer shaders, the Timeline API, and chaining multi-step motion.</p><h4><a href="https://nathanfennel.com/blog/swiftui-animation-techniques-2026">Read more.</a>&#128205;Level: Intermediate</h4><p></p><h3><a href="https://www.swiftjectivec.com/copywriting-with-agents-and-apple-designers/">Copywriting with Agents and&#8230;Apple Designers?</a></h3><p>Jordan Morgan on using AI agents for the craft <em>around</em> the app, not just the code.</p><h4><a href="https://www.swiftjectivec.com/copywriting-with-agents-and-apple-designers/">Read more.</a>&#128205;Level: Beginner</h4><p></p><h3><a href="https://www.youtube.com/watch?v=ax67umrlFQc">SwiftUI Network Reachability with NWPathMonitor and Observation</a></h3><p>Stewart Lynch's clean, modern replacement for the old Reachability class.</p><h4><a href="https://www.youtube.com/watch?v=ax67umrlFQc">Watch here.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">This Week in Those Who Swift &#128478;&#65039;</h1><p style="text-align: center;"><em>The latest across Swift, Apple, AI, and the community.</em></p><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://forums.swift.org/t/development-open-for-swift-6-3-4-for-non-darwin-platforms/88288">Swift 6.3.4 development is open for non-Darwin platforms</a></h3><p>The merge window is open now, closing July 24, with release targeted for the end of July &#8212; worth tracking if you ship Swift on Linux or Windows.</p><h4><a href="https://forums.swift.org/t/development-open-for-swift-6-3-4-for-non-darwin-platforms/88288">Read more.</a><span>&#128205;Level: Intermediate</span></h4><h3><a href="https://nilcoalescing.com/blog/UnstableDefaultEnvironmentValuesInSwiftUI/">The Hidden Cost of Unstable SwiftUI Environment Defaults</a></h3><p>Natalia Panferova flags a real footgun: class-typed @Entry defaults get reallocated on every access, so SwiftUI sees a "new" value each time and re-evaluates views that shouldn't update. The fix is a one-line move to stable storage.</p><h4><a href="https://nilcoalescing.com/blog/UnstableDefaultEnvironmentValuesInSwiftUI/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.swiftbyrahul.com/posts/SwiftActorsExplainedWithRealExamples/">Swift Actors Explained with Real Examples</a></h3><p>Rahul breaks actors down from first principles &#8212; how they protect shared mutable state by serializing access, why that eliminates data races by design, and how to reach for them instead of locks and dispatch queues.</p><h4><a href="https://www.swiftbyrahul.com/posts/SwiftActorsExplainedWithRealExamples/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://www.apple.com/newsroom/2026/06/apple-expands-app-store-capabilities-to-help-developers-grow-and-reach-new-users/">Apple expands App Store capabilities to help developers grow and reach new users</a></h3><p>Covers the age-rating/Time Allowances change, Creative Assets, Asset Library, Personalized Collections &#8212; the big developer-facing App Store update.</p><h4><a href="https://www.apple.com/newsroom/2026/06/apple-expands-app-store-capabilities-to-help-developers-grow-and-reach-new-users/">Read more.</a>&#128205;Level: Beginner</h4><h3><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-27-release-notes">Xcode 27 Release Notes</a></h3><p>The technical rundown of what's new and changed in the iOS 27 SDK &#8212; AppKit, SwiftUI, StoreKit, Metal, and more.</p><h4><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-27-release-notes">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://developer.apple.com/news/">Latest Developer News &amp; Updates</a></h3><p>Apple's running feed of App Store Connect, TestFlight, and submission changes &#8212; TestFlight now accepts Xcode 27 beta builds, and IAPs can be submitted standalone. &#8212; this one's a <strong>feed</strong> not a permalink, but it's the honest home for "the latest submission changes"</p><h4><a href="https://developer.apple.com/news/">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://fatbobman.com/en/posts/taming-row-height-and-spacing-jumps/">Taming Row Height and Spacing Jumps in SwiftUI List</a></h3><p>Fatbobman digs into why List won't smoothly interpolate a row whose height changes dynamically, then builds a pure-SwiftUI fix using Animatable, a custom Layout, LayoutValueKey, and state decoupling.</p><h4><a href="https://fatbobman.com/en/posts/taming-row-height-and-spacing-jumps/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">AI &amp; Tooling &#129302;</h1><h3><a href="https://cuteios.dev/2026/07/14/previews-and-mcp/">Rendering SwiftUI Previews with Xcode's MCP Server</a></h3><p>Xcode's MCP bridge grew from 20 tools to 47 in the Xcode 27 beta. Amy Worrall skips the agent entirely and drives RenderPreview directly over JSON-RPC, turning Xcode into a rendering service for a SwiftUI preview gallery.</p><h4><a href="https://cuteios.dev/2026/07/14/previews-and-mcp/">Read more.</a>&#128205;Level: Advanced</h4><p></p><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://chatforest.com/builders-log/apple-foundation-models-ios-27-on-device-llm-api-builder-guide/">Apple Foundation Models in iOS 27: The Complete Builder Guide</a></h3><p>A thorough guide to on-device LLM inference &#8212; how Core AI, Foundation Models, and your app logic layer together, plus the larger model, on-device fine-tuning, expanded context, and full tool calling.</p><h4><a href="https://chatforest.com/builders-log/apple-foundation-models-ios-27-on-device-llm-api-builder-guide/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=tNxEqyUVGck">What's New in SwiftUI for iOS 27</a></h3><p>A walkthrough of the new SwiftUI APIs landing this cycle &#8212; lazy @State, faster compiles, reorderable(), swipe actions beyond List, and the new Document protocol.</p><h4><a href="https://www.youtube.com/watch?v=tNxEqyUVGck">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Community &#129309;</h1><h3><a href="https://www.nextappcon.com/swiftcon">SwiftCon Returns to Berlin This October</a></h3><p>SwiftCon is back as part of nextapp devCon (Oct 7&#8211;9) &#8212; six mobile-dev conferences under one roof, spanning Swift, Android, Flutter, React Native, AI, and XR. Worth a look if you're planning fall conference travel.</p><h4><a href="https://www.nextappcon.com/swiftcon">Read more.</a>&#128205;</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 275]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-275</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-275</guid><pubDate>Wed, 15 Jul 2026 21:18:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p><strong>We have a new team member! &#128587;&#8205;&#9792;&#65039;</strong></p><p>Divya Ravi, Senior iOS Engineer at Unity and creator of <a href="/__u/divyaravidev.substack.com/p/introducing-foundationmodelskit-production">FoundationModelsKit</a>, is joining <em>Those Who Swift</em> as a new newsletter editor.</p><p>If you&#8217;d like to get to know Divya, check out her <a href="https://www.linkedin.com/in/divya-ravi-955378105/">LinkedIn</a> and <a href="https://x.com/DivyaRaviIos">X</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Xv4-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xv4-!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbafe630a-0cf7-4488-acd7-aca4fe01a151_1584x396.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Anton isn&#8217;t going anywhere!</p><p>He&#8217;s now the editor of our <strong><a href="https://thosewhoswift.com/">new website</a></strong> - which brings me to the second big news. &#129395;</p><p>We now have a blog with unique, quality content.</p><p>New content, collaborations, partnerships, special deals, and more coming soon. Stay tuned! &#128526;&#129304;</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nS4n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 424w, /__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 848w, /__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nS4n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png" width="1200" height="50" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:50,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4106,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 424w, /__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 848w, /__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nS4n!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a7ff44-2c38-4846-9ee6-d942ebcea4df_1200x50.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>Own Your web2app Funnel and Get Paid in Days</strong></h2><p><span>web2wave lets subscription apps sell on the web first: users complete a quiz flow, pay, then download the app with an active subscription. The sale closes before install, so you don&#8217;t pay 15-30% app store fees on it.</span></p><ul><li><p><span>Get paid in 1-2 days instead of 30+, for much faster cash flow.</span></p></li><li><p><span>Build the full funnel with the no-code editor, or in a minute with Wavy AI or the web2wave MCP.</span></p></li><li><p><span>Ship A/B tests and cancellation flows without waiting on app releases.</span></p></li><li><p><span>Keep full web-side tracking and UTM attribution, even post-ATT.</span></p></li></ul><p>Payment coverage in web2app: direct integrations with Paddle, Stripe, Solidgate, FastSpring, Zotlo, Unlimit, Xsolla, PayPal, Billerix, and 100+ more via Primer.</p><p>Free to use until you launch paid traffic.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://web2wave.com/?utm_source=thosewhoswift&amp;utm_medium=newsletter&amp;utm_campaign=sponsorship2&quot;,&quot;text&quot;:&quot;Try web2wave free&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://web2wave.com/?utm_source=thosewhoswift&amp;utm_medium=newsletter&amp;utm_campaign=sponsorship2"><span>Try web2wave free</span></a></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kSUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kSUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png" width="1456" height="276" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:276,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131570,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/205959331?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 424w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 848w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1272w, /__u/substackcdn.com/image/fetch/$s_!kSUd!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff19657fb-691d-412f-b0f2-e1656dc6fb73_1584x300.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h1>Post-WWDC26: The 3 On-Device AI Patterns That Will Actually Ship This Year</h1><p><em>with Divya Ravi &#8212; Technical Editor &amp; iOS engineer, creator of FoundationModelsKit</em></p><p>Every June, WWDC produces the same split-screen reaction: a keynote full of features that sound revolutionary, followed by a developer community quietly asking which of them will actually be usable in a shipping app before next June. This year is no different. Between Siri AI, Private Cloud Compute, and a redesigned Foundation Models framework, there&#8217;s a lot to sort through &#8212; and most of the coverage so far has just listed announcements rather than telling you what to actually build against.</p><p>So here are the three patterns from WWDC26 I think are worth architecting around this cycle &#8212; not because they&#8217;re the flashiest, but because they&#8217;re the ones you can ship on, today, without waiting for a keynote demo to become real.</p><p><strong>1. Model portability is no longer a side project &#8212; it&#8217;s a protocol.</strong></p><p>Apple&#8217;s new LanguageModel protocol means your app&#8217;s AI logic doesn&#8217;t have to be married to Apple&#8217;s on-device model anymore. Swap in Claude, swap in Gemini, or fall back to on-device &#8212; all through the same session interface, with your tool calls and context management untouched. In practice, this turns a decision that used to require re-architecting your AI layer into a Swift Package Manager dependency change.</p><p>Why it matters: most teams have been quietly hedging against being locked into Apple&#8217;s model quality, especially for anything requiring nuanced reasoning. This protocol makes that hedge free. If your app currently has model logic tangled into your view layer or business logic, this is the year that tech debt gets expensive &#8212; everyone else&#8217;s app is about to be able to swap providers in an afternoon, and yours won&#8217;t be if the session boundary isn&#8217;t clean.</p><p><strong>2. Bring-your-own-model finally has a real home: Core AI.</strong></p><p>Core AI is Apple&#8217;s new answer to teams who don&#8217;t want to use Apple&#8217;s model at all &#8212; a full on-device deployment framework with a Python conversion pipeline and a Swift runtime, tuned to run across CPU, GPU, and Neural Engine without a server dependency. This has existed in rougher form via Core ML for years, but Core AI is the first version that feels like a first-class platform citizen rather than a workaround.</p><p>Why it matters: if you&#8217;ve been holding off on shipping a proprietary or fine-tuned model because the on-device tooling felt like a science project, that excuse is gone. The teams who move now &#8212; while most of the ecosystem is still only using Apple&#8217;s default model &#8212; get a real differentiation window before &#8220;on-device AI&#8221; becomes table stakes and looks identical across every app in a category.</p><blockquote><p><strong>&#8220;None of these patterns are really about AI capability &#8212; they&#8217;re about architecture. The apps that struggle won&#8217;t fail because the AI is bad. They&#8217;ll fail because the plumbing underneath was never built to be swapped, extended, or exposed in the first place.&#8221;</strong></p></blockquote><p><strong>3. App discovery is moving into the OS, not your app&#8217;s UI.</strong></p><p>Between the Spotlight semantic index, App Intents schemas, and the new View Annotations API, Apple is making a clear bet: the primary way people invoke your app&#8217;s functionality is about to be Siri asking on their behalf, not someone tapping your icon. Annotate your views, expose your actions through App Intents, and your content becomes something the system can reason about and act on &#8212; conversationally, without you building any of that interface yourself.</p><p>Why it matters: this is the one pattern that&#8217;s easy to underestimate because it doesn&#8217;t produce a flashy demo. But it&#8217;s the one most likely to quietly redefine what &#8220;distribution&#8221; means for an app over the next two years. Ignore it and you&#8217;re opting out of an entire invocation surface your competitors will be inside of.</p><p><strong>The thread connecting all three</strong></p><p>Model portability rewards apps with clean session boundaries. Core AI rewards apps that already separate inference from UI. App Intents rewards apps that expose actions as first-class objects instead of burying them in view controllers. None of this is really about AI capability &#8212; it&#8217;s about whether your architecture was ready for it.</p><p>If you&#8217;re planning your roadmap around this WWDC cycle, the highest-leverage work isn&#8217;t picking which shiny feature to bolt on first. It&#8217;s making sure your architecture can say yes to any of the three.</p><p><em>Agree, disagree, or think I&#8217;m missing a pattern? Just hit reply &#8212; I read every one.</em></p><div><hr></div><h1>                               Apple &#127823;</h1><h3><a href="https://blakecrosley.com/blog/foundation-models-tool-calling-ios-27">Foundation Models in iOS 27: Tool-Calling Control</a></h3><p>Blake Crosley digs into the new ToolCallingMode API and Apple&#8217;s built-in OCR and barcode tools &#8212; the kind of detail that matters once you&#8217;re past the keynote demo and into shipping.</p><ul><li><p>The new ToolCallingMode structure lets you control how aggressively the model calls tools mid-generation, and the framework can auto-switch modes to bound activity within a single request.</p></li><li><p>OCRTool and BarcodeReaderTool run entirely on-device, in your app&#8217;s own sandbox &#8212; Apple maintaining the recognition code changes who owns it, not where it runs.</p></li></ul><h4><a href="https://blakecrosley.com/blog/foundation-models-tool-calling-ios-27">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://jonbrown.org/blog/apple-intelligence-xcode-wwdc26-platform-control/">Apple&#8217;s WWDC26 AI Story Is About Control, Not Just Models</a></h3><p>Jon Brown&#8217;s read on the keynote pairs directly with this issue&#8217;s essay &#8212; if you only click one link this week, make it this one.</p><ul><li><p>Argues Apple Intelligence has less to work with when an app&#8217;s data model is vague or its actions aren&#8217;t cleanly represented &#8212; architecture first, AI second.</p></li><li><p>Makes the case that App Intents should be treated as core app structure from day one, not a Siri checkbox bolted on near ship.</p></li></ul><h4><a href="https://jonbrown.org/blog/apple-intelligence-xcode-wwdc26-platform-control/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://andrew.ooo/answers/wwdc-2026-developer-tools-xcode-swift-foundation-models-june-2026/">WWDC 2026 Developer Tools: Xcode 27, Swift, Foundation Models</a></h3><p>A blunt, opinionated take &#8212; and one I don&#8217;t think is right, which is exactly why it&#8217;s worth reading.</p><ul><li><p>Argues App Intents adoption is now effectively mandatory, since apps without it become invisible to Siri as an entry point.</p></li><li><p>I&#8217;d push back on &#8220;mandatory&#8221; for anything outside the productivity/utility category &#8212; but the underlying pressure is real and worth planning around either way.</p></li></ul><h4><a href="https://andrew.ooo/answers/wwdc-2026-developer-tools-xcode-swift-foundation-models-june-2026/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1>                               Tutorials &#128210;</h1><h3><a href="https://artemnovichkov.com/blog/getting-started-with-apple-foundation-models">Getting Started with Apple&#8217;s Foundation Models</a></h3><p>Artem Novichkov builds a HealthKit-powered health coaching feature using a custom Tool &#8212; the most practical, code-first entry point in this issue.</p><ul><li><p>Walks through defining a custom Tool that pulls live blood pressure data from HealthKit into a LanguageModelSession.</p></li><li><p>Good starting point if you haven&#8217;t touched Foundation Models yet &#8212; minimal boilerplate to get a working tool-calling session running.</p></li></ul><h4><a href="https://artemnovichkov.com/blog/getting-started-with-apple-foundation-models">Read more.</a>&#128205;Level: Beginner<br></h4><h3><a href="/__u/substack.com/@divyaravidev/p-204675868">Introducing FoundationModelsKit: Production Patterns for Foundation Models on iOS</a></h3><p><em>Full disclosure: this one&#8217;s mine &#8212; including it because it&#8217;s directly on-theme for this issue, not just because I wrote it.</em> At WWDC26, Apple made a bold move: Foundation Models now ship with iOS, on-device, with no download or external dependency.</p><ul><li><p>Walks through production patterns for actually shipping with Foundation Models, not just prototyping with it.</p></li><li><p>If you want the deeper technical background behind this issue&#8217;s essay, this is where it comes from.</p></li></ul><h4><a href="/__u/substack.com/@divyaravidev/p-204675868">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1>                                 Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.avanderlee.com/ai-development/swiftui-best-practices-xcode-27-agent-skill/">SwiftUI Best Practices, straight from Apple&#8217;s Xcode 27 Agent Skill</a></h3><p>Antoine van der Lee dissects the actual Markdown reference files Apple bundled into Xcode 27&#8217;s SwiftUI agent skill &#8212; and it&#8217;s basically a written confirmation of this issue&#8217;s whole thesis.</p><ul><li><p>The skill&#8217;s reference files split cleanly by concern &#8212; structure, data flow, environment, modifiers &#8212; all built around one idea: a view is SwiftUI&#8217;s unit of invalidation, and most performance problems come from invalidating more than you need to.</p></li><li><p>Worth reading even if you don&#8217;t use agents &#8212; it&#8217;s effectively Apple&#8217;s own internal SwiftUI style guide, now public.</p></li></ul><h4><a href="https://www.avanderlee.com/ai-development/swiftui-best-practices-xcode-27-agent-skill/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="/__u/antongubarenko.substack.com/p/swift-bits-my-top-xcode-ci-environment">Swift Bits: My Top Xcode CI Environment Variables</a></h3><p>Anton digs into Apple&#8217;s environment variable reference for Xcode Cloud &#8212; unglamorous, but exactly the kind of thing that saves you an afternoon of debugging why CI behaves differently from your local machine.</p><ul><li><p>Covers the popular variables for detecting which workflow, build action, and app target is running &#8212; the context most custom ci_scripts builds actually need.</p></li><li><p>A good reminder that hardcoded CI scripts age badly; context-aware ones survive team and project changes.</p></li></ul><h4><a href="/__u/antongubarenko.substack.com/p/swift-bits-my-top-xcode-ci-environment">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1>                                   Design &#127912;</h1><h3><a href="https://www.cultofmac.com/news/liquid-glass-changes-ios-27-macos-27">5 biggest Liquid Glass changes in iOS 27 and macOS 27</a></h3><p>A clear rundown of how Apple is walking back a year of Liquid Glass complaints &#8212; legibility, corner-radius consistency, and icon clarity all got real fixes this cycle.</p><ul><li><p>Apple&#8217;s HI design director confirmed most of these improvements apply automatically to apps already using the Liquid Glass framework, with minimal developer work required.</p></li><li><p>macOS 27 finally standardizes corner radius across apps &#8212; a small detail, but one that&#8217;s been a visible inconsistency since Liquid Glass launched.</p></li></ul><h4><a href="https://www.cultofmac.com/news/liquid-glass-changes-ios-27-macos-27">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1>                        Other cool stuff &#129520;</h1><h3><a href="https://www.donnywals.com/how-i-use-flowdeck-to-let-my-ai-agent-build-and-run-my-apps/">How I use FlowDeck to let my AI agent build and run my apps</a></h3><p>Donny Wals on folding an agentic coding tool into his existing workflow &#8212; a good counterweight to the rest of this issue, since it&#8217;s about AI helping you build, not AI features inside what you ship.</p><ul><li><p>Started using FlowDeck after the tool&#8217;s builder reached out following a post Donny made about managing AI agent context windows.</p></li><li><p>The interesting part isn&#8217;t the tool itself &#8212; it&#8217;s the workflow shift of agents opening PRs against real crash reports while you&#8217;re away from the keyboard.</p></li></ul><h4><a href="https://www.donnywals.com/how-i-use-flowdeck-to-let-my-ai-agent-build-and-run-my-apps/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1>                                   Video &#127909;</h1><h3><a href="https://developer.apple.com/videos/play/wwdc2026/240/">Build intelligent Siri experiences with App Schemas</a></h3><p>Straight from Apple&#8217;s own WWDC26 session &#8212; Dan Niemeyer walks through exactly how Siri understands and acts on your app&#8217;s content, which pairs directly with pattern 3 in this issue&#8217;s essay.</p><ul><li><p>Covers how App Entities model your existing content (a calendar event, a mail message, a photo) so the system can reason about it without you rebuilding your data model.</p></li><li><p>Demonstrates real cross-app actions, like Siri sending someone&#8217;s latest report by name &#8212; worth watching before you scope your own App Intents work this cycle.</p></li></ul><h4><a href="https://developer.apple.com/videos/play/wwdc2026/240/">Watch here.</a>&#128205;Level: Intermediate</h4><div><hr></div><p>Thanks for reading! </p><p><strong>Got a pick worth featuring? &#128236;</strong> Use the <strong><a href="https://thosewhoswift.com/submit-an-article/">submission form</a></strong> and share with more than 15,000 developers.</p><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 274]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-274</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-274</guid><pubDate>Wed, 08 Jul 2026 20:56:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>Fable 5 is back! At least for a little while. &#129310;</p><p>Anthropic has extended its availability until July 12, giving developers a few more weeks to work with the model before the next planned change.</p><p>The announcement turned out to be more controversial than expected. When access to Fable 5 was initially reduced, many users were automatically moved back to Claude 4.8. While still a capable model, plenty of developers noticed the difference. Longer reasoning, more consistent code generation, and overall responsiveness were among the areas where Fable 5 had earned its reputation. Going back felt less like a version update and more like losing a favorite development tool.</p><p>This situation also highlights an interesting challenge of cloud AI. Unlike traditional software, where you decide when to upgrade or downgrade, modern AI services can change underneath your workflow. The same prompt may produce different results depending on the currently available model, making consistency another variable developers have to consider.</p><p>Whether Fable 5 stays longer or not, one thing is clear: developers quickly adapt to better tools, and going backwards is never an easy sell.</p><p>Are you using Fable 5 in your daily workflow, or has another model become your primary coding assistant?</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://livsycode.com/best-practices/ai-agent-skills-for-ios-development/">AI Agent Skills For iOS Development</a></h3><p>Artem Mirzabekian gives a clean mental model for something a lot of teams are still treating as vague tooling folklore.</p><p>&#8226; The article separates repository rules, Claude project memory, and reusable skills into distinct jobs<br>&#8226; The practical value is in making agents less guessy: small instruction files for always-on rules, skills for repeatable workflows, and CI for anything that must be enforced</p><h4><a href="https://livsycode.com/best-practices/ai-agent-skills-for-ios-development/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.swift.org/blog/whats-new-in-swift-june-2026/">What&#8217;s New In Swift: June 2026 Edition</a></h3><p>Swift&#8217;s June digest feels more substantial than usual because WWDC26 gave it a lot to work with, from language changes to ecosystem moves and major open-source announcements.</p><p>&#8226; The biggest updates include Swift 6.4 previews, Swift in parts of Apple&#8217;s kernel, an open-sourced QUIC transport layer, and new Foundation Models utilities<br>&#8226; It also works well as a community snapshot, pulling in Swift Package Index joining Apple, the new Networking workgroup, notable package releases, and a few evolution proposals worth tracking</p><h4><a href="https://www.swift.org/blog/whats-new-in-swift-june-2026/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.avanderlee.com/swift/defer-usage-swift/">Defer In Swift Explained With Code Examples</a></h3><p>Antoine van der Lee revisits defer through a modern Swift lens, which makes the article more useful than a basic keyword refresher.</p><p>&#8226; It covers both the classic cleanup use case and the newer Swift 6.4 ability to await inside defer when the surrounding context is async<br>&#8226; One of the clearest points is why Task { ... } is not a real replacement here: unstructured cleanup can outlive the function, while async defer preserves the guarantee that cleanup finishes before scope exit</p><h4><a href="https://www.avanderlee.com/swift/defer-usage-swift/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://tanaschita.com/swift-concurrency-sendable/">Understanding Sendable In Swift</a></h3><p>Natascha Fadeeva explains Sendable from the angle that matters most in real code: what happens when values cross tasks, actors, and other concurrency boundaries.</p><p>&#8226; Sendable marks types that are safe to pass across concurrency boundaries, and Swift 6 treats violations much more strictly than Swift 5&#8217;s default mode<br>&#8226; The article is strongest where it gets practical about classes: immutable final classes can conform, mutable shared state usually belongs in an actor, and @unchecked Sendable should be treated as a manual safety promise, not a warning silencer</p><h4><a href="https://tanaschita.com/swift-concurrency-sendable/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://swiftui-garden.com/Reference/ConcentricRectangle-and-ContainerRelativeShape">ConcentricRectangle And ContainerRelativeShape</a></h3><p>Ralf Ebert&#8217;s note is short, but it clears up a visual detail that is easy to miss when trying the new shape APIs.</p><p>&#8226; ConcentricRectangle and ContainerRelativeShape both adapt to outer rounded container shapes, but they do not behave the same once positioning shifts<br>&#8226; The key distinction is practical: ConcentricRectangle is more tied to actual corner geometry, while ContainerRelativeShape stays more uniform as a general container-aware shape</p><h4><a href="https://swiftui-garden.com/Reference/ConcentricRectangle-and-ContainerRelativeShape">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="/__u/antongubarenko.substack.com/p/ios27-cadisplaylink-for-uiwindowscene">iOS27: CADisplayLink for UIWindowScene</a></h3><p>Article explains a small beta API change to make a bigger point about how display-driven work should be modeled in modern UIKit.</p><p>&#8226; The article clearly separates <code>Timer</code> from <code>CADisplayLink</code>: one is interval-based, the other is tied to frame boundaries and visual smoothness<br>&#8226; The new part in iOS 27 is scene ownership, where display-synchronized work can be attached to a specific <code>UIWindowScene</code> instead of feeling like a loose global loop</p><h4><a href="/__u/antongubarenko.substack.com/p/ios27-cadisplaylink-for-uiwindowscene">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://nilcoalescing.com/blog/CustomBindingsInSwiftUIClosuresVsSubscripts/">Custom Bindings In SwiftUI: Closures Vs Subscripts</a></h3><p>Natalia Panferova takes a very specific SwiftUI pattern and turns it into a useful performance lesson about how bindings are represented.</p><p>&#8226; Binding(get:set:) is flexible, but recreating closure-based bindings in body can trigger extra row updates when unrelated state changes <br>&#8226; A subscript-based binding gives SwiftUI a more stable projection to track, so child views only reevaluate when the relevant state actually changes</p><h4><a href="https://nilcoalescing.com/blog/CustomBindingsInSwiftUIClosuresVsSubscripts/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://claude.com/blog/cowork-web-mobile">Claude Cowork On Web And Mobile</a></h3><p>Anthropic is expanding Claude Cowork beyond desktop, which changes the product from a laptop-bound agent into something that can follow work across devices.</p><p>&#8226; Cowork is rolling out to web and mobile first for Max users, with more plans to follow over the next several weeks<br>&#8226; The bigger shift is background continuity: sessions, files, and approvals can now move between desktop, phone, and web while Claude keeps working even when no device is online</p><h4><a href="https://claude.com/blog/cowork-web-mobile">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://www.sagarunagar.com/blog/swiftui-crossfade-navigation-transition/">SwiftUI .crossFade Navigation Transition In iOS 27</a></h3><p>Sagar Unagar highlights a small SwiftUI addition that will probably get used a lot more than its size suggests.</p><p>&#8226; .crossFade gives SwiftUI a built-in fade transition with almost no setup<br>&#8226; It fits screens like settings, forms, editors, and login flows better than zoom-style transitions</p><h4><a href="https://www.sagarunagar.com/blog/swiftui-crossfade-navigation-transition/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=F7cvw2_m_b4">Modern iOS Performance Myths: Episode 1</a></h3><p>Artem Mirzabekian and Bogdan Poplauschi use the first Swift Academy episode to push performance discussions away from vague &#8220;fast or slow&#8221; claims and toward how apps actually feel in production.</p><p>&#8226; A technically fast app can still feel slow if feedback arrives late, state updates wake too much UI, or performance only looks good on modern devices<br>&#8226; The episode also cuts through common myths around SwiftUI, UIKit, averages, and concurrency, with one clear message: measure real user experience, not just pretty local metrics</p><h4><a href="https://www.youtube.com/watch?v=F7cvw2_m_b4">Watch here.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.youtube.com/watch?v=m5VdG-EKnmk">Reordering SwiftData In List And Grid</a></h3><p>Stewart Lynch walks through two different reordering paths for SwiftData-backed content, starting with the built-in List move flow and then building full drag-and-drop behavior for a grid.</p><p>&#8226; The list version is simple: use onMove, update sortOrder, and save back through modelContext<br>&#8226; The grid version is the more useful part: keep a local display array for drag state, reorder it with a custom drop delegate, then persist the final order only when the drop completes</p><h4><a href="https://www.youtube.com/watch?v=m5VdG-EKnmk">Watch here.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Books &#128218;</h1><h3><a href="https://anubhav52.gumroad.com/l/txbtwg?layout=discover&amp;recommended_by=search&amp;_gl=1*1e2sg2v*_ga*MTAxODg0NTgzOC4xNzgzNTE0MDA0*_ga_6LJN6D94N6*czE3ODM1MTQwMDQkbzEkZzEkdDE3ODM1MTQwMjckajM3JGwwJGgw">The iOS Core Engineering Series &#8212; Volume 1</a></h3><p>Anubhav Giri positions this as a fundamentals-first iOS engineering resource built around two topics that trip up a lot of developers once apps get real.</p><p>&#8226; Volume 1 focuses on memory and concurrency<br>&#8226; From the page snippet, it looks aimed at system-level foundations rather than framework tips</p><h4><a href="https://anubhav52.gumroad.com/l/txbtwg?layout=discover&amp;recommended_by=search&amp;_gl=1*1e2sg2v*_ga*MTAxODg0NTgzOC4xNzgzNTE0MDA0*_ga_6LJN6D94N6*czE3ODM1MTQwMDQkbzEkZzEkdDE3ODM1MTQwMjckajM3JGwwJGgw">Get here.</a>&#128205;</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 273]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-273</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-273</guid><pubDate>Wed, 01 Jul 2026 20:30:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>This week, Apple announced price increases across most of its hardware lineup, including MacBooks, iPads, HomePods, and Apple TV. The notable exception is the iPhone. According to the company, soaring memory and storage chip prices, driven largely by AI data center demand, have reached a point where Apple can no longer absorb the additional costs. Even Apple, with one of the strongest supply chains in the industry, isn&#8217;t immune to the global memory shortage.</p><p>This has another consequence for developers. Running open-source LLMs locally is becoming increasingly attractive as cloud services tighten token limits and subscription models. But local AI needs RAM, and lots of it. Machines with 64 GB, 96 GB, or 128 GB of unified memory are now significantly more expensive, with many high-memory Mac configurations selling at substantial premiums, even on the secondary market and major retailers. The cost of moving away from cloud AI is rising alongside the cost of staying with it.</p><p>We&#8217;re entering an interesting phase where AI isn&#8217;t limited by model quality anymore. Instead, it&#8217;s becoming constrained by infrastructure, memory availability, and cost. Choosing between cloud-hosted models and running them locally is no longer just a technical decision. It&#8217;s increasingly a financial one.</p><p>If hardware prices continue to rise, would you rather invest in a powerful local machine for open-source LLMs or continue relying on cloud AI subscriptions?</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.sagarunagar.com/blog/swiftui-reorderable-lazy-layouts-ios-27/">Reordering Beyond List - SwiftUI iOS 27</a></h3><p>Sagar Unagar highlights one of the most overdue SwiftUI upgrades in iOS 27: drag-to-reorder is no longer trapped inside List.</p><p>&#8226; reorderable() and reorderContainer(for:) bring native reordering to stacks, grids, and custom Layout types<br>&#8226; SwiftUI reports a ReorderDifference, while your app stays responsible for applying and persisting the move</p><h4><a href="https://www.sagarunagar.com/blog/swiftui-reorderable-lazy-layouts-ios-27/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://livsycode.com/swiftui/a-custom-pull-to-refresh-in-swiftui/">A Custom Pull-to-Refresh In SwiftUI</a></h3><p>Artem Mirzabekian treats pull-to-refresh as a state machine problem, which is what makes this custom approach feel more deliberate than most one-off gesture hacks.</p><p>&#8226; The component exposes the full refresh lifecycle, from pull progress to finishing animation<br>&#8226; It is built for cases where .refreshable is not enough, like branded indicators, custom thresholds, and tighter layout control</p><h4><a href="https://livsycode.com/swiftui/a-custom-pull-to-refresh-in-swiftui/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://tanaschita.com/ios-privacy-manifests/">Understanding Privacy Manifests In iOS</a></h3><p>Natascha Fadeeva lays out privacy manifests as a practical Xcode task, not just another compliance checkbox.</p><p>&#8226; A PrivacyInfo.xcprivacy file declares collected data, tracking use, and required reason API access for your app or SDK. <br>&#8226; The article is especially useful around third-party SDKs and required reason APIs like UserDefaults, file timestamps, disk space, boot time, and active keyboard access.</p><h4><a href="https://tanaschita.com/ios-privacy-manifests/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://azamsharp.com/2026/06/24/where-should-loading-state-live-in-swiftui.html">Where Should Loading State Live In SwiftUI?</a></h3><p>Mohammad Azam uses a simple products example to make a larger architectural point about where state duplication starts to creep in.</p><p>&#8226; He argues for keeping loading state in the view while the store stays the single source of truth for data<br>&#8226; The article is really about tradeoffs: some solutions can work, but they can also duplicate state and make updates like add or refresh feel more awkward</p><h4><a href="https://azamsharp.com/2026/06/24/where-should-loading-state-live-in-swiftui.html">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="https://aleahim.com/blog/swiftui-is-one-graph/">SwiftUI Is One Graph, Over 40+ Years of Engineering</a></h3><p>Mihaela Mihaljevi&#263; Jaki&#263;&#8217;s post is less a SwiftUI tutorial and more an attempt to strip the framework down to its engine room.</p><p>&#8226; The central claim is that SwiftUI behaves like a single demand-driven graph, not a view tree that gets broadly diffed and rebuilt. <br>&#8226; It gets more interesting when the article connects that graph to the older stack beneath it &#8212; Core Animation, Core Graphics, Core Text, and Core Image &#8212; and argues that SwiftUI only really makes sense once you see the deeper machinery it sits on top of.</p><h4><a href="https://aleahim.com/blog/swiftui-is-one-graph/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://www.pointfree.co/blog/posts/217-proposing-task-local-test-traits-for-swift-testing">Proposing Task-Local Test Traits For Swift Testing</a></h3><p>Point-Free&#8217;s proposal is small on the surface, but it targets a very real annoyance in test setup for task-local values.</p><p>&#8226; It would add a built-in .taskLocal trait, so tests could bind task locals without writing a custom trait for each one. <br>&#8226; The bigger benefit is less boilerplate and less need for separate test-support modules just to make task locals usable in Swift Testing.</p><h4><a href="https://www.pointfree.co/blog/posts/217-proposing-task-local-test-traits-for-swift-testing">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://openai.com/index/previewing-gpt-5-6-sol/">Previewing GPT-5.6 Sol: A Next-Generation Model</a></h3><p>OpenAI is introducing a new three-tier GPT-5.6 family, with Sol as the flagship model, Terra as the balanced middle tier, and Luna as the faster lower-cost option.</p><p>&#8226; Sol adds new max reasoning and an ultra mode that uses subagents for more complex work. <br>&#8226; The preview is limited at first, with OpenAI emphasizing stronger safeguards, better coding performance, and broader availability in the coming weeks.</p><h4><a href="https://openai.com/index/previewing-gpt-5-6-sol/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://www.anthropic.com/news/claude-sonnet-5">Introducing Claude Sonnet 5</a></h3><p>Anthropic is positioning Claude Sonnet 5 as its most agentic Sonnet yet, aiming to bring Opus-like follow-through and tool use to a cheaper tier.</p><p>&#8226; It narrows the gap with Opus 4.8 on reasoning, coding, tool use, and knowledge work, while launching as the default model for Free and Pro plans. <br>&#8226; Pricing starts at $2 input / $10 output per million tokens through August 31, 2026, then moves to $3 / $15, with Anthropic also saying Sonnet 5 is safer than 4.6 overall and weaker than Opus models on dangerous cyber tasks.</p><h4><a href="https://www.anthropic.com/news/claude-sonnet-5">Read more.</a>&#128205;Level: Beginner</h4><h3><a href="https://www.anthropic.com/news/claude-science-ai-workbench">Claude Science, An AI Workbench For Scientists, Is Now Available</a></h3><p>Anthropic is pushing deeper into scientific workflows with a product that feels less like a chatbot and more like a research environment.</p><p>&#8226; Claude Science brings literature analysis, code, figures, manuscripts, and compute management into one workflow for scientists. <br>&#8226; It launches in beta on macOS and Linux for Pro, Max, Team, and Enterprise users, with a strong focus on biology and biomedical research.</p><h4><a href="https://www.anthropic.com/news/claude-science-ai-workbench">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://www.polpiella.dev/cursor-xcode-27/">Using Cursor In Xcode 27</a></h3><p>Pol Piella shows that Xcode 27&#8217;s agent support is open enough to bring Cursor into the workflow, not just Apple&#8217;s built-in or officially listed assistants.</p><p>&#8226; The setup is surprisingly direct: install Cursor&#8217;s CLI, point Xcode at the agent executable, and run it with the acpargument. <br>&#8226; The bigger story is Xcode 27 itself: ACP support means custom agents can now sit inside Xcode&#8217;s intelligence flow alongside first-party options.</p><h4><a href="https://www.polpiella.dev/cursor-xcode-27/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=tNxEqyUVGck">What&#8217;s New In SwiftUI For iOS 27?</a></h3><p>Paul Hudson&#8217;s walkthrough makes it clear this is another unusually strong SwiftUI year, with improvements that range from under-the-hood compiler wins to features developers will feel immediately in app architecture and UI polish.</p><p>&#8226; The biggest changes are surprisingly quiet ones: @State is now a macro, View became a content builder, and both shifts aim to cut wasted work and reduce those infamous type-checking errors<br>&#8226; The visible additions are broad and practical &#8212; reordering outside List, swipe actions in custom layouts, prominent tabs, AsyncImage caching, crossfade navigation, smarter toolbars, and new APIs that hint at a more resizable future for iPhone apps</p><h4><a href="https://www.youtube.com/watch?v=tNxEqyUVGck">Watch here.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Books &#128218;</h1><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8lEj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 424w, /__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 848w, /__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8lEj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png" width="1100" height="220" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:220,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190488,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/203559038?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 424w, /__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 848w, /__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8lEj!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F855d5ea4-6658-416a-832c-81fe1caaa253_1100x220.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Mohammad Azam&#8217;s <em>SwiftData Architecture</em> is focused on the part most SwiftData content skips: how to build production apps, not toy samples.</p><p>It covers architecture, debugging, migrations, CloudKit, and performance.</p><p>Get <strong>20% off</strong> with code: <strong>THS2026</strong></p><h4><a href="https://azamsharp.school/swiftdata-architecture.html">Buy here.</a>&#128205;</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 272]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-272</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-272</guid><pubDate>Wed, 24 Jun 2026 20:16:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>This week brought two interesting pieces of news that, at first glance, seem unrelated. One is about trust and identity in the AI era. The other is about trust and community in the Swift ecosystem.</p><p>Anthropic has started <a href="https://support.claude.com/en/articles/14328960-identity-verification-on-claude">rolling out identity verification</a> for certain Claude users. Depending on the situation, users may be asked to provide a government-issued ID and a selfie through a third-party verification provider called Persona. Anthropic states that the data is used for safety, abuse prevention, and regulatory compliance, and that verification images are stored by Persona rather than directly by Anthropic. The company also says this information is not used for model training.</p><p>The timing is interesting. Over the last year we&#8217;ve seen multiple <a href="https://www.them.us/story/discord-has-stopped-using-peter-thiel-backed-software-tied-to-us-surveillance">discussions</a> around privacy, data leaks, account verification, and surveillance concerns across various platforms. As AI tools become more powerful and gain access to more capabilities, providers are naturally moving toward stronger identity controls. Whether users will accept that trade-off is another question entirely. Some developers are already looking at alternative models and providers that require fewer verification steps and collect less personal information.</p><p>On the Swift side, there was much more cheerful news. Swift Package Index is <a href="https://swiftpackageindex.com/blog/swift-package-index-joins-apple">joining Apple</a>. For years, SPI has been one of the most valuable community resources for discovering packages, evaluating maintenance quality, and helping developers make better dependency decisions. What started as a community project by Dave Verwer and Sven Schmidt has become such an important part of the ecosystem that Apple decided to bring it under its umbrella.</p><p>This is a great example of how community efforts can grow into essential infrastructure. Documentation, open-source libraries, newsletters, podcasts, and package indexes are all created by people who care enough to invest their time before anyone else sees the value. Apple recognizing that contribution is a positive signal for the entire Swift community.</p><p>As AI services move toward stricter identity checks and ecosystem platforms become more centralized, where do you draw the line between convenience and privacy? Would you consider switching to another LLM if it required fewer verification steps?</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://livsycode.com/uikit/exploring-_uiportalview-live-view-replication-without-copying-or-snapshots/">UIPortalView: From Live Mirroring to Liquid Glass-Style Effects</a></h3><p>Artem Mirzabekian uses _UIPortalView as a way to peek behind some of iOS&#8217;s most interesting visual tricks, especially where live mirroring starts to feel more like composition than ordinary view rendering.</p><p>&#8226; The article shows why portals are different from snapshots: the source stays alive, updates in real time, and can be projected into overlays, lenses, reflections, or warped slices<br>&#8226; Just as important, it keeps the line clear between research and production: _UIPortalView is a fascinating private API to study, but not something to ship in an App Store build</p><h4><a href="https://livsycode.com/uikit/exploring-_uiportalview-live-view-replication-without-copying-or-snapshots/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.avanderlee.com/concurrency/swift-6-4-whats-new-in-concurrency/">Swift 6.4: What&#8217;s New In Concurrency</a></h3><p>Antoine van der Lee&#8217;s overview is useful because it focuses on the small Swift 6.4 concurrency changes that are easy to miss, but likely to show up quickly in real code.</p><p>&#8226; The biggest additions include async defer, cancellation shields, async Result, typed throwing Task initializers, and warnings for ignored throwing tasks <br>&#8226; He also flags two changes that matter beyond pure concurrency syntax: weak let for cleaner Sendable code, and ~Sendablefor making intentionally non-sendable public types explicit</p><h4><a href="https://www.avanderlee.com/concurrency/swift-6-4-whats-new-in-concurrency/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.swiftdifferently.com/blog/swift/concurrency/how-actors-work">Actors In Swift: The Problem They Solve And How It Works</a></h3><p>Omar Elsayed breaks actors down from first principles, which makes this feel more like a mental model repair than just another concurrency explainer. </p><p>&#8226; It clarifies what actors actually protect, how cross-actor access works, and why await is required even for synchronous actor methods across isolation boundaries <br>&#8226; The most valuable section is reentrancy: actor calls are safe from data races, but state can still change across suspension points, and that is where the confusing bugs begin</p><h4><a href="https://www.swiftdifferently.com/blog/swift/concurrency/how-actors-work">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://www.sagarunagar.com/blog/swiftui-item-based-alert-confirmation-dialog/">SwiftUI&#8217;s New Item Based Presentations In iOS 27</a></h3><p>Sagar Unagar highlights one of those SwiftUI changes that looks small, but quietly fixes a long-standing state smell.</p><p>&#8226; Alerts and confirmation dialogs can now be driven directly from optional item state<br>&#8226; That means no extra Boolean flags, fewer impossible states, and cleaner presentation logic</p><h4><a href="https://www.sagarunagar.com/blog/swiftui-item-based-alert-confirmation-dialog/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=umq9wxmm">Updated Apple Developer Program License Agreement Now Available</a></h3><p>Apple has revised Attachment 12 of the Apple Developer Program License Agreement to spell out terms for iOS apps in Brazil.</p><p>&#8226; The update covers alternative distribution, alternative payments, out-of-app offers, and the Core Technology Commission. <br>&#8226; Developers need to sign in and accept the new terms, while translated versions will appear on the Apple Developer website within a month.</p><h4><a href="https://developer.apple.com/news/?id=umq9wxmm">Read more.</a>&#128205;</h4><h3><a href="https://developer.apple.com/news/?id=dhwadr2x">Changes To iOS In Brazil</a></h3><p>Apple is opening up iOS in Brazil under a new agreement with CADE, and the change is much bigger than a policy footnote.</p><p>&#8226; Starting with iOS 26.5, developers in Brazil can use alternative app marketplaces and external payment options for digital goods and services. <br>&#8226; Apple is pairing that with new safeguards like iOS notarization, marketplace authorization, and child-safety requirements, and developers must accept updated program terms by July 6, 2026</p><h4><a href="https://developer.apple.com/news/?id=dhwadr2x">Read more.</a>&#128205;</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="/__u/antongubarenko.substack.com/p/wwdc26-swiftui-group-lab-2nd-q-and">WWDC26: SwiftUI Group Lab 2nd - Q&amp;A</a></h3><p>Article turns another dense SwiftUI lab into something you can actually come back to after WWDC.</p><p>&#8226; It covers practical SwiftUI topics like navigation, layout, geometry, identity, overlays, and UIKit interop. <br>&#8226; The big win is readability: grouped answers and time codes make the session much easier to revisit.</p><h4><a href="/__u/antongubarenko.substack.com/p/wwdc26-swiftui-group-lab-2nd-q-and">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://iosapptemplates.com/blog/liquid-glass-swiftui-app-template-modernization/">Liquid Glass In SwiftUI: How To Modernize An iOS App Template</a></h3><p>Beniamin Marcu frames Liquid Glass as a structural redesign problem, not a quick visual polish pass.</p><p>&#8226; Start with navigation, surfaces, and shared components before touching colors <br>&#8226; The article also pushes a careful rollout: design tokens, system components where they help, layered icons, and small reversible updates</p><h4><a href="https://iosapptemplates.com/blog/liquid-glass-swiftui-app-template-modernization/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="https://swiftpackageindex.com/blog/swift-package-index-joins-apple">Swift Package Index Joins Apple</a></h3><p>Ted Kremenek, Dave Verwer, and Sven A. Schmidt announce that Swift Package Index is now part of Apple, with the goal of building a more robust package registry for the Swift ecosystem.</p><p>&#8226; Swift Package Index will keep operating as it does today, with no immediate changes for package consumers or authors. <br>&#8226; Apple&#8217;s backing is meant to push things further in areas like scale, package signing, identity, and long-term ecosystem reliability.</p><h4><a href="https://swiftpackageindex.com/blog/swift-package-index-joins-apple">Read more.</a>&#128205;Level: Beginner</h4><h3><a href="https://dkvekariya.medium.com/swift-conditionals-if-switch-guard-pattern-matching-131e509d4d82">Swift Conditionals: if, switch, guard and Pattern Matching</a></h3><p>Divyesh Vekariya&#8217;s article is aimed at fundamentals, but it does a good job showing where Swift&#8217;s conditionals stop being familiar syntax and start becoming expressive language tools.</p><p>&#8226; It walks from optional binding into Swift&#8217;s much more powerful switch, including ranges, tuples, value binding, and whereclauses. <br>&#8226; The other big theme is guard: not just as syntax, but as a way to flatten functions and make preconditions obvious.</p><h4><a href="https://dkvekariya.medium.com/swift-conditionals-if-switch-guard-pattern-matching-131e509d4d82">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://www.linkedin.com/pulse/how-use-ollama-models-xcode-27-amos-gyamfi-m91nf/">How To Use Ollama Models In Xcode 27</a></h3><p>Amos Gyamfi shows how Xcode 27&#8217;s new Chat Provider path opens the door to both local and cloud-hosted Ollama models inside the coding assistant workflow.</p><p>&#8226; The setup is straightforward for local models: install Ollama, run a model, then point Xcode&#8217;s locally hosted provider<br>&#8226; The article also covers the hosted route, where Ollama Cloud models are added through Xcode&#8217;s internet-hosted provider using an API key and standard auth headers</p><h4><a href="https://www.linkedin.com/pulse/how-use-ollama-models-xcode-27-amos-gyamfi-m91nf/">Read more.</a>&#128205;Level: XXX</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=7W6R2TIoEW8">Swift Macros Demystified: Build A Freestanding Expression Macro</a></h3><p>Stewart Lynch takes one of Swift&#8217;s more intimidating features and makes it feel much more approachable by building a freestanding expression macro step by step.</p><p>&#8226; The video is focused on understanding, not just copying code<br>&#8226; It is a practical walk through of how macros expand and how to build one yourself</p><h4><a href="https://www.youtube.com/watch?v=7W6R2TIoEW8">Watch here.</a>&#128205;Level: Intermediate</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 271]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-271</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-271</guid><pubDate>Wed, 17 Jun 2026 20:01:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>WWDC is calmly leaving us with a lot of new frameworks, reviews, and guides to explore. This year, however, felt different from previous conferences. There were no traditional one-on-one Labs, but plenty of group Labs. No dedicated app consultation appointments where you could discuss your product and ask for best practices tailored to your use case. The format is evolving, just like the industry itself.</p><p>Software development has changed dramatically over the last few years. Old habits, learning plans, and even tutorials become outdated faster than ever. Even the biggest companies are adapting to new realities. And it&#8217;s not only developers who face these changes. The tools we rely on have their own growing pains.</p><p>It was hard to find a developer community this week where Fable 5&#8217;s blocking policies weren&#8217;t discussed. From memes to deep technical analyses, everyone seemed to have an opinion on who might be affected and why. Combined with stricter token limits and changing subscription models across AI platforms, it raises an interesting question: will these restrictions accelerate the adoption of local open-source models?</p><p>Models like Qwen, Gemma, and others continue to improve, offering developers more control over privacy, costs, and availability. Running AI locally still requires hardware and setup, but the trade-off may become increasingly attractive as cloud services adjust pricing and usage policies.</p><p>One thing WWDC reminded us is that adaptation is part of our profession. Frameworks change, conferences change, AI tools change, and so do our workflows. The important part is staying curious and finding the right balance between shiny new technologies and practical everyday development.</p><p>Have you already tried a local LLM, and could you imagine it becoming part of your daily toolkit?</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.massicotte.org/blog/wwdc26-unanswered-qa/">(Some) Unanswered Swift Group Questions</a></h3><p>Matt Massicotte picks up the Swift Group Lab questions that never made it onto the stage and gives them the kind of direct, experience-heavy answers many teams probably needed more than the live format allowed.</p><p>&#8226; Swift 6 defaults are powerful, but easy to misuse<br>&#8226; Matt&#8217;s answers are valuable because they show when defaults help and when nonisolated becomes necessary</p><h4><a href="https://www.massicotte.org/blog/wwdc26-unanswered-qa/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="/__u/antongubarenko.substack.com/p/wwdc26-swift-group-lab-q-and-a">WWDC26: Swift Group Lab &#8211; Q&amp;A</a></h3><p>Post turns a long live lab into something much easier to keep and reuse after WWDC.</p><p>&#8226; The Q&amp;A covers real Swift pain points<br>&#8226; Grouped answers and time codes make it much easier to scan</p><h4><a href="/__u/antongubarenko.substack.com/p/wwdc26-swift-group-lab-q-and-a">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://livsycode.com/swift/async-cleanup-in-defer-with-swift-6-4/">Async Cleanup In defer With Swift 6.4</a></h3><p>Artem Mirzabekian highlights one of those language changes that looks small on paper but removes a very real annoyance from modern async code.</p><p>&#8226; defer can now contain await in Swift 6.4<br>&#8226; That makes async cleanup much cleaner around teardown, actor calls, and resource handling</p><h4><a href="https://livsycode.com/swift/async-cleanup-in-defer-with-swift-6-4/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.wesleymatlock.com/testing-on-device-ai-swift-testing/">Testing Foundation Models: Code That Won&#8217;t Give The Same Answer Twice</a></h3><p>Wesley Matlock tackles the testing problem almost everyone runs into with on-device AI: the feature works, the code is covered, but the model itself sits outside the test strategy because its output refuses to stay still.</p><p>&#8226; The framework uses contract checks, mocks, and rubric-based evals<br>&#8226; Test shape and behavior first, then score model quality over time</p><h4><a href="https://www.wesleymatlock.com/testing-on-device-ai-swift-testing/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=dz9wvq0r">Deprecation Of The ImageCreator Class</a></h3><p>Apple is drawing a hard line around ImageCreator: the API is being discontinued and will stop working on iOS 27, iPadOS 27, macOS 27, and visionOS 27.</p><p>&#8226; Beta builds still compile, but warn in Xcode and fail in TestFlight<br>&#8226; Before release, apps need to move to Image Playground or another image service</p><h4><a href="https://developer.apple.com/news/?id=dz9wvq0r">Read more.</a>&#128205;</h4><h3><a href="https://developer.apple.com/news/?id=sus6t6ab">New Domain For Sign In With Apple And iCloud+ Hide My Email</a></h3><p>Apple is unifying relay email addresses under private.icloud.com later this summer, which means Sign in with Apple and Hide My Email will start generating new aliases on the same shared domain.</p><p>&#8226; Existing relay emails will keep working<br>&#8226; Developers should update allowlists and email validation rules for private.icloud.com</p><h4><a href="https://developer.apple.com/news/?id=sus6t6ab">Read more.</a>&#128205;</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://www.sagarunagar.com/blog/swiftui-prominent-tab-is-not-a-floating-action-button/">SwiftUI&#8217;s New .prominent Tab In iOS 27 Is Not A Floating Action Button</a></h3><p>Sagar Unagar makes a sharp design point that a lot of teams will probably need to hear during the iOS 27 cycle.</p><p>&#8226; .prominent highlights a destination, not an action<br>&#8226; If it opens a flow or sheet, it probably is not the right fit</p><h4><a href="https://www.sagarunagar.com/blog/swiftui-prominent-tab-is-not-a-floating-action-button/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="https://nilcoalescing.com/blog/CustomScrollLayoutsWithSwipeActionsInSwiftUIOnIOS27/">Custom Scroll Layouts With Swipe Actions In SwiftUI On iOS 27</a></h3><p>Natalia Panferova highlights one of those small WWDC additions that immediately removes a long-standing SwiftUI annoyance.</p><p>&#8226; swipeActions now works beyond List, including ScrollView layouts and custom Layout types<br>&#8226; onPresentationChanged helps track which row is currently open</p><h4><a href="https://nilcoalescing.com/blog/CustomScrollLayoutsWithSwipeActionsInSwiftUIOnIOS27/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://azamsharp.com/2026/06/12/whats-new-in-swiftdata.html">What&#8217;s New In SwiftData For iOS 27</a></h3><p>Mohammad Azam roundup is a good reminder that SwiftData did not get one giant headline feature this year &#8212; it got a set of fixes that make everyday modeling and querying feel much less awkward.</p><p>&#8226; iOS 27 fills in several long-missing SwiftData gaps<br>&#8226; The update reduces enum workarounds, custom filtering, and schema friction</p><h4><a href="https://azamsharp.com/2026/06/12/whats-new-in-swiftdata.html">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="/__u/divyaravidev.substack.com/p/wwdc26-group-labs-the-real-story">WWDC26 Group Labs: The Real Story Isn&#8217;t Foundation Models. It&#8217;s Evaluation.</a></h3><p>Divya Ravi&#8217;s piece pulls one idea out of multiple WWDC26 labs and makes it feel much bigger than any single framework announcement.</p><p>&#8226; OS-bundled models make evaluation a product requirement, not a nice-to-have<br>&#8226; Apple&#8217;s labs also exposed practical limits around context windows, routing, schemas, and prompt-injection risk</p><h4><a href="/__u/divyaravidev.substack.com/p/wwdc26-group-labs-the-real-story">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://www.anthropic.com/news/fable-mythos-access">Statement On The US Government Directive To Suspend Access To Fable 5 And Mythos 5</a></h3><p>Anthropic says it was ordered by the US government on June 12, 2026 to suspend Fable 5 and Mythos 5 for all users, including foreign nationals inside Anthropic, while leaving other Anthropic models unaffected.</p><p>&#8226; Anthropic says the directive was based on a narrow jailbreak, not broad dangerous capability<br>&#8226; The company is complying, but warns this standard could chill frontier model releases</p><h4><a href="https://www.anthropic.com/news/fable-mythos-access">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://artemnovichkov.com/blog/using-claude-with-apple-foundation-models">Using Claude With Apple Foundation Models</a></h3><p>Artem Novichkov shows how quickly Anthropic&#8217;s package turns Claude into a drop-in remote model for Apple&#8217;s Foundation Models API, so the same LanguageModelSession, @Generable, and tool-calling patterns can work with either on-device or server-side models.</p><p>&#8226; It covers real product tradeoffs like auth, model switching, and context limits<br>&#8226; It also shows where this is heading: one API, swappable models, and richer tool use</p><h4><a href="https://artemnovichkov.com/blog/using-claude-with-apple-foundation-models">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=hqDurFnEJs8">Build a Swift Terminal Developer Toolkit with TUIkit</a></h3><p>Stewart Lynch uses Tuikit to build a real multi-panel terminal app in Swift, not just a toy demo.</p><p>&#8226; The app combines navigation, persisted state, Git status, and a release tracker inside one terminal UI<br>&#8226; It also shows the full path to something usable: third-party packages, build steps, and installing the tool so it can run anywhere</p><h4><a href="https://www.youtube.com/watch?v=hqDurFnEJs8">Watch here.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Books &#128218;</h1><h3>Packt Publishing Sale</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!32FU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 424w, /__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 848w, /__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 1272w, /__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!32FU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png" width="1456" height="291" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:291,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:509254,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/201548262?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 424w, /__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 848w, /__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 1272w, /__u/substackcdn.com/image/fetch/$s_!32FU!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d7c683-ac4b-4ec7-b23c-ad5e30c0d6e8_3300x660.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Packt Publishing is running a huge sale across many of its books, including &#8220;<em>AI Driven Swift Architecture&#8221;</em> by Walid SASSI and Dave Poirier.</p><p>If modern AI development sometimes feels like sailing through unpredictable seas, this book can serve as a lighthouse. It combines practical guides with real-world examples to help you understand AI tools, improve your workflow, and build better Swift applications.</p><h4><a href="https://www.packtpub.com/en-us/product/ai-driven-swift-architecture-9781835886557">Buy here.</a>&#128205;</h4><h3><a href="https://cdn.prod.website-files.com/6889473510b50328dbb70ae6/69fe2a55b93bb0732b1fe33c_The-Founders-Playbook-05062026_v3%20(1).pdf">The Founder&#8217;s Playbook: Building An AI-Native Startup</a></h3><p>Anthropic&#8217;s playbook reframes the startup journey around what small teams can do when AI is baked into the company from day one, not bolted on later.</p><p>&#8226; It breaks the journey into Idea, MVP, Launch, and Scale<br>&#8226; The big shift is from building everything yourself to orchestrating AI-assisted work</p><h4><a href="https://cdn.prod.website-files.com/6889473510b50328dbb70ae6/69fe2a55b93bb0732b1fe33c_The-Founders-Playbook-05062026_v3%20(1).pdf">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 270]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-270</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-270</guid><pubDate>Wed, 10 Jun 2026 20:40:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>It&#8217;s easy to write a note this week because&#8230; you know why. It&#8217;s WWDC week!</p><p>Whether you&#8217;re attending in person or, like most of us, following online, this is one of the most exciting periods of the year for Apple developers. There&#8217;s also a touch of history to it. Many expect this to be Tim Cook&#8217;s last WWDC as Apple&#8217;s CEO, making the event even more memorable. Whatever the future holds, the technologies presented this week will shape our work for years to come.</p><p>To make the most of the conference, here are a few tips:</p><p>&#8226; Start with the Keynote and the Platforms State of the Union. The Keynote gives you the big picture, while the State of the Union dives into the technical details and often reveals features developers care about the most.</p><p>&#8226; Bookmark the sessions you&#8217;re most interested in and watch them at your own pace. A few years ago, Apple started releasing almost all videos on Day 1, so you no longer have to worry about booking a lab before seeing the related session.</p><p>&#8226; Don&#8217;t skip the Labs! They&#8217;re one of the best opportunities to ask Apple engineers direct questions in a more informal setting. Sometimes a five-minute conversation can save hours of debugging.</p><p>&#8226; Rewatching is absolutely encouraged. If a concept doesn&#8217;t click during the first viewing, don&#8217;t worry. WWDC content ages well, and you can always return to it weeks or even months later when you need it.</p><p>A comfortable pace is probably the best WWDC strategy. There&#8217;s no prize for watching every session in a single week, and a healthy sleep schedule will help more than another late-night video marathon.</p><p>The reward is worth it. Every year we discover new techniques and fresh approaches to code we use every day. This year is no exception. Even familiar concepts like task cancellation received thoughtful improvements, including new cleanup capabilities for concurrent tasks.</p><p>Enjoy the conference, take notes, ask questions, and remember: WWDC is not a sprint but a library you can keep returning to throughout the year.</p><p>What is the one announcement that would make your WWDC unforgettable?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!L62e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 424w, /__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 848w, /__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 1272w, /__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!L62e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png" width="654" height="1451.5865384615386" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2770,&quot;width&quot;:1248,&quot;resizeWidth&quot;:654,&quot;bytes&quot;:445647,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/200576437?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 424w, /__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 848w, /__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 1272w, /__u/substackcdn.com/image/fetch/$s_!L62e!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0423062c-40f8-4e5f-87cd-836a4f08ce22_1248x2770.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.swiftjectivec.com/ios-27-notable-uikit-additions/">iOS 27: Notable UIKit Additions</a></h3><p>Jordan Morgan rounds up this year&#8217;s UIKit changes with a clear pattern: most of the work is not flashy, but aimed at adaptable navigation, scene management, and tab or sidebar behavior in a more multi-window, resizable world.</p><h4><a href="https://www.swiftjectivec.com/ios-27-notable-uikit-additions/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://swiftwithmajid.com/2026/06/08/what-is-new-in-swiftui-after-wwdc26/">What Is New In SwiftUI After WWDC26</a></h3><p>Majid Jabrayilov&#8217;s WWDC26 SwiftUI roundup feels refreshingly grounded: not a reinvention of the framework, but a steady removal of real production pain points around containers, navigation, toolbar control, and document workflows.</p><h4><a href="https://swiftwithmajid.com/2026/06/08/what-is-new-in-swiftui-after-wwdc26/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://livsycode.com/swiftui/swiftuis-state-is-now-a-macro/">SwiftUI&#8217;s State Is Now A Macro</a></h3><p>Artem Mirzabekian explains that Apple has changed <code>@State</code> under the hood from a property-wrapper presentation to a macro-based one, without changing the way SwiftUI code is written day to day.</p><h4><a href="https://livsycode.com/swiftui/swiftuis-state-is-now-a-macro/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.swift.org/blog/whats-new-in-swift-may-2026/">What&#8217;s New In Swift: May 2026 Edition</a></h3><p>Dave Lester&#8217;s monthly Swift digest works best as a quick radar sweep rather than one big headline, pulling together meetup talks, WebAssembly progress, mentorship news, notable package releases, and a few Swift Evolution updates worth tracking.</p><h4><a href="https://www.swift.org/blog/whats-new-in-swift-may-2026/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.swift.org/blog/announcing-networking-workgroup/">Announcing The Networking Workgroup</a></h3><p>Swift&#8217;s Ecosystem Steering Group has created a new Networking workgroup to push the platform toward a more unified and interoperable networking stack, from low-level I/O and shared protocol implementations up to modern client and server APIs.</p><h4><a href="https://www.swift.org/blog/announcing-networking-workgroup/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://www.nsvasilev.com/posts/swiftui-observable-macro/">SwiftUI: Observable Macro Under The Hood</a></h3><p>Nikita Vasilev unpacks <code>@Observable</code> by showing that it is not just nicer syntax, but a compile-time transformation that rewrites stored properties, injects an <code>ObservationRegistrar</code>, and tracks reads and writes at the key-path level.</p><h4><a href="https://www.nsvasilev.com/posts/swiftui-observable-macro/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=0d2gpmml">Introducing Time Allowances</a></h3><p>Apple is adding <strong>Time Allowances</strong> in iOS 27, iPadOS 27, and macOS 27 so parents can manage kids&#8217; app time more flexibly across categories like Entertainment, Games, and Social Media. For developers, the part to watch is classification: social features will soon need to be declared in the age rating questionnaire, can trigger a <strong>13+ minimum age rating</strong>, and become a required disclosure for new submissions and updates starting in <strong>September 2026</strong>.</p><h4><a href="https://developer.apple.com/news/?id=0d2gpmml">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://developer.apple.com/news/?id=a233fmpw">Updated Apple Developer Program License Agreement And App Review Guidelines Now Available</a></h3><p>Apple has revised both the Apple Developer Program License Agreement and the App Review Guidelines to cover new frameworks, updated AI terms, kid and teen safety guidance, and a handful of policy clarifications across areas like Live Activities, accessibility-related content changes, and developer identity requirements. This one is worth skimming even if you usually ignore agreement updates, because the changes touch practical areas such as Foundation Models, Trust Insights, Suggested Actions, Customer Engagement APIs, App Store Connect disclosures for minors, and stricter wording around spam or phishing through Live Activities</p><h4><a href="https://developer.apple.com/news/?id=a233fmpw">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://developer.apple.com/news/?id=sg176nne">Update For Apps Distributed In Texas</a></h3><p>Apple says new Apple Accounts in Texas will start falling under SB 2420 on <strong>June 4, 2026</strong>, which means age assurance, parent or guardian consent for minors under 18, and support for consent revocation now matter for downloads, in-app purchases, and significant app changes. For developers, this is less a policy footnote than an integration checklist: review the Declared Age Range API, PermissionKit&#8217;s Significant Change API, the new StoreKit age rating property, and the related App Store server notification flow.</p><h4><a href="https://developer.apple.com/news/?id=sg176nne">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://developer.apple.com/news/?id=f0jfy9py">Apple Developer Centers Are Expanding To Berlin</a></h3><p>Apple is opening its fifth Developer Center in Berlin later in 2026, giving developers across Europe closer access to in-person sessions, workshops, labs, and one-on-one appointments with Apple experts. The post reads less like a product announcement and more like an ecosystem investment, especially with multilingual support and hands-on consultation spaces built into the new center.</p><h4><a href="https://developer.apple.com/news/?id=f0jfy9py">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://nilcoalescing.com/blog/AnimationTimingInSwiftUI/">SwiftUI Animation Timing</a></h3><p>Natalia Panferova breaks SwiftUI animation timing into three layers &#8212; easing curves, spring animations, and fully custom timing &#8212; and explains them in a way that makes the presets feel much less like magic.</p><h4><a href="https://nilcoalescing.com/blog/AnimationTimingInSwiftUI/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="/__u/indieappdevs.substack.com/p/indie-app-devs-25">What We Learned Hitting #1 on Product Hunt</a></h3><p>Philip S&#248;rensen, Co-founder &amp; CEO of Brew, shares how they hit #1 on Product Hunt and what lessons they picked up along the way. Also what surprised him and the one thing he wishes someone had told him before launching.</p><h4><a href="/__u/indieappdevs.substack.com/p/indie-app-devs-25">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://nilcoalescing.com/blog/StylingMeasurementUnitFontsInSwiftUI/">Styling Measurement Unit Fonts In SwiftUI</a></h3><p>Natalia Panferova shows a neat way to style the value and unit of a formatted <code>Measurement</code> differently in SwiftUI by using <code>AttributedString</code> instead of treating the whole output as one uniform <code>Text</code>.</p><h4><a href="https://nilcoalescing.com/blog/StylingMeasurementUnitFontsInSwiftUI/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://www.anthropic.com/news/claude-fable-5-mythos-5">Claude Fable 5 and Claude Mythos 5</a></h3><p>Anthropic is drawing a sharper line between broad access and frontier capability here, releasing Claude Fable 5 for general use while keeping the less-restricted Mythos 5 behind trusted-access programs for cyberdefense and life sciences.</p><h4><a href="https://www.anthropic.com/news/claude-fable-5-mythos-5">Read more.</a>&#128205;Level: Beginner</h4><h3><a href="https://medium.com/@wesleymatlock/master-of-puppets-foundation-models-tool-calling-in-swift-cc626b2c1a87">Master Of Puppets: Foundation Models Tool Calling In Swift</a></h3><p>Wesley Matlock shows how Apple&#8217;s on-device model can stop guessing and start asking your app for facts mid-generation by calling Swift tools inside a single <code>respond</code> flow. The article becomes much more than a framework tour once it reaches the real constraints: SwiftData isolation, <code>Sendable</code> boundaries, actor-owned stores, and the surprisingly important detail that tool results should come back as readable ground truth, not just raw structured blobs.</p><h4><a href="https://medium.com/@wesleymatlock/master-of-puppets-foundation-models-tool-calling-in-swift-cc626b2c1a87">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://www.sagarunagar.com/blog/swiftui-app-language-switching-without-restart/">SwiftUI Localization Guide &#8212; Change Language Without Restarting The App</a></h3><p>Sagar Unagar shows how to make in-app language switching feel truly native in SwiftUI, with instant updates, persisted selection, and proper RTL support instead of sending users to Settings and forcing a relaunch.</p><h4><a href="https://www.sagarunagar.com/blog/swiftui-app-language-switching-without-restart/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://developer.apple.com/videos/play/wwdc2026/101">WWDC26: Keynote</a></h3><p>Apple&#8217;s WWDC26 keynote is the broadest possible reset, with the official chapter list pointing to four big beats: platform improvements, trust and safety, Apple Intelligence and Siri, and the usual sweep across the latest software releases. It is less of a deep technical session than a map of the year ahead, so its real value is in showing where Apple wants developer attention to go before the detailed platform talks begin.</p><h4><a href="https://developer.apple.com/videos/play/wwdc2026/101">Watch here.</a>&#128205;</h4><h3><a href="https://developer.apple.com/videos/play/wwdc2026/102">WWDC26: Platforms State Of The Union</a></h3><p>Apple&#8217;s companion session to the keynote is the developer-facing version of the week, framed around &#8220;the newest advancements on Apple platforms&#8221; rather than big public-facing announcements. In practice, this is usually the talk that matters more once the keynote ends, because it points developers toward the APIs, platform changes, and technical direction that will shape the rest of WWDC26.</p><h4><a href="https://developer.apple.com/videos/play/wwdc2026/102">Watch here.</a>&#128205;</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 269]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-269</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-269</guid><dc:creator><![CDATA[Those Who Swift]]></dc:creator><pubDate>Wed, 03 Jun 2026 20:25:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>Anthropic has confidentially <a href="https://www.wsj.com/tech/anthropic-ipo-paperwork-9a48c35e?st=ZPuSPC&amp;reflink=desktopwebshare_permalink&amp;mod=tldr&amp;utm_source=tldrnewsletter">filed for an IPO</a> that could bring the company to the public market as early as this fall. OpenAI is reportedly moving in the same direction. Looks like this year will become one of the biggest for AI-related IPOs and investments. The race is no longer just about models and benchmarks. It&#8217;s about infrastructure, profitability, market positioning, and who will shape the next generation of tools developers use daily.</p><p>And meanwhile, we are preparing for WWDC.</p><p>Apple has already released its <a href="https://developer.apple.com/videos/play/wwdc2026/394">intro video</a>, mentioning Labs, popular sessions, and even music. Yes, WWDC has its own official <a href="https://music.apple.com/ru/playlist/wwdc26-hello/pl.c2b332d45b194756aeb66a44329a2a08?l=en-GB">Apple Music playlist</a>, and surprisingly BTS made it there too. The conference keeps evolving from a purely technical event into a full ecosystem experience around development and creativity.</p><p>Last week&#8217;s poll showed fairly predictable but very realistic expectations from developers: a more stable Xcode with fewer crashes, smarter predictions that actually work as intended, and deeper UIKit adaptation of controls and features for SwiftUI. Many developers still feel that SwiftUI lacks parity in important areas, especially for complex production apps.</p><p>Hopefully next week will show whether these expectations are finally met.</p><p>And to demonstrate how inspiring WWDC can be, in collaboration with TheSwiftVlad we&#8217;re sharing a beautiful SF Symbols animation. Because honestly, wouldn&#8217;t it be great to see this level of polish and creativity presented directly during the conference itself?</p><p>What is the one WWDC announcement that would instantly make your daily development workflow better?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yxni!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 424w, /__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 848w, /__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yxni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif" width="800" height="997" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:997,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:449436,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/199800389?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 424w, /__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 848w, /__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!yxni!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02446b7e-b572-4eda-bd87-904fd858a5b9_800x997.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xz1U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 424w, /__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 848w, /__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xz1U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png" width="1200" height="50" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:50,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4106,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 424w, /__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 848w, /__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xz1U!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1dbea-0d04-4866-9f30-19f7174c00f4_1200x50.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3><a href="https://www.revenuecat.com/release/meet-rico-your-embedded-app-growth-advisor-2026-05-05/?utm_medium=sponsored&amp;utm_source=iOSDevTools&amp;utm_campaign=newsletter&amp;utm_content=rico">The AI Agent for Your RevenueCat Data</a></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!e6Jg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 424w, /__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 848w, /__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 1272w, /__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!e6Jg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png" width="1425" height="651" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:651,&quot;width&quot;:1425,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:279702,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/199800389?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 424w, /__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 848w, /__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 1272w, /__u/substackcdn.com/image/fetch/$s_!e6Jg!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F267a311c-d2b9-4e2b-bf10-9049ced9e612_1425x651.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Meet Rico! &#128075;</p><p>RevenueCat's embedded AI app growth advisor for subscription apps. Ask questions about churn, trials, pricing, paywalls, or retention and get answers using your app's real subscription data directly inside RevenueCat and Slack.</p><p>Built to help iOS developers make smarter monetization decisions faster.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.revenuecat.com/release/meet-rico-your-embedded-app-growth-advisor-2026-05-05/?utm_medium=sponsored&amp;utm_source=iOSDevTools&amp;utm_campaign=newsletter&amp;utm_content=rico&quot;,&quot;text&quot;:&quot;Try Rico today!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.revenuecat.com/release/meet-rico-your-embedded-app-growth-advisor-2026-05-05/?utm_medium=sponsored&amp;utm_source=iOSDevTools&amp;utm_campaign=newsletter&amp;utm_content=rico"><span>Try Rico today!</span></a></p><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.massicotte.org/stateless-actors/">Stateless Actors</a></h3><p>Matt Massicotte explores a deceptively simple question: if actors exist to protect mutable state, does an actor with no state make any sense at all? His answer is more nuanced than a yes or no, showing that stateless actors can still be useful for off-main execution, custom executors, or protecting external state like the file system &#8212; but only when the trade-offs are clearly understood.</p><h4><a href="https://www.massicotte.org/stateless-actors/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://artemnovichkov.com/blog/task-names-in-swift-concurrency">Task Names In Swift Concurrency</a></h3><p>Artem Novichkov walks through Swift&#8217;s new task naming support and shows why it matters once concurrent work gets large enough to debug, profile, or inspect in Instruments. A nice detail in the article is that names are meant for diagnostics, not app logic, with clear examples across <code>Task</code>, detached tasks, task groups, SwiftUI&#8217;s <code>.task</code>, and the current limitation that <code>async let</code> children still cannot be named.</p><h4><a href="https://artemnovichkov.com/blog/task-names-in-swift-concurrency">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://www.swiftdifferently.com/blog/swift/concurrency/how-do-you-build-a-mutex-that-works-with-async-await">How Do You Build A Mutex That Works With Async/Await?</a></h3><p>Omar Elsayed explores a subtle concurrency problem: actors do not guarantee mutual exclusion across suspension points, and Swift&#8217;s native <code>Mutex</code> cannot safely span <code>await</code>. The article gets especially interesting when it breaks down Matt Massicotte&#8217;s TaskGate approach, using continuations and a small internal lock to hand ownership from one waiting task to the next without blocking cooperative threads.</p><h4><a href="https://www.swiftdifferently.com/blog/swift/concurrency/how-do-you-build-a-mutex-that-works-with-async-await">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://tanaschita.com/ios-notifications-registering-in-swiftui/">Registering For Push Notifications In SwiftUI</a></h3><p>Natascha Fadeeva walks through the full push registration flow in SwiftUI, from requesting permission and checking the current authorization state to registering with APNs and handling the returned device token. A useful reminder here is that SwiftUI still relies on an app delegate for the APNs callbacks, so <code>UIApplicationDelegateAdaptor</code> remains part of the picture even in a modern app.</p><h4><a href="https://tanaschita.com/ios-notifications-registering-in-swiftui/">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=q7tgn1rr">All Systems Glow</a></h3><p>Apple is using this short post as another WWDC26 countdown marker, with the conference now just one week away and the full event staying online and free. This is more of a mood-setting signal than a product update, but it does mark the final stretch before the June 8, 2026 kickoff.</p><h4><a href="https://developer.apple.com/news/?id=q7tgn1rr">Read more.</a>&#128205;</h4><h3><a href="https://developer.apple.com/news/?id=tu7pk9oy">Get Ready With The Latest Beta Releases</a></h3><p>Apple has released new beta builds for iOS 26.6, iPadOS 26.6, macOS 26.6, tvOS 26.6, visionOS 26.6, and watchOS 26.6, alongside the recommendation to build and test with Xcode 26.5. It is the usual signal to start validation early, especially if your app depends on newer SDK behavior or platform-specific edge cases.</p><h4><a href="https://developer.apple.com/news/?id=tu7pk9oy">Read more.</a>&#128205;</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://allenpike.com/2026/voice-in-visuals-out/">Building For Voice In, Visuals Out</a></h3><p>Allen Pike argues that AI is moving toward a more natural interaction pattern where people speak and computers respond with interfaces, visuals, and structured output instead of long spoken replies. What makes the piece stand out is its focus on latency: voice feels magical only when it is fast enough to avoid awkward turn-taking, which is why voice-in and visuals-out may be the most practical near-term direction for real products.</p><h4><a href="https://allenpike.com/2026/voice-in-visuals-out/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h2><a href="/__u/indieappdevs.substack.com/p/indie-app-devs-24">Marketing Apps as a Developer</a></h2><p>Oleh Stasula, the founder of WinWinKit and Usage is coming back for the part 2. In the part 1 he shared a few personal <strong><a href="/__u/indieappdevs.substack.com/p/indie-app-devs-22">tips on how he designs apps users love</a></strong>.</p><p>This is part 2 - about what to do once you&#8217;ve shipped, because shipping without marketing will keep your product invisible.</p><h4><a href="/__u/indieappdevs.substack.com/p/indie-app-devs-24">Read more.</a>&#128205;Level: Beginner</h4><h3><a href="https://livsycode.com/best-practices/reactive-is-no-longer-the-default-in-swift/">Reactive Frameworks Vs Async/Await Vs AsyncAlgorithms</a></h3><p>Artem Mirzabekian looks at the shift in Swift&#8217;s center of gravity: reactive frameworks once gave iOS developers one clean model for asynchronous code, but async/await, actors, Observation, AsyncSequence, and AsyncAlgorithms now cover most of that ground with less conceptual weight.</p><h4><a href="https://livsycode.com/best-practices/reactive-is-no-longer-the-default-in-swift/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://deliveryhero.jobs/blog/scaling-ios-application-development-with-tuist/">Scaling iOS Application Development With Tuist</a></h3><p>Michael Gerasymenko and Ashutosh Dubey show how Delivery Hero used Tuist to keep Xcode and Swift Package Manager in place while making a fast-growing modular codebase much easier to scale. The numbers make the story land: local clean builds dropped from 2.5 minutes to 0.5 minutes, incremental builds roughly halved, and CI build plus unit-test time improved by 2.5x &#8212; with the trade-off being migration effort, caching-related debugging limits, and the discipline needed to maintain project structure as code.</p><h4><a href="https://deliveryhero.jobs/blog/scaling-ios-application-development-with-tuist/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://medium.com/@wesleymatlock/enter-sandman-mode-three-months-inside-xcode-26-3s-agentic-coding-cbe67ce46df9">Enter Sandman Mode: Three Months Inside Xcode 26.3&#8217;s Agentic Coding</a></h3><p>Wesley Matlock treats Xcode 26.3&#8217;s agentic coding less like magic and more like a sharp new tool: excellent at grounded multi-file refactors, compiler-driven fix loops, and SwiftUI preview iteration, but still prone to losing the thread or inventing neat-looking abstractions that do not belong.</p><h4><a href="https://medium.com/@wesleymatlock/enter-sandman-mode-three-months-inside-xcode-26-3s-agentic-coding-cbe67ce46df9">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://serialcoder.dev/text-tutorials/swiftui/enabling-haptic-feedback-with-sensoryfeedback-in-swiftui/">Enabling Haptic Feedback With </a><code>sensoryFeedback</code><a href="https://serialcoder.dev/text-tutorials/swiftui/enabling-haptic-feedback-with-sensoryfeedback-in-swiftui/"> In SwiftUI</a></h3><p>Gabriel Theodoropoulos shows how SwiftUI&#8217;s <code>sensoryFeedback</code> modifier makes haptics feel like a natural part of view code, with semantic styles like <code>selection</code>, <code>success</code>, <code>error</code>, <code>start</code>, and <code>stop</code>, plus custom <code>impact</code> variations when more control is needed. The article is especially helpful in the way it explains the trigger model: feedback is tied to changes in an <code>Equatable</code> value, not to the button tap itself, which is an easy detail to miss at first.</p><h4><a href="https://serialcoder.dev/text-tutorials/swiftui/enabling-haptic-feedback-with-sensoryfeedback-in-swiftui/">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=KlCqHP32c8M">Apple&#8217;s Hidden AI: Unlock Foundation Models on Your Mac with Apfel</a></h3><p>Stewart Lynch turns Apple&#8217;s on-device models into something much more tangible by using Appfel from Terminal instead of starting with a full Xcode project. The video gets even more practical in the second half, where he installs it with Homebrew, tries prompt, chat, and server modes, then uses agentic coding to reshape an existing Appfel-based Mac utility into something that better fits his workflow.</p><h4><a href="https://www.youtube.com/watch?v=KlCqHP32c8M">Watch here.</a>&#128205;Level: Advanced</h4><h3><a href="https://www.youtube.com/watch?v=Jtk4O1rDKTI">Modern iOS Security: Attacks, Defenses &amp; AI</a></h3><p>This Swift Academy episode turns iOS security into a very current discussion, mixing real production failures with a broader look at how AI is changing both attack speed and defense workflows. Conversation with Dave Poirier and Deya Elkhawaldeh is especially valuable because it stays practical: weak storage, unsafe assumptions about &#8220;secure by default&#8221; platforms, and shallow threat modeling are still common, while AI is rapidly lowering the barrier for reverse engineering and automated security review.</p><h4><a href="https://www.youtube.com/watch?v=Jtk4O1rDKTI">Watch here.</a>&#128205;Level: Advanced</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 268]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-268</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-268</guid><pubDate>Wed, 27 May 2026 20:55:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>WWDC is getting closer and closer, and this time it feels less like gentle notification sounds and more like a huge bell ringing about upcoming changes. AI Agent videos are already appearing outside the usual WWDC flow, leadership changes are making headlines, and many are even speculating that this could be one of the last conferences where Tim Cook still takes such a central role on stage.</p><p>Of course, Apple is presenting technologies that have been in development for years, not just between conference cycles. Whatever we see this June will continue shaping the ecosystem for many years ahead. That&#8217;s why this period always becomes the season of wishlists. Developers start sharing hopes for iOS, visionOS, tvOS, Swift, Xcode, and everything around them. Better multitasking, smarter Siri, more open frameworks, improved AI integrations, fewer restrictions, and more stability.</p><p>One topic that keeps surfacing again and again is SwiftUI. Despite all the progress, many developers still struggle with hidden behaviors, unpredictable rendering, navigation edge cases, and debugging complexity. Discussions around &#8220;SwiftUI should become open source&#8221; appear more frequently every year. Not because developers dislike the framework, but because they want to understand it better, contribute fixes faster, and build more predictable architectures on top of it. Swift itself became stronger after opening up to the community, and many wonder whether SwiftUI could benefit from the same path.</p><p>But expectations are tricky things. The lower they are, the easier it is to be surprised in a good way.</p><p>So instead of asking about cold expectations, let&#8217;s ask something different: what change would genuinely make your everyday development experience better?</p><div class="poll-embed" data-attrs="{&quot;id&quot;:517860}" data-component-name="PollToDOM"></div><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Justas here&#8230; &#128587;&#8205;&#9794;&#65039;</h1><p>I would like to share something you might find valuable.</p><p>My friend Simonas and I launched a <strong>100% FREE</strong> invoicing tool called - <strong><a href="https://invcly.com">Invcly</a></strong></p><p>Nothing super fancy, just a simple invoicing tool that allows you to send and track invoices. The main reason we built it is because I was tired of paying $20 a month for invoicing software, paying extra for features, for more saved clients, and other upsells. Companies always find ways to charge you more.</p><p>With Invcly, you can:</p><p>&#128204; Create and track invoices.<br>&#128204; Save clients.<br>&#128204; Create and save templates.<br>&#128204; Send recurring invoices (still in beta).<br>&#128204; Create different products.</p><p>And most importantly, it&#8217;s <strong>always FREE</strong>. No hidden fees or hard paywalls (you know what I&#8217;m talking about).</p><p>Feel free to use it, share it with friends, and most importantly, send me an email with any bugs or features you would like to see.</p><p>Enjoy, and let&#8217;s make invoicing simple and free! &#129534;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://invcly.com&quot;,&quot;text&quot;:&quot;Try Invcly!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://invcly.com"><span>Try Invcly!</span></a></p><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://www.sagarunagar.com/blog/swift-task-lifecycle-management/">Swift Task Lifecycle Management - Structured vs Unstructured Concurrency</a></h3><p>Sagar Unagar shows why concurrency structure in Swift is not just a style choice, but something that directly affects task lifetime, cancellation, error propagation, and UI consistency. His guidance is refreshingly clear: start with structured tools like <code>async let</code>, <code>TaskGroup</code>, and SwiftUI&#8217;s <code>.task</code>, and only move to unstructured <code>Task</code> or <code>Task.detached</code> when the work is genuinely independent.</p><h4><a href="https://www.sagarunagar.com/blog/swift-task-lifecycle-management/">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://livsycode.com/swift/uniquebox-ref-and-mutableref-in-swift-6-4/">UniqueBox, Ref, And MutableRef In Swift 6.4</a></h3><p>Artem Mirzabekian explores how Swift 6.4 expands the language&#8217;s ownership vocabulary with <code>UniqueBox</code>, <code>Ref</code>, and <code>MutableRef</code>, giving developers more precise tools than class boxes or unsafe pointers for expressing heap ownership and scoped access. A useful way to read this addition is as a split between storage and access, which makes these types especially relevant for lower-level libraries, custom storage, interop layers, and performance-sensitive code.</p><h4><a href="https://livsycode.com/swift/uniquebox-ref-and-mutableref-in-swift-6-4/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://danielsaidi.com/blog/2026/05/22/making-a-swiftui-sheet-automatically-size-to-fit-its-content">Making A SwiftUI Sheet Automatically Size To Fit Its Content</a></h3><p>Daniel Saidi shows a neat workaround for one of SwiftUI&#8217;s missing sheet features: sizing a sheet to its actual content instead of forcing it into <code>.medium</code>, <code>.large</code>, or a guessed fixed height.</p><h4><a href="https://danielsaidi.com/blog/2026/05/22/making-a-swiftui-sheet-automatically-size-to-fit-its-content">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://tanaschita.com/ios-keychain-secure-data-storage/">Working With The Keychain In iOS</a></h3><p>Natascha Fadeeva explains the Keychain through its core query model, showing how the same dictionary-based structure powers save, read, update, and delete operations for sensitive data like passwords and tokens.</p><h4><a href="https://tanaschita.com/ios-keychain-secure-data-storage/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://nilcoalescing.com/blog/TimelineViewInSwiftUI/">Refreshing And Animating Views Using TimelineView In SwiftUI</a></h3><p>Natalia Panferova shows how <code>TimelineView</code> gives SwiftUI a clean way to reevaluate views on a schedule, which makes it especially useful for clocks, timed refreshes, and visuals that need to stay in sync with time. A helpful distinction in her article is that <code>TimelineView</code> belongs to the UI layer, while <code>Timer</code> is still the better fit for background work, data refreshes, or logic that should live outside the view.</p><h4><a href="https://nilcoalescing.com/blog/TimelineViewInSwiftUI/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=yrrb45pw">Upcoming Changes To Age Ratings In Australia And Vietnam</a></h3><p>Apple is updating App Store age ratings in Australia and Vietnam on June 18, 2026, with Australia dropping the 15+ category and Vietnam introducing local age ratings aligned with national law. The key thing for developers is to revisit the App Store Connect age rating questionnaire now, since existing ratings may be recalculated automatically from the answers already on file.</p><h4><a href="https://developer.apple.com/news/?id=yrrb45pw">Read more.</a>&#128205;</h4><div><hr></div><h1 style="text-align: center;">Design &#127912;</h1><h3><a href="https://www.basbroek.nl/making-accessibility-acceessible">Making Accessibility Accessible</a></h3><p>Bas Broek lowers the barrier to accessibility work by focusing on practical tools like Voice Control labels, Hover Text, and the VoiceOver caption panel instead of starting with deep theory. The most useful takeaway is that accessibility becomes easier to improve when teams can quickly see what assistive technologies expose and spot where labels, traits, or element exposure break down.</p><h4><a href="https://www.basbroek.nl/making-accessibility-acceessible">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="https://www.swiftdifferently.com/blog/system-desgin/modern-isnot-a-value-fit-Is">Modern Isn&#8217;t A Value. Fit Is.</a></h3><p>Omar Elsayed argues that &#8220;modern&#8221; APIs like <code>async/await</code>, actors, or new architectures are not automatically better when they make the surrounding codebase harder to read and integrate with. The most useful takeaway is the boundary rule: modernize internals when it helps, but keep external APIs aligned with the system your team already speaks.</p><h4><a href="https://www.swiftdifferently.com/blog/system-desgin/modern-isnot-a-value-fit-Is">Read more.</a>&#128205;Level: Advanced</h4><h3><a href="https://troz.net/post/2026/swiftui_praise/">In Praise Of SwiftUI</a></h3><p>SwiftUI&#8217;s biggest win may not be &#8220;UI in Swift&#8221; at all, but the reactive data flow that keeps complex interfaces in sync without so much manual plumbing. Sarah Reichelt makes a grounded case for treating it as the default choice for speed and maintainability, then reaching for AppKit or UIKit only when a real gap, bug, or performance limit shows up.</p><h4><a href="https://troz.net/post/2026/swiftui_praise/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://macguru.dev/swiftui-should-become-open-source/">SwiftUI Should Become Open-Source</a></h3><p>Max Seelemann argues that SwiftUI still struggles with core platform behaviors like keyboard focus timing and macOS drag and drop, which makes Apple&#8217;s &#8220;best way to build an app&#8221; promise harder to defend. His bigger point is that open-sourcing SwiftUI could speed up fixes, reduce its dependence on OS release cycles, and give developers a way to help move the framework forward where Apple has been too slow.</p><h4><a href="https://macguru.dev/swiftui-should-become-open-source/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://www.anthropic.com/news/chris-olah-pope-leo-encyclical">Anthropic Co-Founder Chris Olah&#8217;s Remarks On Pope Leo XIV&#8217;s Encyclical &#8220;Magnifica Humanitas&#8221;</a></h3><p>Chris Olah argues that AI should be examined not only by the labs building it, but also by outside critics willing to question its broader social and moral impact. He centers that case on three concerns in particular: global inequality, human flourishing, and how little we still understand about advanced models, while candidly noting that commercial and geopolitical pressure can push frontier labs away from acting responsibly.</p><h4><a href="https://www.anthropic.com/news/chris-olah-pope-leo-encyclical">Read more.</a>&#128205;</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://shankarmadeshvaran.medium.com/create-and-style-app-shortcuts-in-ios-using-appshortcutsprovider-4d903f302899">Create And Style App Shortcuts In iOS Using AppShortcutsProvider</a></h3><p>Shankar Madeshvaran walks through the full App Shortcuts flow, from <code>AppIntent</code> and <code>AppShortcutsProvider</code> setup to branded tiles with custom tint, solid backgrounds, gradients, and Light/Dark variants. Shortcut styling lives in <code>Info.plist</code> and asset catalogs, not Swift code, and the same branded look also carries into Spotlight results.</p><h4><a href="https://shankarmadeshvaran.medium.com/create-and-style-app-shortcuts-in-ios-using-appshortcutsprovider-4d903f302899">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=2so9ifq5hYY">Decoupling SwiftData in SwiftUI: Is It Worth It?</a></h3><p>Mohammad Azam uses a practical SwiftData and SQLite example to show how a protocol-based DataAccess layer can decouple persistence from SwiftUI views, while also exposing the real cost of that abstraction. This pattern gives flexibility and cleaner boundaries, but you lose SwiftData conveniences like automatic UI updates and can end up with more architectural weight than the app really needs.</p><h4><a href="https://www.youtube.com/watch?v=2so9ifq5hYY">Watch here.</a>&#128205;Level: XXX</h4><div><hr></div><h1 style="text-align: center;">One more Thing &#127918;</h1><h3><a href="https://www.swiftjectivec.com/wwdc-2026-the-pregame-quiz/">W.W.D.C. 2026: The Pregame Quiz</a></h3><p>Jordan Morgan turns pre-WWDC nerves into a smart trivia round built from the year&#8217;s Apple news, App Store policy updates, hardware launches, and community lore. It works as more than a quiz, really &#8212; a fun way to refresh the details developers are most likely to want in their heads before the keynote.</p><h4><a href="https://www.swiftjectivec.com/wwdc-2026-the-pregame-quiz/">Play here.</a>&#128205;</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Those Who Swift - Issue 267]]></title><description><![CDATA[Your weekly dose of Swift!]]></description><link>https://thosewhoswift.substack.com/p/those-who-swift-issue-267</link><guid isPermaLink="false">https://thosewhoswift.substack.com/p/those-who-swift-issue-267</guid><dc:creator><![CDATA[Those Who Swift]]></dc:creator><pubDate>Wed, 20 May 2026 20:01:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FQA8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ed0e7ea-c533-4c89-ac9b-f1bc72c616e2_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 style="text-align: center;">Weekly note &#9999;&#65039;</h2><p>Hello! &#128075;</p><p>This week I partnered with <strong><a href="https://www.linkedin.com/in/shannon-kelly-ash/">Shannon Ash</a></strong>. She&#8217;s been writing CVs since COVID-19 hit, helping people position themselves better and land new jobs.</p><p>Six years later, her work is still producing real results.</p><p><strong>Some results:</strong></p><ul><li><p>87% of her clients landed interviews within 2 weeks of applying.</p></li><li><p>70% reported a salary increase, up to 35%, while securing their new role.</p></li><li><p>Some went from months, up to 4 months, of silence to multiple offers at once.</p></li></ul><p><strong>Here are few testimonials:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!uN-5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!uN-5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:433405,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/197634535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!uN-5!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e8a3a0-d59c-4308-b4dd-3c2b902b8c2e_1800x1200.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The clients she mainly works with are usually dealing with one of these problems:</p><ul><li><p><strong>Ghosted</strong> - they&#8217;ve been applying for 2+ months with zero replies and no interviews.</p></li><li><p><strong>Pivoting their career</strong> - they&#8217;re in their late 30s or 40s with a decade of expertise, but don&#8217;t know how to translate their wins or skills into a new industry or niche.</p></li><li><p><strong>Aspiring to be a leader</strong> - they&#8217;re aiming for the C-Suite or a Senior Lead role, but their current CV still looks like a list of tasks, not a record of impact. The CV changes with seniority.</p></li><li><p><strong>Procrastinating daily</strong> - they&#8217;re unhappy where they are, but the mental weight of updating their CV is a lot. They keep putting it off and don&#8217;t have the time to even start.</p></li></ul><p><strong>Offer:</strong></p><ul><li><p>Cover Letter and CV: a positioning statement letter, which is Shannon&#8217;s spin on a cover letter, plus a CV.</p></li><li><p>Fully optimized LinkedIn profile to match the new narrative.</p></li></ul><p><strong>Price: 450&#8364; &#128204;</strong></p><p><strong>Important - this offer has limited spots:</strong></p><ul><li><p>June only 5 spots available.</p></li><li><p>July only 5 spots available.</p></li><li><p>August only 10 spots available.</p></li></ul><p><strong>Interested?</strong> - Just reply to this email or contact me at - <strong>thisweekinswift@gmail.com</strong></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5m0d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_webp, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5m0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59431,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thosewhoswift.substack.com/i/196037159?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_424, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_848, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1272, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5m0d!, /__u/thosewhoswift.substack.com/w_1456, /__u/thosewhoswift.substack.com/c_limit, /__u/thosewhoswift.substack.com/f_auto, /__u/thosewhoswift.substack.com/q_auto:good, /__u/thosewhoswift.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d9e39d-ece5-44f0-84cf-bd02f9bf2ccd_1584x396.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><h1 style="text-align: center;">Swift Around the Web &#127760;</h1><h3><a href="https://swiftwithmajid.com/2026/05/19/deprecating-your-own-convenience-api/">Deprecating Your Own Convenience API</a></h3><p>Majid Jabrayilov shows a neat way to stop compatibility helpers from becoming permanent dead code using Swift availability annotations. The key idea: deprecate wrappers when the new minimum OS makes them unnecessary, then obsolete them later so the compiler forces cleanup.</p><h4><a href="https://swiftwithmajid.com/2026/05/19/deprecating-your-own-convenience-api/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://livsycode.com/best-practices/a-feature-flags-system-in-swift/">A Feature Flags System In Swift</a></h3><p>Artem Mirzabekian shows how feature flags can grow from simple booleans into real app infrastructure while staying type-safe, thread-safe, and predictable. The most useful part is the full architecture: typed features, priority-based resolution, local overrides, SwiftUI environment injection, and a built-in toggle screen for QA and testing.</p><h4><a href="https://livsycode.com/best-practices/a-feature-flags-system-in-swift/">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Coding &#128104;&#8205;&#128187;</h1><h3><a href="https://azamsharp.com/2026/05/16/storekit2-app-store-server-notifications.html">Tracking App Store Purchases With Server Notifications</a></h3><p>Mohammad Azam shows how App Store Server Notifications complete the StoreKit 2 story by letting your backend react to renewals, refunds, billing issues, expirations, and purchases outside the app. The most useful part is the payload breakdown: Apple sends nested signed JWTs, so the key is decoding <code>signedPayload</code>, then <code>signedTransactionInfo</code> and <code>signedRenewalInfo</code>, to extract transaction and renewal state cleanly.</p><h4><a href="https://azamsharp.com/2026/05/16/storekit2-app-store-server-notifications.html">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.sagarunagar.com/blog/contentunavailableview-swiftui/">ContentUnavailableView In SwiftUI - Complete Guide With Examples</a></h3><p>Sagar Unagar shows why <code>ContentUnavailableView</code> is more than a simple empty-state helper: it gives SwiftUI apps a consistent, accessible way to handle no-content, failed-load, and no-results screens without rebuilding the same UI each time. The most useful part is the practical range, from the built-in <code>.search</code> variant to custom actions and recovery flows, while keeping empty states restrained and platform-native.</p><h4><a href="https://www.sagarunagar.com/blog/contentunavailableview-swiftui/">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Apple &#127823;</h1><h3><a href="https://developer.apple.com/news/?id=7lcnqgxp">Coming Bright Up - WWDC26</a></h3><p>Apple is teasing WWDC26 with a short preview, calling it a week of technology, creativity, and community that will be online and free. It is more of a save-the-date than a technical update, but confirms Apple is starting the WWDC ramp-up.</p><h4><a href="https://developer.apple.com/news/?id=7lcnqgxp">Read more.</a>&#128205;</h4><h3><a href="https://developer.apple.com/news/?id=8t3j66i7">Introducing The 2026 Apple Design Award Finalists</a></h3><p>Apple has announced the 2026 Apple Design Award finalists, highlighting 36 apps and games for innovation, ingenuity, and technical achievement. It is a good shortlist to browse before WWDC, especially for a quick look at the product quality and design direction Apple is celebrating this year.</p><h4><a href="https://developer.apple.com/news/?id=8t3j66i7">Read more.</a>&#128205;</h4><div><hr></div><h1 style="text-align: center;">Other cool stuff &#129520;</h1><h3><a href="https://danielsaidi.com/blog/2026/04/30/using-xcode-mcp-with-claude-code">Using Xcode MCP With Claude Code</a></h3><p>Daniel Saidi shows how Xcode 26.3&#8217;s built-in MCP server gives Claude Code direct awareness of project structure, schemes, builds, and tests instead of treating Swift files as isolated text.</p><h4><a href="https://danielsaidi.com/blog/2026/04/30/using-xcode-mcp-with-claude-code">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://tanaschita.com/swiftui-basic-animations/">Understanding Basic Animations In SwiftUI</a></h3><p>Natascha Fadeeva explains the two core SwiftUI animation paths: <code>animation(_:value:)</code> for view-driven implicit animation and <code>withAnimation</code> for explicit state-driven changes. The most useful part is the decision guide, including when to use each approach and the iOS 17+ completion handler for follow-up work after an animation finishes.</p><h4><a href="https://tanaschita.com/swiftui-basic-animations/">Read more.</a>&#128205;Level: Beginner</h4><div><hr></div><h1 style="text-align: center;">AI &#129302;</h1><h3><a href="https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start">How Claude Code Works In Large Codebases: Best Practices And Where To Start</a></h3><p>Anthropic says Claude Code works best in large codebases when teams invest in the harness around the model, especially <code>CLAUDE.md</code> files, hooks, skills, plugins, LSP integrations, MCP servers, and subagents. The most useful takeaway is practical: live agentic search avoids stale indexes, but results improve when the codebase gives Claude clear local context and path-specific expertise.</p><h4><a href="https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start">Read more.</a>&#128205;Level: Intermediate</h4><div><hr></div><h1 style="text-align: center;">Tutorials &#128210;</h1><h3><a href="https://onmyway133.com/posts/how-to-recognize-text-in-images-with-vision-in-swift/">How To Recognize Text In Images With Vision In Swift</a></h3><p>Khoa Pham shows how Apple&#8217;s newer Vision API makes text recognition cleaner by replacing callback-heavy <code>VNRecognizeTextRequest</code> flows with the async <code>RecognizeTextRequest</code> introduced in iOS 18 and macOS 15. The key takeaway: avoid fragile continuation wrappers around the older synchronous API, and use the new async request model when your deployment target allows it.</p><h4><a href="https://onmyway133.com/posts/how-to-recognize-text-in-images-with-vision-in-swift/">Read more.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.basbroek.nl/optimizing-assistive-technology">Optimizing For VoiceOver And Voice Control</a></h3><p>Bas Broek shows how an accessibility change that feels cleaner for VoiceOver can make Voice Control noticeably worse, especially when combined elements turn separate buttons into hidden actions. The key takeaway: improving one assistive technology can hurt another, so the better solution is sometimes the more balanced one, not the most &#8220;optimized&#8221; version.</p><h4><a href="https://www.basbroek.nl/optimizing-assistive-technology">Read more.</a>&#128205;Level: Advanced</h4><div><hr></div><h1 style="text-align: center;">Video &#127909;</h1><h3><a href="https://www.youtube.com/watch?v=dW6KeYCqCFc">Understanding Swift Result Builders-The Power Behind ViewBuilder</a></h3><p>Stewart Lynch starts with <code>ViewBuilder</code> in familiar SwiftUI containers, then builds custom result builders from scratch to show how declarative syntax works under the hood. The most useful part is the hands-on progression from simple string builders to conditional checklist generation with <code>buildExpression</code>, <code>buildOptional</code>, and <code>buildEither</code>.</p><h4><a href="https://www.youtube.com/watch?v=dW6KeYCqCFc">Watch here.</a>&#128205;Level: Intermediate</h4><h3><a href="https://www.youtube.com/watch?v=aMfig5cKOtY">Claude Code Just Dropped /Goal (Master It In 8 Minutes)</a></h3><p>This walkthrough explains <code>/goal</code> as a hands-off Claude Code workflow, where one model does the work and a second agent checks whether the finish line has been met. The key takeaway: goal conditions should be specific and verifiable, with turn or time limits to avoid wasted tokens.</p><h4><a href="https://www.youtube.com/watch?v=aMfig5cKOtY">Watch here.</a>&#128205;Level: Beginner</h4><div><hr></div><p style="text-align: center;">Thanks for reading Those Who Swift!</p><p style="text-align: center;">Subscribe for free to receive new posts. &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thosewhoswift.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/thosewhoswift.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>