<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><description>I write Swift and write about Swift, but most people prefer my dogs.</description><link>https://bsky.app/profile/twostraws.bsky.social</link><title>@twostraws.bsky.social - Paul Hudson</title><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mrctvyhjqk2e</link><description>Did you know calling a method on a protocol-typed variable can give you a different result than calling it on the concrete type? Protocol composition, extension traps, and conflict resolution all covered here. https://www.hackingwithswift.com/articles/138/swift-protocols-tips-and-tricks</description><pubDate>23 Jul 2026 12:33 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mrctvyhjqk2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mratkoqpwk23</link><description>💰 New on the Kickstart blog: How to price an app with the coffee test. Price your app against what people already buy – the coffee test, an annual-price hypothesis, and four questions that help find your price band. https://www.kickstart.tools/blog/how-to-price-an-app-the-coffee-test</description><pubDate>22 Jul 2026 17:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mratkoqpwk23</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mradcb7cgs2e</link><description>For HWS+ subscribers: A breakpoint that plays a sound and continues automatically is a surprisingly effective way to monitor SwiftUI redraws without ever pausing your app. https://www.hackingwithswift.com/plus/learn-something-new/smarter-breakpoints</description><pubDate>22 Jul 2026 12:31 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mradcb7cgs2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mr63yclq5c2e</link><description>Want to ship your app with pre-loaded data? The recommended approach is to build the SwiftData store ahead of time and bundle it in. There&#39;s a catch though - you&#39;ll need a small amount of Core Data to disable write-ahead logging first. https://www.hackingwithswift.com/quick-start/swiftdata/how-to-pre-populate-an-app-with-an-existing-swiftdata-database</description><pubDate>21 Jul 2026 15:15 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mr63yclq5c2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mr3zudtbus2e</link><description>Unwrapping an optional into a variable of the same name used to require if let name = name. The shorthand if let name does the same job with less noise. Small change, big quality of life improvement. https://www.hackingwithswift.com/swift/5.7/if-let-shorthand</description><pubDate>20 Jul 2026 19:31 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mr3zudtbus2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mr3aomvuvc2i</link><description>New on the Kickstart blog: When to call requestReview() – Apple’s rules and the timing that works. Apple limits how often review prompts appear and now gives clear guidance for using them, so here’s how to ask respectfully after a meaningful success. https://www.kickstart.tools/blog/when-to-call-requestreview-apples-rules-and-the-timing-that-works</description><pubDate>20 Jul 2026 12:01 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mr3aomvuvc2i</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mqzg3c4eas2e</link><description>Sunday Build with HWS+: Wanted! Build a fun little app that creates custom &#34;Wanted&#34; posters from user input, complete with a weathered paper texture and easy sharing. 🤠 #SundayBuild https://www.hackingwithswift.com/plus/live-streams/wanted</description><pubDate>19 Jul 2026 18:32 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mqzg3c4eas2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mqpqeycnck2n</link><description>New on the Kickstart blog: The ultimate indie iOS app launch checklist! A complete app launch checklist for indie iOS developers – all the key tasks from 45 days before launch to 60 days after. https://www.kickstart.tools/blog/the-ultimate-indie-ios-app-launch-checklist</description><pubDate>15 Jul 2026 22:10 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mqpqeycnck2n</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mqkcppkxps2r</link><description>Kickstart had almost 3,000 downloads in week one, reached #2 in the Mac App Store Developer chart, and I’ve shipped three updates since. The mistake? I still haven’t contacted the press about it 🫠 Here’s my launch retrospective – learn from my mistakes! https://www.kickstart.tools/blog/kickstart-launch-retrospective</description><pubDate>13 Jul 2026 18:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mqkcppkxps2r</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mqhokq46uk2t</link><description>Sunday Build with HWS+: Read your App Store Connect data directly from a macOS app, including apps, customer reviews, and more. It takes some careful JWT networking, but there&#39;s a lot to learn. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/shipshape</description><pubDate>12 Jul 2026 17:16 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mqhokq46uk2t</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mqcexcrpuc2t</link><description>Bold, italic, strikethrough, monospaced, and tappable links - SwiftUI&#39;s Text view renders Markdown with zero extra setup. https://www.hackingwithswift.com/quick-start/swiftui/how-to-render-markdown-content-in-text</description><pubDate>10 Jul 2026 14:40 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mqcexcrpuc2t</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mq7pzui33c2t</link><description>Swift&#39;s string interpolation is way more powerful than most people realize - you can add custom appendInterpolation() methods to format numbers, build HTML, or even construct entirely new types from string syntax. https://www.hackingwithswift.com/articles/163/how-to-use-custom-string-interpolation-in-swift</description><pubDate>09 Jul 2026 13:21 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mq7pzui33c2t</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mq56qtjj6k2l</link><description>For HWS+ subscribers: print() is everyone&#39;s first debugging tool, but dump() gives you a full recursive hierarchy of any object&#39;s contents, even for classes. https://www.hackingwithswift.com/plus/learn-something-new/printing-vs-dumping</description><pubDate>08 Jul 2026 13:06 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mq56qtjj6k2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mq2ov2dd3s2l</link><description>Building a document-based app with SwiftData takes just four changes: a UTType declaration, a target property, a DocumentGroup in your App struct, and a content type conformance. SwiftData handles all the per-document storage behind the scenes. https://www.hackingwithswift.com/quick-start/swiftdata/how-to-create-a-document-based-app-with-swiftdata</description><pubDate>07 Jul 2026 13:17 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mq2ov2dd3s2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpyandf4bc2l</link><description>Macros let you transform Swift syntax at compile time - injecting code, adding conformances, generating boilerplate you&#39;d otherwise write by hand. They&#39;re powerful, they&#39;re type-safe, and they run as a separate build step. 🔧 https://www.hackingwithswift.com/swift/5.9/macros</description><pubDate>06 Jul 2026 13:57 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpyandf4bc2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpvvcjtkbk2l</link><description>Sunday Build with HWS+: Build an iMessage-style chat interface powered by OpenAI&#39;s API. It&#39;s a flexible starting point you can customize for all sorts of AI-driven features. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/chatterbox</description><pubDate>05 Jul 2026 15:28 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpvvcjtkbk2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpr6bvskxs2l</link><description>Lock Screen widgets and always-on Apple Watch displays can accidentally expose user data. The privacySensitive() modifier tells SwiftUI which views to redact in those contexts. https://www.hackingwithswift.com/quick-start/swiftui/how-to-mark-content-as-private-using-privacysensitive</description><pubDate>03 Jul 2026 18:26 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpr6bvskxs2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpocspc2l22l</link><description>Replacing Bool parameters with two-case enums turns cryptic calls like stopAnimation(false) into self-documenting code like stopAnimation(.performingFinalActions). It&#39;s a small change that makes a surprising difference to readability. https://www.hackingwithswift.com/articles/172/using-two-cased-enums-in-place-of-a-boolean</description><pubDate>02 Jul 2026 15:09 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpocspc2l22l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpo4bofbxc2y</link><description>A new Kickstart update is out now! It was already a fantastic tool to help indie devs succeed on the App Store, but the new update supercharges keyword searching, has smarter growth tips for existing apps, adds new advice from Apple on getting featured on the App Store, and more!</description><pubDate>02 Jul 2026 13:12 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpo4bofbxc2y</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mplspadywk2l</link><description>For HWS+ subscribers: Metal shaders give you pixel-level control over SwiftUI views, and they&#39;re more approachable than you might expect - from simple recoloring to rainbow gradients and interlacing effects, all hardware-accelerated. https://www.hackingwithswift.com/plus/advanced-swiftui/how-to-create-metal-shaders-for-swiftui-part-1</description><pubDate>01 Jul 2026 15:15 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mplspadywk2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpjb3qeavs2l</link><description>@Query doesn&#39;t support dynamic sort orders directly, but you can work around it by moving the query into a subview and passing the sort descriptor in via the initializer. A little extra setup, but it works well: https://www.hackingwithswift.com/quick-start/swiftdata/how-to-dynamically-change-a-querys-sort-order-or-predicate</description><pubDate>30 Jun 2026 14:55 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpjb3qeavs2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpgmgknvas2l</link><description>Generic functions used to require a fixed number of type parameters. Value and type parameter packs lift that restriction, letting you write functions that work across any number of types at once. https://www.hackingwithswift.com/swift/5.9/variadic-generics</description><pubDate>29 Jun 2026 13:40 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpgmgknvas2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpeakgzbpc2l</link><description>Sunday Build with HWS+: Build a multi-page web browser for iPad where users can display several sites at once, perfect for following breaking news or live events. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/grid-browser</description><pubDate>28 Jun 2026 15:02 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpeakgzbpc2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mpbkjksku22l</link><description>🔥 What’s new in SwiftUI for iOS 27? SwiftUI keeps getting better, and in this video I cover some of my favorite additions this year, including: Lazy @State, faster compile times, reorderable(), AsyncImage caching, toolbar priority customization, and more! https://www.youtube.com/watch?v=tNxEqyUVGck</description><pubDate>27 Jun 2026 13:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mpbkjksku22l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mp74y7v5yc2l</link><description>SwiftUI can render dates as static text, relative timestamps, or even live-updating timers, all from a single Text view. https://www.hackingwithswift.com/quick-start/swiftui/how-to-format-dates-inside-text-views</description><pubDate>26 Jun 2026 14:15 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mp74y7v5yc2l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mp4l3q63722l</link><description>Many SF Symbols come with built-in VoiceOver labels (&#34;heart&#34; is automatically read aloud as &#34;love&#34;), and SwiftUI picks the right icon variant for each platform without any extra code. The complete guide: https://www.hackingwithswift.com/articles/237/complete-guide-to-sf-symbols</description><pubDate>25 Jun 2026 13:49 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mp4l3q63722l</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mozxzlwy7c2z</link><description>For HWS+ subscribers: Every new file gets the same default header comment, but Xcode has a flexible customisation system with built-in macros for filenames, project names, and more. https://www.hackingwithswift.com/plus/learn-something-new/personalizing-your-xcode-header</description><pubDate>24 Jun 2026 13:03 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mozxzlwy7c2z</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3moxhxavgjc2z</link><description>Renaming a SwiftData property without @Attribute(originalName:) will silently discard your users&#39; data. One small macro saves a lot of heartache. 😬 https://www.hackingwithswift.com/quick-start/swiftdata/how-to-rename-properties-without-losing-data</description><pubDate>23 Jun 2026 13:10 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3moxhxavgjc2z</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3moux6edshs2z</link><description>Sometimes 64 bits just isn&#39;t enough, which is why Swift also support Int128 and UInt128. The evolution proposal itself admits the API is &#34;uninteresting&#34; - but those are very, very big numbers. https://www.hackingwithswift.com/swift/6.0/int128</description><pubDate>22 Jun 2026 13:04 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3moux6edshs2z</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mosgk74tbc2z</link><description>Sunday Build with HWS+: An original word game where players fill a 5x5 grid to spell five words across and five words down simultaneously, with drag and drop plus tile locking. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/5x5</description><pubDate>21 Jun 2026 13:01 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mosgk74tbc2z</guid></item></channel></rss>