{
    "componentChunkName": "component---src-templates-article-js",
    "path": "/swiftui-navigationpath/",
    "result": {"data":{"marmot":{"childImageSharp":{"image":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/4c04ce86827157b8dc91916e6ccdf3a7/7ab40/marmot.png","srcSet":"/static/4c04ce86827157b8dc91916e6ccdf3a7/7961d/marmot.png 15w,\n/static/4c04ce86827157b8dc91916e6ccdf3a7/53973/marmot.png 30w,\n/static/4c04ce86827157b8dc91916e6ccdf3a7/7ab40/marmot.png 60w,\n/static/4c04ce86827157b8dc91916e6ccdf3a7/1d8cc/marmot.png 120w","sizes":"(min-width: 60px) 60px, 100vw"},"sources":[{"srcSet":"/static/4c04ce86827157b8dc91916e6ccdf3a7/f57b3/marmot.webp 15w,\n/static/4c04ce86827157b8dc91916e6ccdf3a7/bde72/marmot.webp 30w,\n/static/4c04ce86827157b8dc91916e6ccdf3a7/927d1/marmot.webp 60w,\n/static/4c04ce86827157b8dc91916e6ccdf3a7/2aa79/marmot.webp 120w","type":"image/webp","sizes":"(min-width: 60px) 60px, 100vw"}]},"width":60,"height":60}}},"coffee":{"childImageSharp":{"image":{"layout":"constrained","backgroundColor":"#080808","images":{"fallback":{"src":"/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/d342f/coffee.png","srcSet":"/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/88c68/coffee.png 10w,\n/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/f2806/coffee.png 20w,\n/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/d342f/coffee.png 40w,\n/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/a0e9d/coffee.png 80w","sizes":"(min-width: 40px) 40px, 100vw"},"sources":[{"srcSet":"/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/f01d4/coffee.webp 10w,\n/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/49960/coffee.webp 20w,\n/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/93d34/coffee.webp 40w,\n/static/0fe073b8b1b4eb2cb0cd8e1e99a48810/0106e/coffee.webp 80w","type":"image/webp","sizes":"(min-width: 40px) 40px, 100vw"}]},"width":40,"height":80}}},"mdx":{"frontmatter":{"title":"How to use NavigationPath for routing in SwiftUI","titleSeo":null,"subtitle":"Learn how to manage navigation in SwiftUI programmatically.","tags":["navigation","design patterns","architecture","swiftui"],"date":"09 Jun 2024","dateUpdated":null,"datePublished":"2024-06-09","dateModified":null,"readingTime":5,"excerpt":"Discover how to use NavigationPath in SwiftUI to manage navigation and routing programmatically."},"slug":"swiftui-navigationpath","body":"var _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"How to use NavigationPath for routing in SwiftUI\",\n  \"subtitle\": \"Learn how to manage navigation in SwiftUI programmatically.\",\n  \"date\": \"2024-06-09T00:00:00.000Z\",\n  \"tags\": [\"navigation\", \"design patterns\", \"architecture\", \"swiftui\"],\n  \"imageCredits\": null,\n  \"excerpt\": \"Discover how to use NavigationPath in SwiftUI to manage navigation and routing programmatically.\",\n  \"readingTime\": 5\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"With \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NavigationPath\"), \", SwiftUI provides a robust and flexible way to handle navigation and routing. It allows us to programmatically control the navigation stack without the need to use a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NavigationLink\"), \".\"), mdx(\"p\", null, \"In this article, we'll explore how to use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NavigationPath\"), \" in a practical example.\"), mdx(\"p\", null, \"Let's jump in.\"), mdx(\"affiliateView\", {\n    type: \"sponsor\"\n  }), mdx(\"p\", null, \"When creating a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NavigationStack\"), \", we have the possibility to pass in a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"path\"), \" parameter:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"struct SomeView: View {\\n\\n    @State private var navigationPath = NavigationPath()\\n\\n    var body: some View {\\n        NavigationStack(path: $navigationPath) {\\n            ...\\n        }\\n    }\\n}\\n\")), mdx(\"p\", null, \"The passed in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"path\"), \" is a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Binding\"), \" to the navigation state for this stack - enabling us to control the navigation stack by appending data to it:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"navigationPath.append(route)\\n\")), mdx(\"p\", null, \"Let's say, we are building an app which can navigate to a recipes search - which in turn can navigate to a recipe detail when a user selects one of the results.\"), mdx(\"p\", null, \"The approach to control this flow could look as follows:\"), mdx(\"h3\", null, \"1. Defining an enum which represents all possible navigation routes\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"enum Route: Hashable {\\n    case recipesSearch\\n    case recipeDetail(recipe: Recipe)\\n}\\n\")), mdx(\"p\", null, \"We don't explicitly need it to use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"NavigationPath\"), \", but I personally find it really helpful to have explicitly defined navigation routes.\"), mdx(\"h3\", null, \"2. Creating an \", mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"Observable\"), \" router which holds the navigation path\"), mdx(\"p\", null, \"To be able to access the same navigation path from different views, we create a router as an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Observable\"), \" which holds the reference to the navigation path and provides a utility function for navigation:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"@Observable\\nclass Router {\\n    var navigationPath = NavigationPath()\\n\\n    func navigateTo(route: Route) {\\n        navigationPath.append(route)\\n    }\\n}\\n\")), mdx(\"h3\", null, \"3. Passing in the router as an environment object to all subviews\"), mdx(\"p\", null, \"For a subview to be able to access and use our created router, we pass it in as an environment object:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"struct MainView: View {\\n    @State private var router = RecipesRouter()\\n\\n    var body: some View {\\n        NavigationStack(path: $router.navigationPath) {\\n            RecipesFeedView()\\n                .environment(router)\\n        }\\n    }\\n}\\n\")), mdx(\"h3\", null, \"4. Defining a navigation destination for possible routes\"), mdx(\"p\", null, \"As a next step, we define a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"navigationDestination\"), \" for each of our routes by providing views a specific route should navigate to:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"RecipesFeedView()\\n    .environment(router)\\n    .navigationDestination(for: RecipesRouter.Route.self) { route in\\n        switch route {\\n        case .recipesSearch:\\n            RecipesSearchView()\\n                .environment(router)\\n        case .recipeDetail(let recipe):\\n            RecipeDetailView(recipe: recipe)\\n                .environment(router)\\n        }\\n    }\\n\")), mdx(\"h3\", null, \"5. Using router where needed\"), mdx(\"p\", null, \"Finally, we can use the router for navigation anywhere we need by accessing it tough the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"@Environment\"), \" property wrapper:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"struct RecipesFeedView: View {\\n    @Environment(RecipesRouter.self) var router\\n\\n    var body: some View {\\n        ...\\n        Button(action: {\\n            router.navigateTo(route: .recipesSearch)\\n        }, label: {\\n            Image(systemName: \\\"magnifyingglass\\\")\\n        })\\n    }\\n}\\n\")));\n}\n;\nMDXContent.isMDXComponent = true;","fields":{"contentType":"article"}},"articles":{"nodes":[{"frontmatter":{"title":"Making custom SwiftUI controls accessible with accessibilityRepresentation","titleSeo":null,"subtitle":"Learn how to give a custom control the accessibility behavior of a native SwiftUI control.","date":"19 Oct 2026","dateUpdated":null,"tags":["accessibility","swiftui","ios"],"readingTime":5},"slug":"ios-accessibility-representation-custom-controls","id":"1dc88aa9-952d-5a6e-bcde-6ebfe153d90c"},{"frontmatter":{"title":"Supporting Differentiate Without Color in SwiftUI","titleSeo":null,"subtitle":"Learn how to communicate status with symbols and shapes instead of relying on color alone.","date":"12 Oct 2026","dateUpdated":null,"tags":["accessibility","swiftui","ios"],"readingTime":4},"slug":"ios-accessibility-differentiate-without-color","id":"42f2790c-75d0-5eb7-80f3-0a42729d1243"},{"frontmatter":{"title":"Adapting SwiftUI layouts for large Dynamic Type sizes","titleSeo":null,"subtitle":"Learn how to restructure SwiftUI layouts when larger accessibility text sizes leave too little room for content.","date":"05 Oct 2026","dateUpdated":null,"tags":["accessibility","swiftui","ios"],"readingTime":5},"slug":"ios-accessibility-dynamic-type-layouts","id":"0ad39580-250f-5df2-a31f-6a63523089e7"},{"frontmatter":{"title":"Automating accessibility audits for SwiftUI apps with XCTest","titleSeo":null,"subtitle":"Learn how to detect common accessibility issues automatically as part of a UI test suite.","date":"28 Sep 2026","dateUpdated":null,"tags":["accessibility","swiftui","testing","xcode","ios"],"readingTime":5},"slug":"ios-accessibility-automated-audits","id":"ca9706b4-45fe-54b4-ba56-63f8a3b7f28e"},{"frontmatter":{"title":"Parameterized tests and test organization with Swift Testing","titleSeo":null,"subtitle":"Learn how to cover multiple inputs with parameterized tests and organize a growing Swift Testing test suite.","date":"21 Sep 2026","dateUpdated":null,"tags":["testing","swift","ios"],"readingTime":7},"slug":"testing-swift-testing-parameterized-tests","id":"1408a205-52d5-58ed-a488-db26610ce3e8"},{"frontmatter":{"title":"Building responsive and reliable search in SwiftUI","titleSeo":null,"subtitle":"Learn how to debounce search input, cancel obsolete requests and prevent stale results using Swift concurrency.","date":"14 Sep 2026","dateUpdated":null,"tags":["swiftui","swift","concurrency","async/await","ios"],"readingTime":6},"slug":"swiftui-responsive-race-free-debounce-search","id":"521bd458-a998-57bd-a4d0-bfe6d56c4cd1"},{"frontmatter":{"title":"Getting started with Live Activities in SwiftUI","titleSeo":null,"subtitle":"Build a public transport journey tracker for the Lock Screen and Dynamic Island with ActivityKit.","date":"07 Sep 2026","dateUpdated":null,"tags":["activitykit","widgetkit","swiftui","swift","ios"],"readingTime":7},"slug":"activitykit-live-activities-swiftui","id":"07465b71-89da-5051-9670-ff4b2e007259"},{"frontmatter":{"title":"Managing toolbar visibility and overflow in SwiftUI","titleSeo":null,"subtitle":"Learn how to prioritize, pin and move SwiftUI toolbar actions into an overflow menu.","date":"31 Aug 2026","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-toolbar-visibility-overflow","id":"45469b50-933a-56f4-a3a5-2c550411f29d"},{"frontmatter":{"title":"Presenting alerts and confirmation dialogs from identifiable data in SwiftUI","titleSeo":null,"subtitle":"Learn how to present alerts and confirmation dialogs using optional identifiable items instead of Boolean state.","date":"24 Aug 2026","dateUpdated":null,"tags":["swiftui","property wrappers","swift","ios"],"readingTime":4},"slug":"swiftui-alert-identifiable-data","id":"3c426685-cce1-5478-925d-ce649e8fe309"},{"frontmatter":{"title":"Adding swipe actions to any SwiftUI scroll view","titleSeo":null,"subtitle":"Learn how to use swipe actions outside of List in SwiftUI.","date":"17 Aug 2026","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-scrollview-swipe-actions","id":"ab384fdb-9fe2-5ba4-9690-31ba8995c8b3"},{"frontmatter":{"title":"Managing focus in SwiftUI with FocusState","titleSeo":null,"subtitle":"Learn how to observe, move, and remove focus in SwiftUI views.","date":"10 Aug 2026","dateUpdated":null,"tags":["property wrappers","swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-focus-state","id":"70c54a71-6804-53ec-856c-48cc51c6d6e3"},{"frontmatter":{"title":"Building a reusable API client with URLSession in Swift","titleSeo":null,"subtitle":"Learn how to structure networking code with URLSession, async/await, response validation, and JSON decoding.","date":"02 Aug 2026","dateUpdated":null,"tags":["async/await","networking","swift"],"readingTime":7},"slug":"swift-urlsession","id":"fc4a3c94-2f08-5758-98ac-85b11fa92c7d"},{"frontmatter":{"title":"Understanding code signing and provisioning in iOS","titleSeo":null,"subtitle":"Learn how certificates, App IDs, entitlements, and provisioning profiles work together.","date":"24 Jul 2026","dateUpdated":null,"tags":["app distribution","continuous integration","ios"],"readingTime":8},"slug":"ios-code-signing-provisioning","id":"0a909ccb-c91f-54bf-90ef-113c0817d636"},{"frontmatter":{"title":"Building widgets with WidgetKit and SwiftUI","titleSeo":null,"subtitle":"Learn how to create widgets for an iOS application with WidgetKit and SwiftUI.","date":"20 Jul 2026","dateUpdated":null,"tags":["widgetkit","swiftui","swift","ios"],"readingTime":8},"slug":"widgetkit-building-widgets-with-swiftui","id":"4b434db0-3d90-5d5b-bc6d-24065c39a6b9"},{"frontmatter":{"title":"Keeping SwiftData behind a boundary","titleSeo":null,"subtitle":"Learn how to keep SwiftData out of SwiftUI views.","date":"13 Jul 2026","dateUpdated":null,"tags":["swiftdata","architecture","swift","ios"],"readingTime":5},"slug":"swiftdata-persistence-boundaries","id":"d1226d6b-5e11-5e93-94fa-ceff38a476d7"},{"frontmatter":{"title":"Understanding Sendable in Swift","titleSeo":null,"subtitle":"Learn what Sendable means in Swift concurrency and how it helps prevent data races.","date":"06 Jul 2026","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":8},"slug":"swift-concurrency-sendable","id":"688e00d1-70b6-5d9a-a325-a8a8ba836f0f"},{"frontmatter":{"title":"Understanding privacy manifests in iOS","titleSeo":null,"subtitle":"Learn what privacy manifests are and how they relate to third-party SDKs and required reason APIs.","date":"29 Jun 2026","dateUpdated":null,"tags":["security","xcode","ios"],"readingTime":6},"slug":"ios-privacy-manifests","id":"f5407a77-a5d4-5177-8e9e-39567e75fb29"},{"frontmatter":{"title":"Getting started with Apple's Foundation Models framework","titleSeo":null,"subtitle":"Learn what Apple's Foundation Models framework is, how it works, and when to use it.","date":"22 Jun 2026","dateUpdated":null,"tags":["ai","swift","ios"],"readingTime":5},"slug":"foundation-models-getting-started","id":"e847eaa4-cfb6-5133-8a46-580e49d93b3c"},{"frontmatter":{"title":"Async cleanup with defer in Swift","titleSeo":null,"subtitle":"Learn how to perform asynchronous cleanup operations using Swift's async defer support.","date":"14 Jun 2026","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":3},"slug":"swift-defer-async","id":"2add294f-a8dc-5b38-96ab-e869b481594d"},{"frontmatter":{"title":"Understanding composition in SwiftUI","titleSeo":null,"subtitle":"Understand how SwiftUI builds and represents view hierarchies.","date":"08 Jun 2026","dateUpdated":null,"tags":["design patterns","architecture","swiftui"],"readingTime":7},"slug":"swiftui-understanding-composition","id":"10718b0d-6417-5443-a20c-fb816aee5914"},{"frontmatter":{"title":"Registering for push notifications in SwiftUI","titleSeo":null,"subtitle":"Learn how to request notification permissions and register for remote notifications in a SwiftUI app.","date":"01 Jun 2026","dateUpdated":null,"tags":["notifications","swiftui","swift","ios"],"readingTime":7},"slug":"ios-notifications-registering-in-swiftui","id":"d12852cf-5377-57fc-a707-6428d32a083b"},{"frontmatter":{"title":"Working with the Keychain in iOS","titleSeo":null,"subtitle":"Learn how to securely store sensitive data using Apple’s Keychain Services API.","date":"25 May 2026","dateUpdated":null,"tags":["security","swift","ios"],"readingTime":6},"slug":"ios-keychain-secure-data-storage","id":"d2730f23-f85c-5c98-b731-2cdc2b96a3b8"},{"frontmatter":{"title":"Understanding basic animations in SwiftUI","titleSeo":null,"subtitle":"Learn how to animate state changes in SwiftUI views.","date":"17 May 2026","dateUpdated":null,"tags":["swiftui","animations","swift","ios"],"readingTime":4},"slug":"swiftui-basic-animations","id":"6608a554-2392-586f-87fd-e0fc2cf85e95"},{"frontmatter":{"title":"How to present a local HTML file in SwiftUI","titleSeo":null,"subtitle":"Learn how to show a locally stored HTML file with WebView and WKWebView","date":"04 May 2026","dateUpdated":null,"tags":["webkit","swiftui","swift","ios"],"readingTime":7},"slug":"swiftui-present-local-html-files","id":"9c7f6265-699e-53b8-b76b-e84086767a64"},{"frontmatter":{"title":"How to implement pagination with SwiftUI's List view","titleSeo":null,"subtitle":"Learn how to implement infinite scrolling with SwiftUI.","date":"27 Apr 2026","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":5},"slug":"swiftui-list-pagination","id":"531f3516-3bab-59a9-87d3-743f2bcd79d9"},{"frontmatter":{"title":"Building a draggable bottom sheet in SwiftUI","titleSeo":null,"subtitle":"Learn how to build a draggable bottom sheet using presentation detents.","date":"20 Apr 2026","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":5},"slug":"swiftui-draggable-bottom-sheet","id":"a56ba783-76ea-50d1-8e31-a5983577f3b0"},{"frontmatter":{"title":"How to test in-app purchases locally using StoreKit","titleSeo":null,"subtitle":"A practical guide to simulating in-app purchases and subscriptions in Xcode.","date":"08 Apr 2026","dateUpdated":null,"tags":["storekit","testing","swift","ios"],"readingTime":6},"slug":"testing-in-app-purchases-locally-storekit","id":"d643509d-2836-57a8-ab3e-740f6fe97af5"},{"frontmatter":{"title":"Working with files and directories in iOS","titleSeo":null,"subtitle":"Understanding the app sandbox and how to access system directories.","date":"06 Apr 2026","dateUpdated":null,"tags":["file system","persistence","swift","ios"],"readingTime":6},"slug":"ios-file-system-overview","id":"bc360af9-9f7e-52b1-85a4-fd248515fd51"},{"frontmatter":{"title":"Changing runtime state with LLDB while debugging iOS apps","titleSeo":null,"subtitle":"Learn how to use LLDB's expr command to modify variables at runtime.","date":"30 Mar 2026","dateUpdated":null,"tags":["lldb","testing","xcode","ios"],"readingTime":5},"slug":"lldb-changing-variables-while-debugging","id":"b9ae7f01-e01f-5b5e-9608-fede21a69dc9"},{"frontmatter":{"title":"Migrating to String Catalogs in iOS","titleSeo":null,"subtitle":"Learn about migration strategies from Localizable.strings to .xcstrings.","date":"23 Mar 2026","dateUpdated":null,"tags":["localization","swift","ios"],"readingTime":3},"slug":"ios-string-catalogs-migration","id":"07a872a4-2fe7-53f3-bae1-06c58fef28d7"},{"frontmatter":{"title":"Working with String Catalogs in iOS projects","titleSeo":null,"subtitle":"Practical tips, limitations, and best practices for localization with .xcstrings files.","date":"16 Mar 2026","dateUpdated":null,"tags":["localization","swift","ios"],"readingTime":6},"slug":"ios-string-catalogs-in-practice","id":"640d8191-6d3b-5ffc-ad6b-be9b76f10d56"},{"frontmatter":{"title":"How to use custom names for Swift properties when decoding JSON data","titleSeo":null,"subtitle":"Learn how to map JSON keys to differently named Swift properties using CodingKeys.","date":"09 Mar 2026","dateUpdated":null,"tags":["json","networking","swift","ios"],"readingTime":2},"slug":"swift-json-decoding-custom-names","id":"0701b8ee-1ff4-576a-ada7-917eb3321058"},{"frontmatter":{"title":"Implementing Passkeys in iOS with AuthenticationServices","titleSeo":null,"subtitle":"A practical introduction to passwordless authentication using passkeys on iOS.","date":"02 Mar 2026","dateUpdated":null,"tags":["authentication","security","swift","ios"],"readingTime":7},"slug":"ios-authentication-passkeys","id":"e8e05088-9c61-5e83-a151-848aa6260705"},{"frontmatter":{"title":"Preventing forgotten database migrations with automated tests in iOS","titleSeo":null,"subtitle":"Learn how to automatically detect migration errors before shipping.","date":"22 Feb 2026","dateUpdated":null,"tags":["testing","persistence","core data","swiftdata"],"readingTime":7},"slug":"testing-database-migrations","id":"62641f73-9a16-5c47-b018-7640253fddea"},{"frontmatter":{"title":"How to build a simple CLI tool using Swift","titleSeo":null,"subtitle":"Create small automation tools with Swift and ArgumentParser.","date":"16 Feb 2026","dateUpdated":null,"tags":["scripting","automation","swift package manager","swift"],"readingTime":7},"slug":"swift-cli-scripting","id":"8b4f3eb4-9549-55d4-8b57-326cb68bd6c3"},{"frontmatter":{"title":"How to use SwiftUI Coordinators to communicate with UIKit","titleSeo":null,"subtitle":"Bridging UIKit delegates and events back into SwiftUI.","date":"09 Feb 2026","dateUpdated":null,"tags":["swiftui","uikit","swift","ios"],"readingTime":5},"slug":"swiftui-coordinators","id":"4ab372a6-58b4-523b-95b5-8761229aa658"},{"frontmatter":{"title":"Migrating to the Observation framework in SwiftUI","titleSeo":null,"subtitle":"Learn how to use SwiftUI's @Observable macro.","date":"02 Feb 2026","dateUpdated":null,"tags":["observation","swiftui","property wrappers","swift","ios"],"readingTime":5},"slug":"swiftui-observation-migrating-to-observation","id":"156f1df0-098e-5a2d-abbc-a131553aa653"},{"frontmatter":{"title":"A visual cheat sheet of Combine operators","titleSeo":null,"subtitle":"A diagram-based reference for common Combine publisher operators.","date":"26 Jan 2026","dateUpdated":null,"tags":["combine","reactive programming","swift"],"readingTime":5},"slug":"combine-operators-cheatsheet","id":"f8c9cc85-b8e0-542c-ba2c-fbd703af85fa"},{"frontmatter":{"title":"How to use String Catalogs for pluralization in Swift","titleSeo":null,"subtitle":"Learn how to handle plural forms correctly with String Catalogs.","date":"19 Jan 2026","dateUpdated":null,"tags":["localization","swift","ios"],"readingTime":3},"slug":"ios-string-catalogs-pluralization","id":"ec4b77ed-8ad2-511c-9c3d-5246d576287a"},{"frontmatter":{"title":"Memory management in Combine","titleSeo":null,"subtitle":"Understand how retain cycles appear and when they turn into memory leaks in Combine.","date":"12 Jan 2026","dateUpdated":null,"tags":["combine","reactive programming","swift"],"readingTime":5},"slug":"combine-memory-management","id":"5067fcfe-63fa-51ee-9567-d69837abae22"},{"frontmatter":{"title":"Storing Swift structs in UserDefaults","titleSeo":null,"subtitle":"Why Codable works but often isn't the best choice.","date":"05 Jan 2026","dateUpdated":null,"tags":["swift","persistence","ios"],"readingTime":4},"slug":"swift-user-defaults-storing-structs","id":"59dd8978-13c5-5011-bd29-4b32b08a1542"},{"frontmatter":{"title":"Understanding date decoding strategies when working with JSON in Swift","titleSeo":null,"subtitle":"Learn how Swift decodes dates and how to handle real-world formats.","date":"29 Dec 2025","dateUpdated":null,"tags":["json","networking","swift","ios"],"readingTime":2},"slug":"swift-json-date-decoding-encoding","id":"b51153c7-3dd9-5727-9bff-ad6852d28d46"},{"frontmatter":{"title":"Understanding SwiftUI's Grid container","titleSeo":null,"subtitle":"Learn how to arrange views in a two-dimensional layout.","date":"22 Dec 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-grid-container","id":"1dfed558-3d0e-5982-831f-64207e522900"},{"frontmatter":{"title":"Adding text input actions to iOS push and local notifications","titleSeo":null,"subtitle":"Learn how to let users reply directly inside a notification.","date":"15 Dec 2025","dateUpdated":null,"tags":["notifications","swift","ios"],"readingTime":4},"slug":"ios-notifications-textinput","id":"c1307c5c-f782-5c9b-9bc7-9d6ad2385141"},{"frontmatter":{"title":"How to avoid retain cycles when working with tasks in Swift","titleSeo":null,"subtitle":"Understanding memory management in Swift concurrency.","date":"08 Dec 2025","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":4},"slug":"swift-async-tasks-memory-management","id":"bc2c7e1f-4a77-5011-983c-8576b383192e"},{"frontmatter":{"title":"Understanding associated domains in iOS","titleSeo":null,"subtitle":"Learn how to configure associated domains for universal links, shared web credentials or app clips.","date":"01 Dec 2025","dateUpdated":null,"tags":["associated domains","security","ios"],"readingTime":5},"slug":"ios-associated-domains-basics","id":"fa12914b-ef7b-55b4-becf-0ce46c2f6489"},{"frontmatter":{"title":"Using associated domains alternate mode during development","titleSeo":null,"subtitle":"How to test AASA files without waiting for Apple's CDN.","date":"24 Nov 2025","dateUpdated":null,"tags":["associated domains","ios"],"readingTime":2},"slug":"ios-associated-domains-alternate-mode","id":"a10f6dc3-6a3e-5e64-ba64-539475d2f86a"},{"frontmatter":{"title":"Bridging completion handlers to Swift's async/await","titleSeo":null,"subtitle":"Learn how to adapt completion-based APIs to Swift's concurrency model using continuations.","date":"17 Nov 2025","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":4},"slug":"swift-async-completions-to-async-await","id":"a64671b1-9090-5fd0-b925-1d134117493d"},{"frontmatter":{"title":"Transforming AsyncStream with Swift Async Algorithms","titleSeo":null,"subtitle":"Bringing Combine-like operators to Swift concurrency.","date":"10 Nov 2025","dateUpdated":null,"tags":["async/await","reactive programming","concurrency","swift"],"readingTime":6},"slug":"swift-async-algorithms-asyncstream","id":"ea37f1d0-30af-59ea-98f7-4c156cda2a30"},{"frontmatter":{"title":"Understanding Task and Task.detached in Swift concurrency","titleSeo":null,"subtitle":"Learn the what the differences are between Task and Task.detached in Swift.","date":"02 Nov 2025","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":6},"slug":"swift-async-task-vs-task-detached","id":"8532c765-a2e0-5d1e-a5cb-68c14a617ad7"},{"frontmatter":{"title":"Understanding task cancellation and lifetimes in Swift concurrency","titleSeo":null,"subtitle":"Learn how structured and unstructured tasks behave in Swift's concurrency system.","date":"27 Oct 2025","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":6},"slug":"swift-async-tasks-cancellation","id":"857304ae-cd76-599c-9ed3-c5c230eca624"},{"frontmatter":{"title":"Comparing Combine's subjects with AsyncStream in Swift","titleSeo":null,"subtitle":"Exploring how Swift concurrency can handle event streams compared with Combine.","date":"20 Oct 2025","dateUpdated":null,"tags":["async/await","combine","reactive programming","architecture","swift"],"readingTime":8},"slug":"swift-combine-subjects-vs-asyncstream","id":"01a377e0-3e86-5090-9910-f53eca62ebad"},{"frontmatter":{"title":"When SwiftUI automatically applies the glass look and when it doesn’t","titleSeo":null,"subtitle":"Understanding where SwiftUI decides to use the new glass styles automatically.","date":"13 Oct 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-glass-auto-apply","id":"b3b5d0e8-3d6f-54cc-807f-3f872c12e1a7"},{"frontmatter":{"title":"How to add custom actions to iOS push and local notifications in SwiftUI","titleSeo":null,"subtitle":"Learn how to let users respond to notifications without opening the app.","date":"06 Oct 2025","dateUpdated":null,"tags":["notifications","swift","ios"],"readingTime":4},"slug":"ios-notifications-custom-actions","id":"47c09acf-53ab-51cc-9119-006c5a223d52"},{"frontmatter":{"title":"Structuring universal links in iOS","titleSeo":null,"subtitle":"A practical way to parse and route universal links using enums and type-safe navigation.","date":"29 Sep 2025","dateUpdated":null,"tags":["universal links","architecture","navigation","swiftui"],"readingTime":6},"slug":"swiftui-navigation-universal-links-architecture","id":"9853a332-59ed-57d6-b030-c587e47c3583"},{"frontmatter":{"title":"Cancelling async tasks in SwiftUI","titleSeo":null,"subtitle":"Learn how to cancel async work in SwiftUI with automatic and manual approaches.","date":"22 Sep 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":5},"slug":"swiftui-cancel-async-work","id":"51c5ff46-358d-5e75-a2ef-1c96848b6fa3"},{"frontmatter":{"title":"How to manage app lifecycle events in SwiftUI","titleSeo":null,"subtitle":"Discover SwiftUI’s scenePhase environment and how to respond to app state changes.","date":"15 Sep 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-app-lifecycle-events","id":"047f20ca-d0a4-5261-9f86-a17e19b67ebb"},{"frontmatter":{"title":"Understanding SwiftUI's liquid glass button styles","titleSeo":null,"subtitle":"Learn about different ways to apply Apple's glass style.","date":"03 Sep 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-glass-button-style","id":"5dde4a2b-3b59-5992-a8cc-828341d61737"},{"frontmatter":{"title":"Switching Swift Package Manager dependencies between versioned and local development","titleSeo":null,"subtitle":"Quick tip on switching a self-developed Swift package from a versioned dependency to a local path for development.","date":"01 Sep 2025","dateUpdated":null,"tags":["swift package manager","dependency management","swift","ios"],"readingTime":3},"slug":"spm-quick-tip-on-switching-to-local-dev","id":"6163c69c-3b76-559c-b375-c6f979481746"},{"frontmatter":{"title":"How to use async/await in synchronous Swift code with tasks","titleSeo":null,"subtitle":"Learn how to use tasks to call async/await methods from synchronous code.","date":"25 Aug 2025","dateUpdated":null,"tags":["async/await","concurrency","swift","ios"],"readingTime":3},"slug":"swift-await-async-in-synchronious-swift-code-with-tasks","id":"532461bd-a74c-5ae7-99e3-76ae430ab0a7"},{"frontmatter":{"title":"My new book on architecture & design patterns for iOS","titleSeo":null,"subtitle":"I finally finished my new book on building scalable and maintainable apps with Swift and SwiftUI.","date":"19 Aug 2025","dateUpdated":null,"tags":["book","architecture","design patterns","swift","swiftui","ios"],"readingTime":2},"slug":"book-ios-architecture-design-patterns","id":"93455f7a-5b02-58bb-82ad-74969a6fbe8c"},{"frontmatter":{"title":"How to create a custom reusable toolbar in SwiftUI","titleSeo":null,"subtitle":"Learn how to abstract and reuse a SwiftUI toolbar across multiple screens.","date":"12 Aug 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-reusable-toolbar","id":"66a5355b-fa88-5784-b51c-a6e46c86998a"},{"frontmatter":{"title":"How to use the @available attribute in Swift","titleSeo":null,"subtitle":"Learn to make Swift code only available for certain language versions or platforms.","date":"04 Aug 2025","dateUpdated":null,"tags":["swift","ios"],"readingTime":3},"slug":"swift-available-attribute","id":"e0298327-22cf-56c2-86ec-2615940d8387"},{"frontmatter":{"title":"Overview on Accessibility Nutrition Labels for iOS development","titleSeo":null,"subtitle":"Get an overview of what Accessibility Nutrition Labels are and how to support them.","date":"28 Jul 2025","dateUpdated":null,"tags":["accessibility","swiftui","ios"],"readingTime":5},"slug":"ios-accessibility-nutrition-labels","id":"9872a69a-e95e-5687-ab66-0e459c4fe2c1"},{"frontmatter":{"title":"Using defer in Swift to manage state cleanup","titleSeo":null,"subtitle":"Learn how to use defer to handle cleanup logic in async functions.","date":"21 Jul 2025","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":3},"slug":"swift-defer","id":"85ff6d60-e263-5733-b6a8-6694717395bc"},{"frontmatter":{"title":"Supporting Reduced Motion accessibility setting in SwiftUI","titleSeo":null,"subtitle":"Learn how to respect system settings for reduced motion to improve usability for motion-sensitive users.","date":"14 Jul 2025","dateUpdated":null,"tags":["accessibility","swiftui","ios"],"readingTime":3},"slug":"ios-accessibility-reduced-motion","id":"2a15b1ee-e595-563d-8a36-fc6cab9fc2dc"},{"frontmatter":{"title":"Supporting sufficient contrast accessibility with Xcode's Color Contrast Calculator","titleSeo":null,"subtitle":"Quick tip on how to check if colors meet accessibility contrast requirements using Xcode’s built-in tools.","date":"07 Jul 2025","dateUpdated":null,"tags":["accessibility","ios"],"readingTime":4},"slug":"ios-accessibility-contrast","id":"da36c295-9f7c-51cf-8917-f9b3a2a58c08"},{"frontmatter":{"title":"How to support Dynamic Type accessibility in SwiftUI","titleSeo":null,"subtitle":"Learn how to support font scaling for user's custom text size settings.","date":"30 Jun 2025","dateUpdated":null,"tags":["accessibility","swiftui","ios"],"readingTime":4},"slug":"ios-accessibility-dynamic-type","id":"e88c2fb2-58b6-5562-8985-14a0601e0964"},{"frontmatter":{"title":"Using WebKit with SwiftUI to manage web content","titleSeo":null,"subtitle":"Get an overview on how to use WebView and WebPage in SwiftUI.","date":"23 Jun 2025","dateUpdated":null,"tags":["webkit","swiftui","ios"],"readingTime":3},"slug":"swiftui-webkit","id":"8a870ae4-b547-53e3-8e0e-64fc04a9fe63"},{"frontmatter":{"title":"WWDC 2025 summary of Apple's platforms state of the union talk for iOS developers","titleSeo":null,"subtitle":"Discover Apple's announcements for iOS at WWDC 2025.","date":"12 Jun 2025","dateUpdated":null,"tags":["wwdc","ios"],"readingTime":4},"slug":"wwdc-2025-state-of-the-union-summary","id":"2358b923-bdff-5dea-9009-b793371db975"},{"frontmatter":{"title":"Adding navigation buttons to the keyboard in SwiftUI","titleSeo":null,"subtitle":"Learn how to add navigation buttons above the keyboard to switch between text fields in SwiftUI.","date":"08 Jun 2025","dateUpdated":null,"tags":["swiftui","ux","ios"],"readingTime":4},"slug":"swiftui-keyboard-buttons","id":"45a83c49-a249-58dd-8459-ebb991436a67"},{"frontmatter":{"title":"Understanding toolbars in SwiftUI","titleSeo":null,"subtitle":"Learn how to add toolbar items in SwiftUI views across various placements like navigation bars, bottom bars and more.","date":"02 Jun 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-toolbars-guide","id":"769effca-99b7-51ab-9c51-7047ae84a7f9"},{"frontmatter":{"title":"Learn to build adaptive layouts with SwiftUI's ViewThatFits container.","titleSeo":null,"subtitle":"Understand how SwiftUI's ViewThatFits container works.","date":"26 May 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-viewthatfits-container","id":"1724686a-f8e7-5d43-a152-b8b393e32789"},{"frontmatter":{"title":"Understanding LLDB print commands for iOS debugging with Xcode","titleSeo":null,"subtitle":"Learn the difference between po, p, and v to inspect variables in Xcode's console.","date":"19 May 2025","dateUpdated":null,"tags":["lldb","xcode","ios"],"readingTime":4},"slug":"lldb-understanding-print-commands","id":"5b629c46-4690-5dba-978b-4601dab84f66"},{"frontmatter":{"title":"Scheduling notifications with time, calendar, and location triggers in iOS","titleSeo":null,"subtitle":"Learn how to schedule local notifications using different trigger types with the UserNotifications framework.","date":"12 May 2025","dateUpdated":null,"tags":["notifications","swift","ios"],"readingTime":4},"slug":"ios-local-notification-triggers","id":"e4b7e9be-430a-5e04-a872-e3b712702a93"},{"frontmatter":{"title":"Working with Xcode configuration files","titleSeo":null,"subtitle":"Learn how to manage different iOS build environments with .xcconfig files.","date":"05 May 2025","dateUpdated":null,"tags":["xcode","ios","swift"],"readingTime":4},"slug":"xcode-configuration-files","id":"aedf5f70-1185-5a12-ae2b-d1994218813d"},{"frontmatter":{"title":"Creating and managing multiple app environments in Xcode","titleSeo":null,"subtitle":"Learn how to add and configure debug, staging, and release environments in your iOS app using Xcode.","date":"04 May 2025","dateUpdated":null,"tags":["xcode","ios","swift"],"readingTime":4},"slug":"xcode-build-environments","id":"aaabacf7-9be6-58e6-89ab-94d0505e2f69"},{"frontmatter":{"title":"Understanding Xcode targets, schemes and build configurations","titleSeo":null,"subtitle":"Learn the foundational concepts of Xcode build configuration and how targets, schemes, and configurations work together.","date":"03 May 2025","dateUpdated":null,"tags":["xcode","ios","swift"],"readingTime":4},"slug":"xcode-targets-schemes","id":"2d4c41ab-0c34-58af-99d3-67e61a5e2c35"},{"frontmatter":{"title":"Bridging interfaces with the Adapter pattern in Swift","titleSeo":null,"subtitle":"Learn how to use the Adapter pattern to integrate third-party APIs or legacy code.","date":"28 Apr 2025","dateUpdated":null,"tags":["design patterns","architecture","swift"],"readingTime":3},"slug":"swift-design-patterns-adapter","id":"7bbc7262-508a-5b2d-a56b-0cb6e67d8beb"},{"frontmatter":{"title":"How to persist navigation state in SwiftUI","titleSeo":null,"subtitle":"Learn how to save and restore NavigationPath to maintain user context across app launches.","date":"21 Apr 2025","dateUpdated":null,"tags":["navigation","swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-navigation-persist-state","id":"0aae7857-f02c-58fd-b641-3513f90b5f80"},{"frontmatter":{"title":"Using NavigationPath with TabView in SwiftUI","titleSeo":null,"subtitle":"Learn how to integrate NavigationPath with TabView in SwiftUI to manage independent navigation flows.","date":"14 Apr 2025","dateUpdated":null,"tags":["navigation","swiftui","swift","ios"],"readingTime":5},"slug":"swiftui-navigation-path-with-tabview","id":"d5300650-9b36-5dea-9356-17c52b20af7f"},{"frontmatter":{"title":"Testing remote iOS push notifications in a simulator with simctl","titleSeo":null,"subtitle":"Learn how to use the command-line tool simctl to simulate remote notifications in iOS.","date":"06 Apr 2025","dateUpdated":null,"tags":["notifications","testing","swift","ios"],"readingTime":3},"slug":"testing-remote-push-notifications-in-ios-simulator","id":"5d81c1dc-c02e-5893-96cb-13eda2dc575d"},{"frontmatter":{"title":"Building a dependency injection framework","titleSeo":null,"subtitle":"Learn how to create a lightweight dependency injection container in Swift","date":"01 Apr 2025","dateUpdated":null,"tags":["dependency management","property wrappers","swift","swiftui"],"readingTime":7},"slug":"dependency-injection-building-lightweight-container","id":"a77b3ff1-e5e2-5657-b51c-9ef5acd21e11"},{"frontmatter":{"title":"Public-key cryptography with CryptoKit for iOS","titleSeo":null,"subtitle":"Learn how to use CryptoKit to increase security in iOS applications.","date":"24 Mar 2025","dateUpdated":null,"tags":["cryptokit","security","swift","ios"],"readingTime":5},"slug":"cryptokit-public-key-cryptography","id":"5de1e02b-db74-5b0c-8113-18c85e17038f"},{"frontmatter":{"title":"Understanding existentials and primary associated types in Swift","titleSeo":null,"subtitle":"How existentials and primary associated types enhance flexibility in protocols.","date":"17 Mar 2025","dateUpdated":null,"tags":["generics and protocols","swift"],"readingTime":5},"slug":"swift-existentials","id":"63dd6cbb-537a-55c3-9f24-01a2d2fabe09"},{"frontmatter":{"title":"Understanding structural identity in SwiftUI","titleSeo":null,"subtitle":"Learn how SwiftUI optimizes UI updates.","date":"10 Mar 2025","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-structural-identity","id":"a2e921d2-6a9b-55c7-9f98-96063024a3ed"},{"frontmatter":{"title":"Understanding the Bindable property wrapper in SwiftUI","titleSeo":null,"subtitle":"Learn how and when to use @Bindable in SwiftUI.","date":"03 Mar 2025","dateUpdated":null,"tags":["property wrappers","swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-observation-bindable","id":"975af35a-5205-5cbb-983f-22bce4b9e623"},{"frontmatter":{"title":"Quick guide on home screen quick actions for SwiftUI","titleSeo":null,"subtitle":"Learn how to provide users with direct access to app functionality from the home screen.","date":"24 Feb 2025","dateUpdated":null,"tags":["ios","swift","swiftui"],"readingTime":4},"slug":"ios-home-screen-quick-actions","id":"dd9b2faf-9654-512d-b28d-ce1aee5b96f5"},{"frontmatter":{"title":"How to use SceneDelegate in SwiftUI","titleSeo":null,"subtitle":"Learn how to integrate SceneDelegate with a SwiftUI-based application.","date":"17 Feb 2025","dateUpdated":null,"tags":["swiftui","uikit","swift","ios"],"readingTime":5},"slug":"swiftui-scenedelegate","id":"5bff1dab-f314-525c-be3b-4cfae1a11c1a"},{"frontmatter":{"title":"Implementing Face ID authentication in SwiftUI","titleSeo":null,"subtitle":"Learn how to add biometric authentication with passcode fallback to secure your app.","date":"10 Feb 2025","dateUpdated":null,"tags":["authentication","security","swift","swiftui","ios"],"readingTime":5},"slug":"ios-local-authentication","id":"5700ca6e-3f47-57a8-94f3-0cae52f32dba"},{"frontmatter":{"title":"SF Symbols guide for SwiftUI and UIKit","titleSeo":null,"subtitle":"Learn how to use SF Symbols for consistent, scalable icons in iOS.","date":"03 Feb 2025","dateUpdated":null,"tags":["swiftui","uikit","swift","ios"],"readingTime":5},"slug":"ios-sf-symbols","id":"7b1c16b9-cce5-520e-8ce1-e3b2cbce815b"},{"frontmatter":{"title":"Learn to debug iOS features that require app start from external actions in Xcode","titleSeo":null,"subtitle":"How to debug features like deep linking or home screen quick actions.","date":"27 Jan 2025","dateUpdated":null,"tags":["xcode","testing","ios"],"readingTime":2},"slug":"xcode-debugging-app-restart","id":"876d8f0c-b0cd-5077-9993-34085db5a938"},{"frontmatter":{"title":"Customizing the appearance of the NavigationStack title in SwiftUI","titleSeo":null,"subtitle":"Learn how to create a custom navigation bar title view in SwiftUI using NavigationStack.","date":"20 Jan 2025","dateUpdated":null,"tags":["navigation","swiftui","swift","ios"],"readingTime":3},"slug":"switui-navigationstack-customize-title","id":"8ec371e4-fec9-5af0-b785-37c0fc9c202a"},{"frontmatter":{"title":"How to use cryptographic hash functions in CryptoKit for iOS security","titleSeo":null,"subtitle":"Learn how to implement cryptographic hash functions in Swift.","date":"13 Jan 2025","dateUpdated":null,"tags":["cryptokit","security","swift","ios"],"readingTime":3},"slug":"swift-hash-functions","id":"fecd70a8-7f4d-56b2-a431-b48e72e1bb8b"},{"frontmatter":{"title":"Preparing for a technical iOS job interview with questions and answers in 2025 - book preview","titleSeo":null,"subtitle":"An updated book version with a new chapter on Architecture & Design Patterns is now available.","date":"07 Jan 2025","dateUpdated":null,"tags":["book","technical interview","swift","ios"],"readingTime":8},"slug":"book-ios-interview-questions-and-answers-preview","id":"a266efd1-10cf-5654-8c89-2c7d70aa88e4"},{"frontmatter":{"title":"Understanding opaque types and protocols with associatedtype in Swift","titleSeo":null,"subtitle":"Learn how to leverage the some keyword for working with protocols with associated types.","date":"06 Jan 2025","dateUpdated":null,"tags":["generics and protocols","swift"],"readingTime":2},"slug":"swift-opaque-types-protocols-associatedtype","id":"8acd623d-2364-5067-b3fb-c9eb0bb841c2"},{"frontmatter":{"title":"Getting started with UI Testing for SwiftUI","titleSeo":null,"subtitle":"Learn how to create user interface tests with the XCTest framework.","date":"30 Dec 2024","dateUpdated":null,"tags":["testing","swiftui","swift","ios"],"readingTime":4},"slug":"testing-ui-swiftui-xctest-framework","id":"91646ef9-311e-5647-9cae-374ac18c9376"},{"frontmatter":{"title":"Creating a particles snow effect with SpriteKit and SwiftUI","titleSeo":null,"subtitle":"Learn how to create a realistic snow particle effect in SwiftUI using SpriteKit’s particle emitter.","date":"23 Dec 2024","dateUpdated":null,"tags":["spritekit","swiftui","swift","ios"],"readingTime":7},"slug":"spritekit-particles-snow-effect-swiftui","id":"02d18986-199b-58bc-99e1-24a7c1b21188"},{"frontmatter":{"title":"How to unit test async/await functions in Swift","titleSeo":null,"subtitle":"Learn how to write unit tests for async/await functions.","date":"16 Dec 2024","dateUpdated":null,"tags":["async/await","concurrency","testing","swift"],"readingTime":5},"slug":"testing-swift-async-await","id":"161207a1-dada-5cd5-8b10-8b27a4c432ff"},{"frontmatter":{"title":"Understanding opaque types in Swift","titleSeo":null,"subtitle":"Explore opaque types in Swift for building flexible and type-safe abstractions.","date":"09 Dec 2024","dateUpdated":null,"tags":["generics and protocols","swift","swiftui"],"readingTime":3},"slug":"swift-opaque-types","id":"9be86ff9-8443-50c0-ab8a-a73b37ed098d"},{"frontmatter":{"title":"Supporting universal links in a SwiftUI application","titleSeo":null,"subtitle":"Learn how to implement universal links to link between content on your iOS app and its connected website.","date":"25 Nov 2024","dateUpdated":null,"tags":["associated domains","security","swiftui","ios"],"readingTime":5},"slug":"ios-universal-links-swiftui","id":"810ec341-1ce1-51db-a75a-f5a3a01db3f2"},{"frontmatter":{"title":"How to use a Connectable publisher in Combine","titleSeo":null,"subtitle":"Learn how to prevent data loss by using Combine's ConnectablePublisher.","date":"18 Nov 2024","dateUpdated":null,"tags":["combine","swift","ios"],"readingTime":3},"slug":"combine-connectable-publisher","id":"c0bcbfcc-5eeb-58ba-bff8-0373b102071c"},{"frontmatter":{"title":"How to identify data in Lists and ForEach in SwiftUI","titleSeo":null,"subtitle":"Understanding the Identifiable protocol and \\.self in SwiftUI collections.","date":"11 Nov 2024","dateUpdated":null,"tags":["swiftui","basics","ios"],"readingTime":3},"slug":"swiftui-identifiable","id":"af12058e-c586-565b-a6bd-608e8e76b84b"},{"frontmatter":{"title":"Dynamic colors in SwiftUI","titleSeo":null,"subtitle":"Learn to use the asset catalog or the programmatic approach to define dynamic colors in SwiftUI.","date":"04 Nov 2024","dateUpdated":null,"tags":["swiftui","swift","ios"],"readingTime":4},"slug":"swiftui-dynamic-colors","id":"5f7f7f87-7864-5938-8bed-e2dbf60a028d"},{"frontmatter":{"title":"Understanding actors in Swift","titleSeo":null,"subtitle":"Learn how to use Swift actors to prevent data races when working with concurrency.","date":"28 Oct 2024","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":7},"slug":"swift-concurrency-actors-basics","id":"2df22f5d-a77c-54d1-9ef2-853d7264c7f9"},{"frontmatter":{"title":"Extending optionals in Swift","titleSeo":null,"subtitle":"Quick tip on how to extend an optional in Swift.","date":"21 Oct 2024","dateUpdated":null,"tags":["swift","basics"],"readingTime":2},"slug":"swift-extending-optionals","id":"17911082-eab0-5eb6-9be3-4db40c89698c"},{"frontmatter":{"title":"How to call async/await functions in SwiftUI","titleSeo":null,"subtitle":"Learn how to integrate async/await functions into your SwiftUI views.","date":"14 Oct 2024","dateUpdated":null,"tags":["async/await","swiftui","concurrency"],"readingTime":3},"slug":"swiftui-with-async-await","id":"42c6bb72-8590-55ff-bfd2-0538859757d4"},{"frontmatter":{"title":"Understanding localization with LocalizedStringKey in SwiftUI","titleSeo":null,"subtitle":"Learn the advantages and limits of LocalizedStringKey in SwiftUI.","date":"07 Oct 2024","dateUpdated":null,"tags":["localization","swiftui","ios"],"readingTime":5},"slug":"swiftui-localization","id":"c7e9cec1-df76-5b71-a3a9-e87ec9f0dbd0"},{"frontmatter":{"title":"Getting started with async/await in Swift","titleSeo":null,"subtitle":"Learn how use async/await for asynchronous programming.","date":"30 Sep 2024","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":7},"slug":"swift-async-await","id":"1ceada71-91ec-51d0-a310-abebc58a16c9"},{"frontmatter":{"title":"Understanding Substring and String indices in Swift","titleSeo":null,"subtitle":"Learn how to use Swift's String type and its companions Character, Index and Substring.","date":"23 Sep 2024","dateUpdated":null,"tags":["swift","basics"],"readingTime":5},"slug":"swift-strings-indices-and-substrings","id":"311c305a-5987-5b4e-8964-6b185739ae1b"},{"frontmatter":{"title":"How to set up and use Core Data with SwiftUI","titleSeo":null,"subtitle":"Learn the basics for using the Core Data framework with SwiftUI in iOS.","date":"16 Sep 2024","dateUpdated":null,"tags":["core data","persistence","swift","ios"],"readingTime":8},"slug":"coredata-with-swiftui","id":"b34be55e-389f-5e0e-980b-0f264a8170af"},{"frontmatter":{"title":"Introduction to supporting VoiceOver in SwiftUI","titleSeo":"Beginners guide to supporting VoiceOver in SwiftUI for better accessibility","subtitle":"Learn how to use different accessibility modifiers in SwiftUI.","date":"09 Sep 2024","dateUpdated":"09 Sep 2024","tags":["accessibility","swiftui","xcode","ios"],"readingTime":8},"slug":"ios-accessibility-voiceover-swiftui-guide","id":"8cfc75c5-dde4-5b72-bc1f-3909ee6d89e1"},{"frontmatter":{"title":"Cheat sheet on VoiceOver gestures for iOS","titleSeo":"Essential VoiceOver gestures for iOS - a quick guide to testing app accessibility","subtitle":"Learn how to test accessibility using VoiceOver for iOS.","date":"08 Sep 2024","dateUpdated":null,"tags":["accessibility","ios"],"readingTime":2},"slug":"ios-accessibility-voiceover-gestures","id":"b0a0c6bc-9ba9-598a-a7c1-3deb4c8d3a67"},{"frontmatter":{"title":"Swift optionals cheat sheet","titleSeo":null,"subtitle":"Get an overview on Swift optionals, including optional binding, forced unwrapping, implicit optionals, nil coalescing operator and more.","date":"02 Sep 2024","dateUpdated":null,"tags":["swift","basics"],"readingTime":6},"slug":"swift-optionals-cheat-sheet","id":"aafd0158-1d0c-55c7-b165-5d88ca1dfd3a"},{"frontmatter":{"title":"Understanding container values in SwiftUI","titleSeo":null,"subtitle":"Learn how to add customization to SwiftUI containers.","date":"26 Aug 2024","dateUpdated":null,"tags":["swiftui","property wrappers","ios"],"readingTime":2},"slug":"swiftui-container-values","id":"e92660ed-a6ea-5e9d-8e0b-7c33ea08814e"},{"frontmatter":{"title":"How to call async/await functions concurrently in Swift","titleSeo":null,"subtitle":"Learn how to call async/await functions in parallel with tasks.","date":"19 Aug 2024","dateUpdated":null,"tags":["async/await","concurrency","swift"],"readingTime":4},"slug":"swift-call-async-await-functions-concurrently","id":"a7630545-1900-5965-b5ed-f445497f8490"},{"frontmatter":{"title":"Understanding the @FetchRequest property wrapper in SwiftUI","titleSeo":null,"subtitle":"Learn how to request data from the Core Data store in a SwiftUI view.","date":"19 Aug 2024","dateUpdated":null,"tags":["core data","swiftui","property wrappers","swift","ios"],"readingTime":2},"slug":"swiftui-fetchrequest-property-wrapper","id":"a6c80248-9c07-5757-b3f7-b8fd85ee6ee0"},{"frontmatter":{"title":"How to create custom reusable container views in SwiftUI","titleSeo":null,"subtitle":"Learn how to build a generic custom container in SwiftUI.","date":"12 Aug 2024","dateUpdated":null,"tags":["swiftui","property wrappers","ios"],"readingTime":4},"slug":"swiftui-custom-containers","id":"141a75c2-22f3-5b5c-8766-0f2cbc19d575"},{"frontmatter":{"title":"How to add public libraries as Swift Packages to an iOS project","titleSeo":null,"subtitle":"Learn how to add, update and delete remote dependencies using the Swift Package Manager and Xcode","date":"05 Aug 2024","dateUpdated":null,"tags":["swift package manager","xcode","ios","architecture"],"readingTime":3},"slug":"spm-add-public-packages","id":"09b5573b-0698-5c5f-9f47-631c62780471"},{"frontmatter":{"title":"How to add local Swift Packages to an iOS project","titleSeo":null,"subtitle":"Learn how to add local dependencies to your iOS project by using Swift Package Manager and Xcode","date":"05 Aug 2024","dateUpdated":null,"tags":["swift package manager","xcode","ios","architecture"],"readingTime":2},"slug":"spm-add-local-packages","id":"25d8dea0-88df-5c85-b444-cb4d9c4ac9fe"},{"frontmatter":{"title":"Get started with Swift Package Manager for iOS","titleSeo":null,"subtitle":"Learn how to create and manage Swift Packages.","date":"05 Aug 2024","dateUpdated":null,"tags":["swift package manager","xcode","architecture","ios"],"readingTime":6},"slug":"spm-overview","id":"5df4628c-897e-56ea-bffc-0f1ae4659217"},{"frontmatter":{"title":"Understanding the @Environment property wrapper in SwiftUI","titleSeo":null,"subtitle":"Learn different scenarios for using the @Environment property wrapper.","date":"29 Jul 2024","dateUpdated":null,"tags":["swiftui","property wrappers","swift","ios"],"readingTime":3},"slug":"swiftui-environment-property-wrapper","id":"a19d25dd-48a4-5999-8f56-cc0cc5d7f353"},{"frontmatter":{"title":"How to delay server requests for user's search query with SwiftUI and Combine","titleSeo":null,"subtitle":"Learn how to debounce on a practical example.","date":"15 Jul 2024","dateUpdated":null,"tags":["combine","swiftui","swift","ios"],"readingTime":5},"slug":"combine-swiftui-search-query-debounce","id":"d55ee6e0-32f2-5f80-9dfa-29215712b0f0"},{"frontmatter":{"title":"Backpressure in Combine","titleSeo":"Understanding backpressure in Combine - efficient data handling in Swift","subtitle":"Understand the concept behind backpressure and how to apply it in Combine.","date":"08 Jul 2024","dateUpdated":null,"tags":["combine","swift","ios"],"readingTime":8},"slug":"combine-back-pressure","id":"49308c9a-1130-55ef-843e-30fae670c8de"},{"frontmatter":{"title":"Developer guide on Swift Testing for iOS","titleSeo":null,"subtitle":"Learn how use Swift Testing to write automated tests.","date":"01 Jul 2024","dateUpdated":null,"tags":["testing","swift","ios"],"readingTime":5},"slug":"testing-swift-testing-overview","id":"357e69fa-421a-5523-b2a3-c704c684df44"},{"frontmatter":{"title":"WWDC 2024 summary of Apple's platforms state of the union talk for iOS developers","titleSeo":null,"subtitle":"Discover Apple's announcements for iOS at WWDC 2024.","date":"24 Jun 2024","dateUpdated":null,"tags":["wwdc","ios"],"readingTime":5},"slug":"wwdc-2024","id":"bfa82f54-bbf9-52f6-984d-d508d493a7a5"},{"frontmatter":{"title":"How to use NavigationPath for routing in SwiftUI","titleSeo":null,"subtitle":"Learn how to manage navigation in SwiftUI programmatically.","date":"09 Jun 2024","dateUpdated":null,"tags":["navigation","design patterns","architecture","swiftui"],"readingTime":5},"slug":"swiftui-navigationpath","id":"6729f566-0f77-5334-b5c1-9ee307a334cb"},{"frontmatter":{"title":"Objective-C basics for Swift developers","titleSeo":null,"subtitle":"Quick reference of key Objective-C concepts.","date":"03 Jun 2024","dateUpdated":null,"tags":["objective-c","swift","basics"],"readingTime":6},"slug":"objective-c-for-swift-developers","id":"76784487-cb9f-529a-bb53-8966b39a8a60"},{"frontmatter":{"title":"How to create custom @Environment values in SwiftUI","titleSeo":null,"subtitle":"Learn how to share data between SwiftUI views without passing the data explicitly.","date":"27 May 2024","dateUpdated":null,"tags":["property wrappers","swiftui","ios"],"readingTime":4},"slug":"swiftui-custom-environment-values","id":"c7034416-4269-5a20-98bb-5772c9b299c5"},{"frontmatter":{"title":"Combine essentials in Swift - a quick guide","titleSeo":"Quick guide to Combine essentials in Swift programming","subtitle":"Learn basic Combine concepts and terms.","date":"20 May 2024","dateUpdated":null,"tags":["combine","reactive programming","swift"],"readingTime":10},"slug":"combine-essentials","id":"47b5f18a-ca0f-5f89-8a47-1f51e04bb2aa"},{"frontmatter":{"title":"How to combine SwiftUI and UIKit views in iOS","titleSeo":null,"subtitle":"Learn how to bridge SwiftUI and UIKit views.","date":"13 May 2024","dateUpdated":null,"tags":["swiftui","uikit","swift"],"readingTime":4},"slug":"swiftui-uikit","id":"c7977504-359b-5fda-9f97-8fc8146afeb4"},{"frontmatter":{"title":"How to localize plurals with Localizable.stringsdict files in iOS","titleSeo":null,"subtitle":"Learn to support plurals for multiple languages.","date":"06 May 2024","dateUpdated":null,"tags":["localization","xcode","ios"],"readingTime":6},"slug":"ios-plurals-localization-strictdict","id":"d00265ba-3893-5578-8cfd-4461ce772e49"},{"frontmatter":{"title":"How to solve problems with bitwise operators in Swift","titleSeo":null,"subtitle":"Learn to use the power of bitwise operations and option sets in iOS.","date":"29 Apr 2024","dateUpdated":null,"tags":["swift","ios"],"readingTime":8},"slug":"swift-working-with-bits","id":"ea7be4dc-66b6-58ec-b63e-076060133157"},{"frontmatter":{"title":"GraphQL essentials for iOS development","titleSeo":null,"subtitle":"Understand the concept behind GraphQL in context of iOS development.","date":"22 Apr 2024","dateUpdated":"22 Apr 2024","tags":["graphql","networking","swift","ios"],"readingTime":12},"slug":"graphql-essentials-for-ios","id":"fa4c8e26-c133-5d2b-a962-1d866e110aff"},{"frontmatter":{"title":"Quick tip on adding child view controllers programmatically in UIKit","titleSeo":null,"subtitle":"A Swift extension for programmatically adding child view controllers.","date":"22 Apr 2024","dateUpdated":null,"tags":["uikit","quick tip","ios","swift"],"readingTime":2},"slug":"uikit-adding-childview-controller","id":"9fce0a5b-dcb7-51cb-b8ee-4c4d0c246452"},{"frontmatter":{"title":"My favorite Xcode keyboard shortcuts to be more productive","titleSeo":null,"subtitle":"Increase your productivity when working with Xcode.","date":"15 Apr 2024","dateUpdated":null,"tags":["xcode","productivity","ios"],"readingTime":3},"slug":"xcode-shortcuts","id":"5735ba9d-4f39-5be8-a0f9-2ad59ba54320"},{"frontmatter":{"title":"Introduction to Combine for iOS developers with RxSwift experience","titleSeo":null,"subtitle":"How to start using Combine for reactive programming","date":"08 Apr 2024","dateUpdated":null,"tags":["combine","reactive programming","swift","ios"],"readingTime":4},"slug":"combine-for-rxswift-devs","id":"922dc9d0-36c0-5bfb-8e07-6251fb1b1831"},{"frontmatter":{"title":"Quick tip on how to learn Xcode keyboard shortcuts efficiently","titleSeo":null,"subtitle":"A workflow to memorize Xcode keyboard shortcuts.","date":"08 Apr 2024","dateUpdated":null,"tags":["xcode","quick tip","productivity"],"readingTime":2},"slug":"xcode-quicktip-learning-shortcuts","id":"89ce7978-a79f-5de5-abfd-e63c9069bd19"},{"frontmatter":{"title":"How to avoid using AnyView in SwiftUI","titleSeo":null,"subtitle":"By using alternatives such as the @ViewBuilder attribute, Group type or generics.","date":"01 Apr 2024","dateUpdated":null,"tags":["swiftui","performance","swift","ios"],"readingTime":6},"slug":"swiftui-how-to-avoid-using-anyview","id":"5747b165-935b-5bfa-ac2f-c6ac0956a046"},{"frontmatter":{"title":"How to use Swift's logging API","titleSeo":null,"subtitle":"Learn how to log events and errors in your iOS app with Swift's logging API.","date":"25 Mar 2024","dateUpdated":null,"tags":["swift","xcode","ios"],"readingTime":4},"slug":"swift-logging-api","id":"1c4a7c60-51c7-5eb9-ac03-abc9b5297140"},{"frontmatter":{"title":"How to support dark mode in SwiftUI programmatically","titleSeo":null,"subtitle":"Learn how to improve type safety when working with semantic colors.","date":"18 Mar 2024","dateUpdated":null,"tags":["ux","swiftui","swift","xcode","ios"],"readingTime":4},"slug":"ios-supporting-dark-mode-programmatically","id":"a05e49ca-02d1-57ff-a166-58947b4c1623"},{"frontmatter":{"title":"Safe array subscription in Swift","titleSeo":null,"subtitle":"An extension to access array elements with conditional binding","date":"18 Mar 2024","dateUpdated":null,"tags":["swift","quick tip","basics"],"readingTime":2},"slug":"swift-basics-safe-array-subscription","id":"2b1a4e80-d0d5-55bc-b312-e3b48c3a7040"},{"frontmatter":{"title":"How to use TipKit to create tool tips in SwiftUI","titleSeo":null,"subtitle":"Learn how to show feature hints as a popover to the user by using TipKit.","date":"04 Mar 2024","dateUpdated":null,"tags":["ux","swift","ios"],"readingTime":5},"slug":"20240304-tipkit-feature-hints","id":"f197381a-ce22-53ae-8bac-902123f712dd"},{"frontmatter":{"title":"How to delay an animation in SwiftUI","titleSeo":null,"subtitle":"Learn how to wait for a certain amount of time before starting a SwiftUI animation.","date":"26 Feb 2024","dateUpdated":null,"tags":["swiftui","animations","swift","ios"],"readingTime":2},"slug":"20240226-delay-swiftui-animation","id":"1b18346a-651d-5515-bb6b-66bc5f5505b3"},{"frontmatter":{"title":"How to define one-to-many relationships in SwiftData","titleSeo":null,"subtitle":"Learn to use SwiftData's @Relationship macro.","date":"19 Feb 2024","dateUpdated":"13 Jul 2026","tags":["swiftdata","swift","ios"],"readingTime":4},"slug":"swiftdata-one-to-many-relationships","id":"f211ef44-59d6-5b20-9c94-7dc762a0338e"},{"frontmatter":{"title":"Getting started with Apollo iOS for GraphQL in Swift","titleSeo":null,"subtitle":"Learn how to integrate GraphQL into a Swift application using Apollo iOS.","date":"12 Feb 2024","dateUpdated":null,"tags":["graphql","networking","swift","ios"],"readingTime":8},"slug":"graphql-apollo-for-ios","id":"599dab3a-f675-5d5e-854e-c61b82c030fd"},{"frontmatter":{"title":"Get started with auto‑renewable subscriptions for iOS","titleSeo":null,"subtitle":"Learn how to implement in-app purchase subscriptions with StoreKit and SwiftUI.","date":"11 Dec 2023","dateUpdated":null,"tags":["storekit","swift","ios"],"readingTime":5},"slug":"20231211-auto-renewable-subscriptions","id":"00dbdbb5-aa45-5823-bfd3-8716ee86575e"},{"frontmatter":{"title":"Introduction to Kotlin for Swift developers - protocols, extensions & generics","titleSeo":null,"subtitle":"Learn how protocols, extensions and generics in Kotlin work from a Swift developer's point of view.","date":"02 Dec 2023","dateUpdated":null,"tags":["beyond ios","swift","ios"],"readingTime":8},"slug":"kotlin-for-swift-developers-part-3","id":"f89139c7-c959-5c71-b642-fb4758c40a26"},{"frontmatter":{"title":"How to store images in SwiftData","titleSeo":null,"subtitle":"Learn how to efficiently store larger amounts of data in SwiftData.","date":"27 Nov 2023","dateUpdated":"13 Jul 2026","tags":["swiftdata","swiftui","swift","ios"],"readingTime":1},"slug":"swiftdata-store-images","id":"f8ae9e4e-5db6-5e7d-a83f-e3be6e517d0a"},{"frontmatter":{"title":"How to migrate to a new schema with SwiftData in iOS","titleSeo":null,"subtitle":"Learn how to create a migration plan in SwiftData.","date":"20 Nov 2023","dateUpdated":"13 Jul 2026","tags":["swiftdata","persistence","swift","ios"],"readingTime":4},"slug":"swiftdata-schema-migration","id":"9faba681-fb37-58fe-aef2-d7c2af948ad9"},{"frontmatter":{"title":"How to implemet a free trial period for StoreKit 2 subscriptions in iOS","titleSeo":null,"subtitle":"Learn how to implement StoreKit 2 introductory offers.","date":"13 Nov 2023","dateUpdated":null,"tags":["storekit","swift","ios"],"readingTime":2},"slug":"20231113-subscriptions-introductory-offers","id":"90f58658-7c49-5939-8300-d6f1dfe40b9e"},{"frontmatter":{"title":"How to get a SwiftData model container and context in SwiftUI","titleSeo":null,"subtitle":"Learn how to setup a SwiftData container and context directly in SwiftUI.","date":"30 Oct 2023","dateUpdated":"13 Jul 2026","tags":["swiftdata","persistence","swiftui","swift","ios"],"readingTime":4},"slug":"swiftdata-model-container-context-swiftui","id":"290c6dfa-3d7c-5ec6-8c56-503913306213"},{"frontmatter":{"title":"Introduction to bash scripting for iOS developers","titleSeo":null,"subtitle":"Learn how to use bash scripting for iOS development.","date":"23 Oct 2023","dateUpdated":null,"tags":["command line","ios"],"readingTime":6},"slug":"20231023-bash-scripting-for-ios-devs","id":"aaf628fe-c611-5890-ae68-5a3dd27e6b51"},{"frontmatter":{"title":"Quick developer guide on SwiftData for iOS","titleSeo":null,"subtitle":"Get an overview on Apple's SwiftData framework.","date":"16 Oct 2023","dateUpdated":"13 Jul 2026","tags":["swiftdata","persistence","swiftui","swift","ios"],"readingTime":4},"slug":"swiftdata-quick-developer-guide","id":"cdf52ab9-fcd9-5c93-adaf-327cf18d51c2"},{"frontmatter":{"title":"How to restore in-app purchases with StoreKit 2 for iOS","titleSeo":null,"subtitle":"Learn how to restore in-app purchases proactively and with a restore purchases button.","date":"09 Oct 2023","dateUpdated":null,"tags":["storekit","swift","ios"],"readingTime":2},"slug":"20231009-restore-in-app-purchases-storekit","id":"4059c2d5-e6b6-5f1e-8b95-7ef2ea209867"},{"frontmatter":{"title":"Get started with StoreKit 2 for iOS","titleSeo":null,"subtitle":"Learn how to implement in-app purchases and subscriptions with StoreKit 2.","date":"02 Oct 2023","dateUpdated":null,"tags":["storekit","swift","ios"],"readingTime":4},"slug":"20231002-storekit-2-overview","id":"71e468b3-1734-50e7-a8fe-2a891dc25e07"},{"frontmatter":{"title":"Introduction to Kotlin for Swift developers - classes, structs & enums","titleSeo":null,"subtitle":"Learn how classes, structs and enums work in Kotlin from a Swift developer's point of view.","date":"25 Sep 2023","dateUpdated":null,"tags":["beyond ios","swift","ios"],"readingTime":8},"slug":"kotlin-for-swift-developers-part-2","id":"0ab2aba1-e012-5b7a-9c46-2ab82fa2e28d"},{"frontmatter":{"title":"How to intercept and edit a server response with Proxyman for iOS","titleSeo":null,"subtitle":"Learn how to change response data to test different server response scenarios.","date":"18 Sep 2023","dateUpdated":null,"tags":["networking","tools","ios"],"readingTime":3},"slug":"20230918-proxyman-how-to-change-request","id":"aa687909-3cb8-53bf-9707-16f879254312"},{"frontmatter":{"title":"How to manually subscribe to changes of SwiftUI's @Observable objects","titleSeo":null,"subtitle":"Learn how to use the withObservationTracking method of the Observation framework.","date":"22 Aug 2023","dateUpdated":null,"tags":["observation","swiftui","swift","ios"],"readingTime":3},"slug":"20230822-observation-framework-subscribe-to-changes","id":"e195d2c2-b24b-59d5-af7c-9fd1db43edf3"},{"frontmatter":{"title":"Introduction to Kotlin for Swift developers - variables, functions & control flow","titleSeo":null,"subtitle":"Learn the main concepts of Kotlin from a Swift developer's point of view.","date":"15 Aug 2023","dateUpdated":null,"tags":["beyond ios","swift","ios"],"readingTime":6},"slug":"kotlin-for-swift-developers-part-1","id":"d6f77dfd-b533-5fb9-b355-13af40df413a"},{"frontmatter":{"title":"The difference between @StateObject and @ObservedObject in SwiftUI","titleSeo":null,"subtitle":"Learn how to correctly use the property wrappers StateObject and ObservedObject.","date":"31 Jul 2023","dateUpdated":null,"tags":["swiftui","property wrappers","swift","ios"],"readingTime":4},"slug":"20230731-stateobject-observedobject-swiftui","id":"db1ff909-295e-5d6f-aedc-7210b63d32af"},{"frontmatter":{"title":"How to automate taking screenshots with fastlane for iOS","titleSeo":null,"subtitle":"Learn how to setup fastlane's snapshot action.","date":"24 Jul 2023","dateUpdated":null,"tags":["continuous integration","testing","ios"],"readingTime":2},"slug":"20230724-fastlane-screenshots-ios","id":"f83bf64b-701b-5b9d-8ff4-8649261bb55a"},{"frontmatter":{"title":"Beginner's guide on Flutter for iOS developers","titleSeo":null,"subtitle":"Learn the main concepts of Flutter from a native iOS developer's point of view.","date":"17 Jul 2023","dateUpdated":null,"tags":["beyond ios","swift","ios"],"readingTime":8},"slug":"20230717-flutter-for-ios-developers","id":"f35dfeb9-220a-5366-bd19-cc42aa750d23"},{"frontmatter":{"title":"Quick tip on how to split text into words with the Natural Language framework in Swift.","titleSeo":null,"subtitle":"Learn how the tokenizer of the Natural Language framework works.","date":"19 Jun 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":2},"slug":"20230619-tokenizing-words-with-natural-language-framework","id":"d77f103e-e81f-5a4b-bd4d-cb3a07df102f"},{"frontmatter":{"title":"How to find synonyms with the Natural Language framework for iOS","titleSeo":null,"subtitle":"Learn how to find similar words or sentences in Swift.","date":"12 Jun 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":3},"slug":"20230612-find-similar-words-natural-language-framework-ios","id":"f25f29fd-6fb2-51cc-ac56-d6136d6b631f"},{"frontmatter":{"title":"How to map a SwiftUI state to a binding of a different type","titleSeo":null,"subtitle":"Learn how to create custom SwiftUI bindings.","date":"05 Jun 2023","dateUpdated":null,"tags":["swiftui","property wrappers","swift","ios"],"readingTime":2},"slug":"20230605-swiftui-state-binding-different-types","id":"ef1cc34d-2fe7-5c07-a595-dd479ae2b66d"},{"frontmatter":{"title":"Continuous integration and delivery for iOS","titleSeo":null,"subtitle":"Learn CI/CD concepts and possible workflows for iOS applications.","date":"29 May 2023","dateUpdated":null,"tags":["continuous integration","ios"],"readingTime":5},"slug":"20230529-continuous-integration-and-delivery-for-ios","id":"2f3d6214-05b9-54cc-a4ba-69186f878519"},{"frontmatter":{"title":"How to identify parts of speech and names in a text with Swift","titleSeo":null,"subtitle":"Learn to use the linguistic tagging possibilities provided by the Natural Language framework in iOS.","date":"15 May 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":2},"slug":"20230515-natural-language-framework-linguistic-tags","id":"116933c8-385e-545d-bb53-5cc4753eebe9"},{"frontmatter":{"title":"How to detect the language of a text with the Natural Language framework in Swift","titleSeo":null,"subtitle":"Learn to use the language recognizer of the Natural Language framework.","date":"01 May 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":2},"slug":"20230501-detect-language-with-natural-language-framework","id":"2741de00-c635-5d32-96a7-6eb7c6b4dc39"},{"frontmatter":{"title":"Developer guide on App Clips for iOS","titleSeo":null,"subtitle":"Learn how support App Clips to allow users to perform a specific task without installing the full iOS application.","date":"24 Apr 2023","dateUpdated":null,"tags":["associated domains","ios"],"readingTime":4},"slug":"20230424-app-clips","id":"28dc8a18-ab9a-54e6-826a-e2b829715dff"},{"frontmatter":{"title":"Cheatsheet for the JSON payload of an iOS push notification","titleSeo":null,"subtitle":"Learn the structure and configuration possibilities of a remote push notification.","date":"17 Apr 2023","dateUpdated":null,"tags":["notifications","swift","ios"],"readingTime":5},"slug":"20230417-cheatsheet-for-anatomy-of-ios-push-notifications","id":"d0a33cd7-664f-57ec-aa71-74226d26b381"},{"frontmatter":{"title":"How to scan QR codes with VisionKit for iOS","titleSeo":null,"subtitle":"Learn how to use the DataScannerViewController to scan QR codes.","date":"10 Apr 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":3},"slug":"20230410-how-to-scan-qr-codes-with-visionkit-for-ios","id":"1db97078-4ff5-510c-aa66-01e120e5f8bd"},{"frontmatter":{"title":"Get started with Create ML to train a machine learning model in iOS","titleSeo":null,"subtitle":"Learn how to use Create ML to create machinge learning models.","date":"03 Apr 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":4},"slug":"20230403-train-ml-model-with-create-ml-ios","id":"7cad2b7f-7b64-5d1d-b50f-d59bcfb80e9c"},{"frontmatter":{"title":"How to change JSON keys by using Swift's CodingKey protocol","titleSeo":null,"subtitle":"Learn how to map JSON data to a different structure in Swift.","date":"27 Mar 2023","dateUpdated":null,"tags":["json","networking","swift","ios"],"readingTime":3},"slug":"swift-json-custom-decoding-encoding","id":"17ebb1d1-74c0-5fef-8f89-40d03b872bde"},{"frontmatter":{"title":"Get started with NSPredicate to filter NSFetchRequest in Core Data","titleSeo":null,"subtitle":"Get a quick overview on how to use predicates to filter fetch request results.","date":"20 Mar 2023","dateUpdated":null,"tags":["core data","persistence","swift","ios"],"readingTime":3},"slug":"20230320-cheatsheet-nspredicate-fetchrequest-core-data","id":"0359d5c9-5fe7-5c5c-8f1b-866158c3091c"},{"frontmatter":{"title":"Developer guide on machine learning for iOS with Core ML","titleSeo":null,"subtitle":"Learn basic machine learning concepts and how to use machine learning in iOS.","date":"13 Mar 2023","dateUpdated":null,"tags":["machine learning","swift","ios"],"readingTime":5},"slug":"20230313-machine-learning-ios-core-ml","id":"bd0eeae9-8911-5345-8ad0-a16269abd521"},{"frontmatter":{"title":"Quick tip on how to unit test Swift optionals with XCTUnwrap","titleSeo":null,"subtitle":"Learn how to shorten if let and guard statements when unit testing.","date":"06 Mar 2023","dateUpdated":null,"tags":["testing","swift","ios"],"readingTime":2},"slug":"20230306-xctunwrap-quick-tip","id":"9201d5eb-3849-5453-b1f1-66b417a6fc0c"},{"frontmatter":{"title":"Quick guide on fastlane for iOS development","titleSeo":null,"subtitle":"Learn to automate steps like running tests, code signing, build uploading and more.","date":"13 Feb 2023","dateUpdated":null,"tags":["continuous integration","ios"],"readingTime":8},"slug":"20230213-fastlane-ios-developer-guide","id":"ee48b1ea-a182-5407-8271-5f3642f94b14"},{"frontmatter":{"title":"How to import Objective-C types as optionals or non-optionals into Swift","titleSeo":null,"subtitle":"Learn how to use nullability declarations and macros.","date":"30 Jan 2023","dateUpdated":null,"tags":["objective-c","swift","ios"],"readingTime":3},"slug":"20230130-nullability-declarations-objective-c","id":"ce2fcd29-b34b-5601-95a5-7adc6d44107f"},{"frontmatter":{"title":"Authorizing App Store Connect API requests","titleSeo":null,"subtitle":"Learn how to create and use a JSON Web Token when communicating with the App Store Connect API.","date":"26 Dec 2022","dateUpdated":null,"tags":["continuous integration","automation","ios"],"readingTime":4},"slug":"20221226-authorizing-app-store-connect-api-requests","id":"45918848-acea-5cb2-b0f2-cefaaf66840f"},{"frontmatter":{"title":"How to perform a lightweight migration in Core Data","titleSeo":null,"subtitle":"Learn how Core Data can automatically migrate compatible model changes.","date":"19 Dec 2022","dateUpdated":"10 Oct 2025","tags":["core data","persistence","xcode","ios"],"readingTime":4},"slug":"core-data-lightweight-migration","id":"6ea34bc6-fd12-5d45-80e4-60396497bb59"},{"frontmatter":{"title":"Developer guide on the App Store Connect API","titleSeo":null,"subtitle":"Learn how to automate App Store Connect.","date":"28 Nov 2022","dateUpdated":null,"tags":["continuous integration","automation","ios"],"readingTime":7},"slug":"20221128-app-store-connect-api-quide","id":"d6d4fbcb-c281-5105-9a86-b002d6ed644c"},{"frontmatter":{"title":"How to handle non-optional Core Data properties in Swift","titleSeo":null,"subtitle":"Explore the possibilities to use non-optional Swift values in Core Data.","date":"07 Nov 2022","dateUpdated":null,"tags":["core data","persistence","xcode","ios"],"readingTime":4},"slug":"20221114-how-to-handle-non-optional-core-data-values-in-swift","id":"978d4c3c-8200-5e77-8cdb-95e9d7dd7812"},{"frontmatter":{"title":"Understanding different cache policies when working with URLRequest in Swift","titleSeo":null,"subtitle":"Learn how to manage cache when sending HTTP requests in your iOS applications.","date":"31 Oct 2022","dateUpdated":null,"tags":["networking","swift","ios"],"readingTime":4},"slug":"20221031-managing-cache-when-working-with-urlsession-in-ios","id":"39a99079-d5f8-52d4-a662-bd7c0c42b3bc"},{"frontmatter":{"title":"How to create NSManagedObject subsclasses for Core Data entities in Xcode","titleSeo":null,"subtitle":"Learn about Xcode's code generation options when creating Core Data models in Swift.","date":"24 Oct 2022","dateUpdated":null,"tags":["core data","persistence","xcode","ios"],"readingTime":3},"slug":"20221024-how-to-create-a-managed-object-subclass-xcode-core-data","id":"96ffe20f-84f2-5eb9-9b02-8dbdb182d1a3"},{"frontmatter":{"title":"iOS developer guide on the main aspects of Core Data","titleSeo":null,"subtitle":"Understand the main concepts of the Core Data framework.","date":"19 Sep 2022","dateUpdated":null,"tags":["core data","persistence","xcode","swift","ios"],"readingTime":5},"slug":"20220919-understanding-the-main-aspects-of-core-data","id":"a519ac9e-9f9f-524c-b781-93fe1f05f751"},{"frontmatter":{"title":"How to manage view lifecycle events in SwiftUI","titleSeo":null,"subtitle":"Discover SwiftUI's view lifecycle events onAppear, onDisappear, task, and task(id:).","date":"15 Sep 2022","dateUpdated":"15 Sep 2025","tags":["swiftui","swift","ios"],"readingTime":3},"slug":"swiftui-view-lifecycle-events","id":"29f0a927-f429-5078-bfde-24793ff32573"},{"frontmatter":{"title":"Building configurable widgets with WidgetKit and SwiftUI","titleSeo":null,"subtitle":"Learn how to let users customize a WidgetKit widget with App Intents.","date":"05 Sep 2022","dateUpdated":"20 Jul 2026","tags":["widgetkit","swiftui","swift","ios"],"readingTime":5},"slug":"widgetkit-configurable-widgets-swiftui","id":"766edb7b-6be2-518d-b892-aec787d07ec6"},{"frontmatter":{"title":"How to bridge async/await functions to Combine's Future type in Swift","titleSeo":null,"subtitle":"Learn how to call async/await code within Combine based APIs.","date":"22 Aug 2022","dateUpdated":null,"tags":["combine","async/await","concurrency","reactive programming","swift"],"readingTime":2},"slug":"20220822-bridge-async-await-to-combine-future","id":"cfd4b202-7424-57d5-a426-054ad2ec2800"},{"frontmatter":{"title":"Implementing Password AutoFill for an iOS application","titleSeo":null,"subtitle":"Learn how to activate Apple's Password AutoFill for SwiftUI and UIKit.","date":"15 Aug 2022","dateUpdated":null,"tags":["associated domains","security","swiftui","ios"],"readingTime":3},"slug":"20220815-supporting-password-autofill-for-ios-appilcations","id":"236513b1-17bc-5ce7-9512-28f8a0754954"},{"frontmatter":{"title":"Quick guide on Proxyman for iOS development","titleSeo":null,"subtitle":"Learn how to use Proxyman to inspect network traffic for your iOS application.","date":"04 Jul 2022","dateUpdated":null,"tags":["networking","tools","ios"],"readingTime":8},"slug":"20220704-quick-guide-on-proxyman","id":"3610b001-786f-5311-b452-25c6eb03fecf"},{"frontmatter":{"title":"Customizing buttons in SwiftUI with the ButtonStyle protocol","titleSeo":null,"subtitle":"Learn how to reuse button styles in SwiftUI.","date":"23 May 2022","dateUpdated":"08 Sep 2025","tags":["swiftui","swift","ios"],"readingTime":2},"slug":"swiftui-customizing-button-with-buttonstyle","id":"ac804832-0f3b-5814-a465-be0012d1c0cc"},{"frontmatter":{"title":"Customizing the appearance of the NavigationView title in SwiftUI","titleSeo":null,"subtitle":"Learn how to create a custom navigation bar title view in SwiftUI.","date":"16 May 2022","dateUpdated":"20 Jan 2025","tags":["navigation","swiftui","swift","ios"],"readingTime":3},"slug":"switui-navigationview-customize-title","id":"96750132-883b-5cdc-9a3a-b0a2b5919782"},{"frontmatter":{"title":"Quick guide on local notifications for iOS","titleSeo":null,"subtitle":"Learn how to schedule and handle local notifications using the UserNotifications framework.","date":"02 May 2022","dateUpdated":"12 May 2025","tags":["notifications","swift","ios"],"readingTime":8},"slug":"ios-local-notifications-guide","id":"b1377c06-9cd7-5b7b-8925-ce5fcc2b68e5"},{"frontmatter":{"title":"Manipulating networking requests and responses with Charles","titleSeo":null,"subtitle":"Learn how to use Charles breakpoints tool to change network data and test your iOS application.","date":"07 Mar 2022","dateUpdated":null,"tags":["networking","tools","ios"],"readingTime":4},"slug":"tools-charles-proxy-manipulating-network-requests-and-responses","id":"98e7cd9b-1c13-577b-a685-0631b745905f"},{"frontmatter":{"title":"Quick guide on Charles Proxy for iOS development","titleSeo":null,"subtitle":"Learn how to use Charles to inspect network traffic for your iOS application.","date":"28 Feb 2022","dateUpdated":null,"tags":["networking","tools","ios"],"readingTime":7},"slug":"tools-charles-proxy-for-ios-guide","id":"7cbed843-dc9c-51b2-852a-e37ba2ccff69"},{"frontmatter":{"title":"Symmetric-key cryptography with CryptoKit for iOS","titleSeo":null,"subtitle":"Using CryptoKit to increase security in iOS applications.","date":"17 Jan 2022","dateUpdated":"24 Mar 2025","tags":["cryptokit","security","swift","ios"],"readingTime":4},"slug":"cryptokit-symmetric-key-cryptography","id":"53f329a6-7024-5f8a-a0e5-6521e5af824b"},{"frontmatter":{"title":"How to preview SwiftUI views in dark mode","titleSeo":null,"subtitle":"Preview SwiftUI views in dark mode by setting the preferredColorScheme(_:).","date":"08 Nov 2021","dateUpdated":"07 Oct 2024","tags":["swiftui","ios"],"readingTime":1},"slug":"swiftui-dark-mode-preview","id":"5414c50c-b6e8-57f2-9c0a-ea5105d1fc71"}]}},"pageContext":{"slug":"swiftui-navigationpath"}},
    "staticQueryHashes": ["1248279061","1495782094","191195224","1974208801","2048964007","3016322440","3234548963","3770566618","3897982121"]}