56,966 blogs · [ { "id": "01a08219-587f-709c-ace6-fc7c9cecbe1a", "title": "Why Swift is introducing a warning for weak captures within nested closures", "url": "https://www.swiftbysundell.com/articles/warning-for-nested-weak-self-closure-captures", "published_at": "2026-08-30T12:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7c9deb06c5", "title": "Swift protocols and the main actor", "url": "https://www.swiftbysundell.com/articles/swift-protocols-and-the-main-actor", "published_at": "2026-07-31T10:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7c9eafbe8b", "title": "Building a design system at Genius Scan", "url": "https://www.swiftbysundell.com/articles/building-a-design-system-at-genius-scan", "published_at": "2025-08-31T13:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7c9f901137", "title": "Deciding between ‘let’ and ‘var’ for Swift struct properties", "url": "https://www.swiftbysundell.com/articles/let-vs-var-for-swift-struct-properties", "published_at": "2025-07-23T11:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7c9fbfba51", "title": "Decoding Swift types that require additional data", "url": "https://www.swiftbysundell.com/articles/decoding-swift-types-that-require-additional-data", "published_at": "2025-06-30T13:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca092a45f", "title": "Tips and tricks for when using SwiftUI’s ViewBuilder", "url": "https://www.swiftbysundell.com/articles/swiftui-viewbuilder-tips-and-tricks", "published_at": "2025-05-30T12:25:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca0c5e85b", "title": "Using Swift’s defer keyword within async and throwing contexts", "url": "https://www.swiftbysundell.com/articles/using-defer-within-async-and-throwing-contexts", "published_at": "2025-04-15T14:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca18a855e", "title": "Modern URL construction in Swift", "url": "https://www.swiftbysundell.com/articles/modern-url-construction-in-swift", "published_at": "2025-03-31T11:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca24e86a0", "title": "Swift by Sundell is back!", "url": "https://www.swiftbysundell.com/special/swift-by-sundell-is-back", "published_at": "2025-03-31T10:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca273e8ef", "title": "SwiftUI views versus modifiers", "url": "https://www.swiftbysundell.com/articles/swiftui-views-versus-modifiers", "published_at": "2023-02-27T10:05:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca3454e7b", "title": "Observing the content offset of a SwiftUI ScrollView", "url": "https://www.swiftbysundell.com/articles/observing-swiftui-scrollview-content-offset", "published_at": "2023-01-30T11:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca3aed78f", "title": "Podcast: “The evolution of Swift”, with special guest Nick Lockwood", "url": "https://www.swiftbysundell.com/podcast/123", "published_at": "2022-12-19T15:05:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca419fcee", "title": "Podcast: “Swift concurrency in practice”, with special guest Ben Scheirman", "url": "https://www.swiftbysundell.com/podcast/122", "published_at": "2022-11-18T19:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca4f393b4", "title": "Combining opaque return types with primary associated types", "url": "https://www.swiftbysundell.com/articles/opaque-return-types-primary-associated-types", "published_at": "2022-11-12T12:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca5c8f3b3", "title": "Podcast: “Responsive and smooth UIs”, with special guest Adam Bell", "url": "https://www.swiftbysundell.com/podcast/121", "published_at": "2022-10-31T17:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca6481eec", "title": "Podcast: “Freelancing and WWDC22 highlights”, with special guest Donny Wals", "url": "https://www.swiftbysundell.com/podcast/120", "published_at": "2022-09-17T15:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca6d735ec", "title": "Podcast: “The role of system design”, with special guest Gui Rambo", "url": "https://www.swiftbysundell.com/podcast/119", "published_at": "2022-08-31T17:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca7d52dfc", "title": "Sponsored: Essential Developer", "url": "https://www.swiftbysundell.com/sponsor/essential-developer-july-2022", "published_at": "2022-07-13T10:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca8961376", "title": "Podcast: “What’s new in SwiftUI in iOS 16?”, with special guest Natalia Panferova", "url": "https://www.swiftbysundell.com/podcast/118", "published_at": "2022-07-11T13:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca89c8c59", "title": "Switching between SwiftUI’s HStack and VStack", "url": "https://www.swiftbysundell.com/articles/switching-between-swiftui-hstack-vstack", "published_at": "2022-07-08T13:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca924902a", "title": "Podcast: “Swift 5.7, generics, and the road to Swift 6”, with special guest Ben Cohen", "url": "https://www.swiftbysundell.com/podcast/117", "published_at": "2022-06-10T15:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca9360ac2", "title": "Using the ‘some’ and ‘any’ keywords to reference generic protocols in Swift 5.7", "url": "https://www.swiftbysundell.com/articles/referencing-generic-protocols-with-some-and-any-keywords", "published_at": "2022-06-08T22:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca9a44207", "title": "Swift 5.7’s new optional unwrapping syntax", "url": "https://www.swiftbysundell.com/articles/swifts-new-shorthand-optional-unwrapping-syntax", "published_at": "2022-06-07T20:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ca9c620f2", "title": "Rendering SwiftUI views within UITableView or UICollectionView cells on iOS 16", "url": "https://www.swiftbysundell.com/articles/rendering-swiftui-views-within-uitableview-or-uicollectionview", "published_at": "2022-06-07T11:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7caac41ea2", "title": "Podcast: “The evolution of SwiftUI”, with special guest Chris Eidhof", "url": "https://www.swiftbysundell.com/podcast/116", "published_at": "2022-05-18T12:55:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cabaef2c8", "title": "Swift by Sundell turns five years old today! Here’s what’s next for the website and the podcast", "url": "https://www.swiftbysundell.com/special/five-years", "published_at": "2022-05-05T14:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cac243844", "title": "Podcast: “A framework and an app”, with special guest Simon Støvring", "url": "https://www.swiftbysundell.com/podcast/115", "published_at": "2022-04-30T17:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cac90c3b9", "title": "Type placeholders in Swift", "url": "https://www.swiftbysundell.com/articles/type-placeholders-in-swift", "published_at": "2022-04-14T10:55:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cac910db8", "title": "Podcast: “Accessibility on Apple’s platforms”, with special guest Sommer Panage", "url": "https://www.swiftbysundell.com/podcast/114", "published_at": "2022-03-21T18:55:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cad0983ea", "title": "Abstract types and methods in Swift", "url": "https://www.swiftbysundell.com/articles/abstract-types-and-methods", "published_at": "2022-03-15T16:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cade378d1", "title": "Sponsor: Judo", "url": "https://www.swiftbysundell.com/sponsor/judo-march-2022", "published_at": "2022-03-08T12:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cae92a9d4", "title": "Basics: Equality", "url": "https://www.swiftbysundell.com/basics/equality", "published_at": "2022-03-04T14:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7caf07aeff", "title": "Podcast: “Where is Swift headed in 2022?”, with special guest JP Simard", "url": "https://www.swiftbysundell.com/podcast/113", "published_at": "2022-02-27T15:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7caf20c666", "title": "Writing testable code when using SwiftUI", "url": "https://www.swiftbysundell.com/articles/writing-testable-code-when-using-swiftui", "published_at": "2022-02-17T17:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cafdef324", "title": "Combining protocols in Swift", "url": "https://www.swiftbysundell.com/articles/combining-protocols-in-swift", "published_at": "2022-02-09T12:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb09a577a", "title": "Memory management when using async/await in Swift", "url": "https://www.swiftbysundell.com/articles/memory-management-when-using-async-await", "published_at": "2022-02-03T13:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb0a0b63a", "title": "Automatically retrying an asynchronous Swift Task", "url": "https://www.swiftbysundell.com/articles/retrying-an-async-swift-task", "published_at": "2022-01-25T16:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb13e0826", "title": "Backgrounds and overlays in SwiftUI", "url": "https://www.swiftbysundell.com/articles/backgrounds-and-overlays-in-swiftui", "published_at": "2022-01-20T14:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb1f34317", "title": "Basics: Loops", "url": "https://www.swiftbysundell.com/basics/loops", "published_at": "2022-01-13T14:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb2bb2f96", "title": "Creating Combine-compatible versions of async/await-based APIs", "url": "https://www.swiftbysundell.com/articles/creating-combine-compatible-versions-of-async-await-apis", "published_at": "2022-01-05T18:05:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb308c911", "title": "Two ways of capturing self strongly within a closure", "url": "https://www.swiftbysundell.com/articles/two-ways-of-capturing-self-strongly", "published_at": "2022-01-02T18:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb38e2f57", "title": "Podcast: “The 2021 Season Finale”", "url": "https://www.swiftbysundell.com/podcast/112", "published_at": "2021-12-30T21:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb3d9b49c", "title": "Building an asynchronous SwiftUI button", "url": "https://www.swiftbysundell.com/articles/building-an-async-swiftui-button", "published_at": "2021-12-22T16:52:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb48f380d", "title": "Podcast: “Custom rendering”, with special guest James Thomson", "url": "https://www.swiftbysundell.com/podcast/111", "published_at": "2021-12-20T17:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb5684edd", "title": "New Discover page: Concurrency", "url": "https://www.swiftbysundell.com/discover/concurrency", "published_at": "2021-12-16T17:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb58ba673", "title": "Delaying an asynchronous Swift Task", "url": "https://www.swiftbysundell.com/articles/delaying-an-async-swift-task", "published_at": "2021-12-13T14:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb5ec8335", "title": "Lightweight dependency injection and unit testing using async functions", "url": "https://www.swiftbysundell.com/articles/dependency-injection-and-unit-testing-using-async-await", "published_at": "2021-12-09T12:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb6098c49", "title": "Podcast: “Concurrency beyond app development”, with special guest Tim Condon", "url": "https://www.swiftbysundell.com/podcast/110", "published_at": "2021-12-06T14:55:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb6c14f97", "title": "What role do Tasks play within Swift’s concurrency system?", "url": "https://www.swiftbysundell.com/articles/the-role-tasks-play-in-swift-concurrency", "published_at": "2021-12-02T16:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb77db185", "title": "Swift actors: How do they work, and what kinds of problems do they solve?", "url": "https://www.swiftbysundell.com/articles/swift-actors", "published_at": "2021-11-24T17:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb84adc25", "title": "Podcast: “Code maintenance”, with special guest Nick Lockwood", "url": "https://www.swiftbysundell.com/podcast/109", "published_at": "2021-11-22T17:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb89b8f84", "title": "Unit testing Swift code that uses async/await", "url": "https://www.swiftbysundell.com/articles/unit-testing-code-that-uses-async-await", "published_at": "2021-11-16T12:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cb924360a", "title": "Using count vs isEmpty to check whether a collection contains any elements", "url": "https://www.swiftbysundell.com/articles/count-vs-isEmpty", "published_at": "2021-11-11T13:05:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cba018288", "title": "Building async and concurrent versions of forEach and map", "url": "https://www.swiftbysundell.com/articles/async-and-concurrent-forEach-and-map", "published_at": "2021-11-10T15:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbad5cf3f", "title": "Podcast: “Concurrency and Swift-DocC”, with special guest Marin Todorov", "url": "https://www.swiftbysundell.com/podcast/108", "published_at": "2021-11-04T18:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbafb80d6", "title": "Using Swift’s concurrency system to run multiple tasks in parallel", "url": "https://www.swiftbysundell.com/articles/swift-concurrency-multiple-tasks-in-parallel", "published_at": "2021-11-03T13:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbb7b580e", "title": "Podcast: “UIKit in 2021”, with special guest Ben Scheirman", "url": "https://www.swiftbysundell.com/podcast/107", "published_at": "2021-10-30T13:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbc08a6fa", "title": "Making async system APIs backward compatible", "url": "https://www.swiftbysundell.com/articles/making-async-system-apis-backward-compatible", "published_at": "2021-10-28T17:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbcb31dca", "title": "Swift’s new concurrency system gains backward compatibility in Xcode 13.2", "url": "https://www.swiftbysundell.com/special/swift-concurrency-backward-compatibility", "published_at": "2021-10-27T19:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbd0693fb", "title": "New Discover page: Generics", "url": "https://www.swiftbysundell.com/discover/generics", "published_at": "2021-10-25T15:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbe0360fd", "title": "Specialized extensions using generic type constraints", "url": "https://www.swiftbysundell.com/articles/specialized-extensions-using-generic-type-constraints", "published_at": "2021-10-21T16:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbe1c1eba", "title": "Building editable lists with SwiftUI", "url": "https://www.swiftbysundell.com/articles/building-editable-swiftui-lists", "published_at": "2021-10-14T16:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbe29dfe4", "title": "Which of the SwiftUI APIs introduced in iOS 15 are backward compatible?", "url": "https://www.swiftbysundell.com/articles/swiftui-ios15-backward-compatibility", "published_at": "2021-10-10T16:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbea7514d", "title": "Podcast: “Opportunities for optimization”, with special guest Christian Selig", "url": "https://www.swiftbysundell.com/podcast/106", "published_at": "2021-10-07T12:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cbf737d04", "title": "Programmatic navigation in SwiftUI", "url": "https://www.swiftbysundell.com/articles/swiftui-programmatic-navigation", "published_at": "2021-10-01T14:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc00e1a65", "title": "Podcast: “Building various kinds of editors”, with special guest Marcin Krzyzanowski", "url": "https://www.swiftbysundell.com/podcast/105", "published_at": "2021-09-28T17:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc062864e", "title": "Previewing SwiftUI views in landscape", "url": "https://www.swiftbysundell.com/articles/previewing-swiftui-views-in-landscape", "published_at": "2021-09-25T15:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc0805658", "title": "Using Combine’s share operator to avoid duplicate work", "url": "https://www.swiftbysundell.com/articles/using-combines-share-operator-to-avoid-duplicate-work", "published_at": "2021-09-17T15:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc105b78a", "title": "New Discover page: Codable", "url": "https://www.swiftbysundell.com/discover/codable", "published_at": "2021-09-16T13:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc1bacb9c", "title": "Codable synthesis for Swift enums", "url": "https://www.swiftbysundell.com/articles/codable-synthesis-for-swift-enums", "published_at": "2021-09-09T15:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc2080a2f", "title": "Sponsor: Paste", "url": "https://www.swiftbysundell.com/sponsor/paste-september-2021", "published_at": "2021-09-06T11:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc2e65465", "title": "Conditional compilation within Swift expressions", "url": "https://www.swiftbysundell.com/articles/conditional-compilation-within-swift-expressions", "published_at": "2021-09-03T10:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc30a50ea", "title": "Podcast: “The magic of Augmented Reality”, with special guest Roxana Jula", "url": "https://www.swiftbysundell.com/podcast/104", "published_at": "2021-09-02T17:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc33dc4b4", "title": "Async sequences, streams, and Combine", "url": "https://www.swiftbysundell.com/articles/async-sequences-streams-and-combine", "published_at": "2021-08-26T13:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc40b1d32", "title": "Podcast: “What’s new in Swift 5.5”, with special guest Antoine van der Lee", "url": "https://www.swiftbysundell.com/podcast/103", "published_at": "2021-08-23T13:55:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc4eb72df", "title": "Using static protocol APIs to create conforming instances", "url": "https://www.swiftbysundell.com/articles/using-static-protocol-apis-to-create-conforming-instances", "published_at": "2021-08-20T16:05:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc51823b8", "title": "Defining dynamic colors in Swift", "url": "https://www.swiftbysundell.com/articles/defining-dynamic-colors-in-swift", "published_at": "2021-08-15T10:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc5a59879", "title": "Using ‘@unknown default’ within switch statements", "url": "https://www.swiftbysundell.com/articles/using-an-unknown-default-case-within-a-switch-statement", "published_at": "2021-08-06T14:12:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc5e9b54f", "title": "Podcast: “WWDC21, two months later”, with special guest Jordan Morgan", "url": "https://www.swiftbysundell.com/podcast/102", "published_at": "2021-08-02T16:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc63f91ec", "title": "Throwing and asynchronous Swift properties", "url": "https://www.swiftbysundell.com/articles/throwing-async-properties", "published_at": "2021-07-27T15:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc71b9141", "title": "Attaching property wrappers to function arguments", "url": "https://www.swiftbysundell.com/tips/attaching-property-wrappers-to-function-arguments", "published_at": "2021-07-23T11:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc8075412", "title": "Podcast: “Cross-platform SwiftUI”, with special guest Malin Sundberg", "url": "https://www.swiftbysundell.com/podcast/101", "published_at": "2021-07-15T16:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc8ecfad8", "title": "Stroking and filling a SwiftUI shape at the same time", "url": "https://www.swiftbysundell.com/articles/stroking-and-filling-a-swiftui-shape-at-the-same-time", "published_at": "2021-07-13T15:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cc9bc50ff", "title": "Mutating and non-mutating Swift contexts", "url": "https://www.swiftbysundell.com/articles/mutating-and-nonmutating-swift-contexts", "published_at": "2021-07-07T15:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cca6bda2c", "title": "Sponsor: ViRE", "url": "https://www.swiftbysundell.com/sponsor/vire-july-2021", "published_at": "2021-07-05T10:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cca9b8560", "title": "Podcast: “A tower of capabilities”, with special guest Chris Lattner", "url": "https://www.swiftbysundell.com/podcast/100", "published_at": "2021-07-02T15:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccadd2fda", "title": "Dismissing a SwiftUI modal or detail view", "url": "https://www.swiftbysundell.com/articles/dismissing-swiftui-modal-and-detail-views", "published_at": "2021-06-29T12:10:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccb474d0a", "title": "Calling async functions within a Combine pipeline", "url": "https://www.swiftbysundell.com/articles/calling-async-functions-within-a-combine-pipeline", "published_at": "2021-06-25T10:50:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccb736626", "title": "Making SwiftUI views refreshable", "url": "https://www.swiftbysundell.com/articles/making-swiftui-views-refreshable", "published_at": "2021-06-24T12:30:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccbd3b701", "title": "Basics: Availability checks", "url": "https://www.swiftbysundell.com/basics/availability", "published_at": "2021-06-23T15:12:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccbde6b5a", "title": "Customizing how an external Swift type is encoded or decoded", "url": "https://www.swiftbysundell.com/articles/customizing-how-a-type-is-encoded-or-decoded", "published_at": "2021-06-22T13:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccc40900d", "title": "Connecting async/await to other Swift code", "url": "https://www.swiftbysundell.com/articles/connecting-async-await-with-other-swift-code", "published_at": "2021-06-21T17:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccc466f65", "title": "Automatic conversions between Double and CGFloat values in Swift 5.5", "url": "https://www.swiftbysundell.com/tips/double-cgfloat-auto-conversions", "published_at": "2021-06-15T15:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccc816a6e", "title": "Using the MainActor attribute to automatically dispatch UI updates on the main queue", "url": "https://www.swiftbysundell.com/articles/the-main-actor-attribute", "published_at": "2021-06-13T14:45:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccd67d0d9", "title": "Podcast: “Structured concurrency”, with special guest Doug Gregor", "url": "https://www.swiftbysundell.com/podcast/99", "published_at": "2021-06-11T15:00:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cce29daaa", "title": "First looks at the new APIs and frameworks announced at WWDC21 on WWDC by Sundell & Friends", "url": "https://wwdcbysundell.com", "published_at": "2021-06-10T11:15:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7cceb3e440", "title": "A Swift developer’s WWDC dreams - 2021 edition", "url": "https://www.swiftbysundell.com/articles/a-swift-developers-wwdc-dreams-2021", "published_at": "2021-06-03T19:40:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccebe69f9", "title": "Podcast: “An entire spectrum of apps”, with special guest Sean Allen", "url": "https://www.swiftbysundell.com/podcast/98", "published_at": "2021-05-31T16:35:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccf0e245d", "title": "Avoiding problematic cases when using Swift enums", "url": "https://www.swiftbysundell.com/articles/avoiding-problematic-enum-cases-in-swift", "published_at": "2021-05-27T14:20:00+00:00" }, { "id": "01a08219-587f-709c-ace6-fc7ccfe2fae9", "title": "Podcast: “Anything can happen during WWDC”, with special guest Ish ShaBazz", "url": "https://www.swiftbysundell.com/podcast/97", "published_at": "2021-05-21T17:20:00+00:00" } ] posts Claim your blog
Back to Swift by Sundell
Blog · corpus.blog/blogs/swiftbysundell.com/posts

Swift by Sundell

swiftbysundell.com

2026

2025

2023

2022

2021