{
    "componentChunkName": "component---src-templates-article-js",
    "path": "/swiftdata-store-images/",
    "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 store images in SwiftData","titleSeo":null,"subtitle":"Learn how to efficiently store larger amounts of data in SwiftData.","tags":["swiftdata","swiftui","swift","ios"],"date":"27 Nov 2023","dateUpdated":"13 Jul 2026","datePublished":"2023-11-27","dateModified":"2026-07-13","readingTime":1,"excerpt":"Learn how to efficiently store larger amounts of data in SwiftData by using the .externalStorage attribute."},"slug":"swiftdata-store-images","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 store images in SwiftData\",\n  \"subtitle\": \"Learn how to efficiently store larger amounts of data in SwiftData.\",\n  \"date\": \"2023-11-27T00:00:00.000Z\",\n  \"dateUpdated\": \"2026-07-13T00:00:00.000Z\",\n  \"tags\": [\"swiftdata\", \"swiftui\", \"swift\", \"ios\"],\n  \"imageCredits\": null,\n  \"excerpt\": \"Learn how to efficiently store larger amounts of data in SwiftData by using the .externalStorage attribute.\",\n  \"readingTime\": 1\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, \"SwiftData allows us to store images by using the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Data\"), \" type, for example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"@Model\\nclass Recipe {\\n    var imageData: Data\\n}\\n\")), mdx(\"p\", null, \"When working with larger or many images, it might be a good idea to separate them from the model storage and store them in an external file. For that, SwiftData provides the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".externalStorage\"), \" attribute:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"@Attribute(.externalStorage)\\nvar imageData: Data?\\n\")), mdx(\"p\", null, \"With that in place, we tell SwiftData to store the image data in external storage managed by SwiftData, which may lead to improved performance when working with larger amounts of data.\"));\n}\n;\nMDXContent.isMDXComponent = true;","fields":{"contentType":"article"}},"articles":{"nodes":[{"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 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":"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":"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":"ios-swift-testing","id":"fffaa784-5d1b-541b-afcc-79d48e4eedf9"},{"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":"swiftdata-store-images"}},
    "staticQueryHashes": ["1248279061","1495782094","191195224","1974208801","2048964007","3016322440","3234548963","3770566618","3897982121"]}