{
    "componentChunkName": "component---src-templates-article-js",
    "path": "/book-ios-interview-questions-and-answers-preview/",
    "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":"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.","tags":["book","technical interview","swift","ios"],"date":"07 Jan 2025","dateUpdated":null,"datePublished":"2025-01-07","dateModified":null,"readingTime":8,"excerpt":"This is a book preview including one example question and answer for every main topic. A new book version - updated for iOS 18 - is now available."},"slug":"book-ios-interview-questions-and-answers-preview","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\": \"Preparing for a technical iOS job interview with questions and answers in 2025 - book preview\",\n  \"subtitle\": \"An updated book version with a new chapter on Architecture & Design Patterns is now available.\",\n  \"date\": \"2025-01-07T00:00:00.000Z\",\n  \"tags\": [\"book\", \"technical interview\", \"swift\", \"ios\"],\n  \"imageCredits\": null,\n  \"excerpt\": \"This is a book preview including one example question and answer for every main topic. A new book version - updated for iOS 18 - is now available.\",\n  \"readingTime\": 8\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, \"I just released a new book version of \", mdx(\"a\", {\n    href: \"/books/\"\n  }, \"Preparing for a technical iOS job interview - with over 200 questions & answers\"), \" including a new chapter on Architecture & Design Patterns.\"), mdx(\"p\", null, \"This preview provides one example question and answer for every main chapter of the book. You can also download a preview \", mdx(\"a\", {\n    href: \"/books/\"\n  }, \"here\"), \" to see the full outline of the book.\"), mdx(\"affiliateView\", {\n    type: \"sponsor\"\n  }), mdx(\"h3\", null, \"Introduction\"), mdx(\"p\", null, \"Having been a freelance iOS developer for over 10 years, I participated in quite a few hiring interviews for various projects and have also been in a position of leading the technical interviews myself.\"), mdx(\"p\", null, \"With this book, I'd like to give you a guide for technical iOS questions you might be asked in such an interview for an iOS hiring position. It can also be used to get an overview on different iOS development topics and be an inspiration for deepening and expanding your knowledge on your iOS journey.\"), mdx(\"p\", null, \"Each chapter starts with a questions overview that allows you to check your knowledge without seeing the answers. All questions are numerated so you can quickly find the answer if needed. The following topics are covered:\"), mdx(\"h3\", null, \"Chapter: Swift\"), mdx(\"p\", null, \"Being the main programming language for the iOS platform, a deep knowledge in Swift is expected from an iOS developer. This chapter provides questions and answers on Swift and general programming language concepts.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer:\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Swift is a type-safe language. What does type safety mean, and why is it important?\")), mdx(\"p\", null, \"Type safety means that the compiler enforces rules to prevent type errors by ensuring values are used consistently with their declared types. For example, if we declare a variable as an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Int\"), \", we cannot assign a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"String\"), \" value to it. The compiler checks for type mismatches during compilation and provides errors, helping developers catch and fix issues early in the development process.\"), mdx(\"p\", null, \"This feature improves code reliability and reduces runtime errors because many potential bugs are identified before the app runs. Type safety also enhances code readability and maintainability, as the expected data types are clear from the code.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"var age: Int = 10\\nage = \\\"ten\\\" // Compiler error: Cannot assign a value of type 'String' to a variable of type 'Int'\\n\")), mdx(\"p\", null, \"By enforcing type safety, Swift encourages robust and predictable programming practices, making code safer and easier to debug.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: SwiftUI\"), mdx(\"p\", null, \"SwiftUI is Apple's main framework for building user interfaces for iOS. This chapter provides questions and answers on the main aspects of SwiftUI.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Why is it advisable to avoid using \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"AnyView\"), \" in SwiftUI when possible?\")), mdx(\"p\", null, \"SwiftUI uses a concept called \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"structural identity\"), \", where it relies on a view's type to efficiently determine when the view should be updated.\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AnyView\"), \" is a type-erased wrapper that can hold any SwiftUI view. However, since it erases the view's type information, it diminishes SwiftUI's ability to efficiently track and update the view. This can lead to reduced performance, especially in complex view hierarchies.\"), mdx(\"p\", null, \"Therefore, it is advisable to avoid using \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AnyView\"), \" whenever possible to maintain the performance benefits of SwiftUI's structural identity.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Xcode\"), mdx(\"p\", null, \"Being the main iOS development tool, a confident usage of Xcode is expected from an iOS developer. This chapter provides questions and answers on working and debugging with Xcode.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is the purpose of a build scheme in Xcode?\")), mdx(\"p\", null, \"An Xcode build scheme organizes the settings and configurations for development actions such as building, running, testing, profiling, and archiving a project. A scheme determines which targets to build and how they are built, allowing developers to manage workflows efficiently.\"), mdx(\"p\", null, \"Only one scheme can be active at a time. Developers can customize default schemes or create new ones to handle specific tasks, such as creating different builds (e.g., debug or release) or passing unique launch arguments for testing.\"), mdx(\"span\", {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"0px\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1500px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/b8837eda7fd314183e8161e3a8ca8c3a/fc2f5/xcode-scheme-edit.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"56.266666666666666%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABtUlEQVQoz42T247TMBiE8xpISNscfMrBdmInzaltdsV2l4IiRFUBb8IVV1zwAjzvIHtplAqQuPhky56M5x8pQWom1ONb0KIHLbZomgaHwwF930MpBa01TNPB2BrWGhhjYK31q1ISZVl6qqqClBKBePcN5eefePX4A6+nrxBpulBICaU1bD9h2O2xbVu0XYd+GDyqqsG9Vng9ZRxBpmuM4w6UUDDKECUJNnGETRSBco7SGHTjDh8vn/B+njE9PGDc73G4v4fdHXEXJwjjCGEce4K06vHm8RmpyEApR0yIN3WXhDFkRYFUurFb2LqGVBppniOhFJso9NorLkTApUWz7cCZeDFMyPKaE0mtoY2F3baorEGhFESW+VGd8Vp7F4YI3NyEMG/GmFgMrykTQsBz6ROWVYVcSm/q6ljrfEJnyLjwRoyKPwyv4jB66XR9vjb6iyG/TZjcfvi/bMJolfA313I9cXyzD/9J5Fk6dOkWGAfjHEwI39N6T1zfjIFQekPizkWOKCEIuEghRObhPMUwjDifz57j8Yh5nnG5XHA6ndBNTxjHcfkzKmNgdAF1+IDqy3ekdsIvmOpNAHh7edsAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Xcode scheme edit\",\n    \"title\": \"Xcode scheme edit\",\n    \"src\": \"/static/b8837eda7fd314183e8161e3a8ca8c3a/2e9ed/xcode-scheme-edit.png\",\n    \"srcSet\": [\"/static/b8837eda7fd314183e8161e3a8ca8c3a/12d18/xcode-scheme-edit.png 375w\", \"/static/b8837eda7fd314183e8161e3a8ca8c3a/44507/xcode-scheme-edit.png 750w\", \"/static/b8837eda7fd314183e8161e3a8ca8c3a/2e9ed/xcode-scheme-edit.png 1500w\", \"/static/b8837eda7fd314183e8161e3a8ca8c3a/fc2f5/xcode-scheme-edit.png 1868w\"],\n    \"sizes\": \"(max-width: 1500px) 100vw, 1500px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  }), \"\\n  \"), \"\\n    \"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Combine\"), mdx(\"p\", null, \"The Combine framework is Apple\\u2019s native solution for handling asynchronous events and data streams in Swift. It enables developers to write functional reactive code, streamlining tasks like chaining, transforming, and combining data. This chapter provides questions and answers on Combine and on functional reactive programming concepts in general.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is the difference between a subject and a publisher in Combine?\")), mdx(\"p\", null, \"In Combine, a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"publisher\"), \" emits values over time and can finish or fail with an error. A \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"subject\"), \" is a type of mutable publisher, meaning it can actively send new values after its initialization.\"), mdx(\"p\", null, \"Essentially, subjects are a way to manually control the flow of values in a publisher, whereas regular publishers emit values automatically based on their data source.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Server Communication\"), mdx(\"p\", null, \"Server communication is part of almost every iOS application. This chapter provides questions and answers on general computer networking concepts and on specific iOS networking topics.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is OAuth, and why is it used?\")), mdx(\"p\", null, \"OAuth is an open protocol for secure authorization, allowing users to grant third-party services limited access to their resources without sharing credentials.\"), mdx(\"p\", null, \"The core idea is the use of access tokens as intermediaries. When a third-party app requests access to a user's resources, it obtains an access token from the main service through a secure flow. This token grants limited permissions, ensuring:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The user's credentials (e.g., password) remain private and are not shared with the third party.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Access can be revoked at any time without affecting the user's main account.\")), mdx(\"p\", null, \"OAuth enhances security and user control over data sharing across applications and services.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Concurrency\"), mdx(\"p\", null, \"This chapter focuses on Swift's concurrency model with async/await. It also provides questions and answers on more low-level technologies like Grand Central Dispatch and Operations. Since they were used in iOS applications before async/await, knowledge around these technologies may be required for an iOS position.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is the role of the await keyword in Swift's asynchronous programming?\")), mdx(\"p\", null, \"TThe \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"await\"), \" keyword in Swift enables asynchronous functions to suspend execution until the result of another asynchronous function or task becomes available. This allows developers to write asynchronous code in a sequential and readable manner while the system manages underlying complexities, such as pausing and resuming execution. By combining \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"async\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"await\"), \", Swift ensures clarity and efficiency in handling concurrent operations.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Persisting Data\"), mdx(\"p\", null, \"Persisting pieces of data is required in many applications. Apple offers solutions to store data for different scenarios. This chapter contains questions and answers on persistence technologies and frameworks such as File System, UserDefaults, SwiftData and Core Data.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is migration in SwiftData, and how does it handle schema changes?\")), mdx(\"p\", null, \"Migration in SwiftData ensures that changes to data models in new app versions do not lead to data loss. SwiftData handles this by transitioning between schema versions through migration plans. Developers can define versioned schemas, specify migration sequences, and choose between lightweight migrations or custom transformations as needed.\"), mdx(\"p\", null, \"This process helps maintain data integrity while evolving the app's data structure.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Security\"), mdx(\"p\", null, \"Many applications need to manage some kind of sensitive user data. To ensure a high level of security, Apple provides different technologies to be used by developers. This chapter provides questions and answers on specific security-related iOS technologies such as keychain or shared web credentials, as well as general cryptography concepts.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What are use cases of a hash function?\")), mdx(\"p\", null, \"Cryptographic hash functions have various security applications, such as:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Digital Signatures\"), \": Ensuring the integrity of signed data.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Message Authentication\"), \": Verifying the authenticity of messages.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Password Verification\"), \": Protecting stored passwords.\")), mdx(\"p\", null, \"For instance, in password verification, instead of storing plain passwords, the server stores their hash values. When a user logs in, the app hashes the entered password and sends it for comparison. This approach ensures that the original password is neither stored nor transmitted, enhancing security.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Architecture & Design Patterns\"), mdx(\"p\", null, \"Architectural principles and design patterns are the foundation of robust, maintainable, and scalable iOS applications. This chapter explores key architectural concepts and widely used design patterns in iOS development, providing practical examples and insights into their strengths and weaknesses.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What are the strengths and weaknesses of the MVVM pattern in iOS development?\")), mdx(\"p\", null, \"The MVVM pattern in iOS development separates UI concerns from business logic by introducing a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ViewModel\"), \" that acts as an intermediary between the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Model\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"View\"), \".\"), mdx(\"p\", null, \"This structure makes code more maintainable, testable, and reusable, as it reduces tight coupling between components. MVVM aligns particularly well with SwiftUI\\u2019s declarative nature, where state management and bindings are core features.\"), mdx(\"p\", null, \"However, it can add complexity and require additional boilerplate, particularly in small or simple apps where the benefits may not outweigh the costs. MVVM is most effective in medium-to-large applications with more intricate UI and logic, where clear separation of concerns is crucial.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Chapter: Automated Testing\"), mdx(\"p\", null, \"Testing is an important part in every software development process. Apple offers tools to write unit, UI and performance tests for iOS applications. This chapter provides questions and answers on general testing concepts and specific iOS testing tools.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What are parameterized tests when working with \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"Swift Testing\"), \"?\")), mdx(\"p\", null, \"Swift Testing supports parameterized tests allowing us to run the same test logic multiple times with different input values:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-swift\"\n  }, \"@Test(arguments: [\\\"a\\\", \\\"b\\\", \\\"c\\\"])\\nfunc example(input: String) {\\n    ...\\n}\\n\")), mdx(\"hr\", null), mdx(\"h3\", null, \"Machine Learning\"), mdx(\"p\", null, \"Machine learning becomes an increasingly important part of software development and engineering jobs. Machine learning techniques are used to build models that can learn patterns in data and make predictions or decisions without being explicitly programmed to do so. These models are used in a variety of applications, including image and speech recognition, natural language processing and recommendation systems. This chapter provides questions and answers on general machine learning concepts and on how to integrate machine learning into an iOS application.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What are some examples of tasks than can be solved with the Natural Language framework out of the box?\")), mdx(\"p\", null, \"The Natural Language framework is a machine learning framework that allows us to process and analyze natural language text. With the Natural Language framework, we can solve a wide range of natural language processing tasks, for example:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"recognizing the language of a text\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"finding synonyms or similar sentences of a given text\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"identify and extract named entities from text, such as people, organizations, and locations\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"part-of-speech tagging, i.e. tagging each word in a piece of text with its part of speech, such as noun, verb, adjective, etc.\")), mdx(\"hr\", null), mdx(\"h3\", null, \"Working with Legacy Code: UIKit\"), mdx(\"p\", null, \"With SwiftUI slowly pushing UIKit into the background, UIKit is still part of many existing iOS applications. A deep knowledge of UIKit may be required for an iOS position. This chapter provides questions and answers around key aspects of UIKit.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is the concept behind intrinsic content size of a UIView?\")), mdx(\"p\", null, \"Intrinsic content size represents the amount of space a view needs to display its content. A view can have an intrinsic content height, width or both.\"), mdx(\"p\", null, \"For example, the intrinsic content size of a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"UILabel\"), \" will be the size of the text it contains.\"), mdx(\"p\", null, \"Not all views have an intrinsic content size. When defining a custom view, we are able to decide if it has an intrinsic content size depending on how we setup the view's constraints.\"), mdx(\"hr\", null), mdx(\"h3\", null, \"Working with Legacy Code: Objective-C\"), mdx(\"p\", null, \"Objective-C is becoming more and more obsolete after Swift was released in 2014. However, with existing apps written in Objective-C still out there, knowledge on Objective-C may be required for an iOS position. This chapter provides questions and answers on Objective-C basics and the interoperability between Swift and Objective-C.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Example question & answer\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"What is an implementation file in Objective-C?\")), mdx(\"p\", null, \"An implementation file contains the actual implementation for an Objective-C class. It implements all methods defined in the header file and also contains private properties and methods.\"), mdx(\"p\", null, \"The syntax to declare a class implementation looks as follows:\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"SomeClass.m\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-objectivec\"\n  }, \"#import \\\"SomeClass.h\\\"\\n\\n@implementation SomeClass\\n// implement public methods\\n// define & implement private properties and methods\\n@end\\n\")), mdx(\"hr\", null), mdx(\"p\", null, \"This article is a preview of the book \", mdx(\"a\", {\n    href: \"/books/\"\n  }, \"Preparing for a technical iOS job interview - with over 200 questions & answers\"), \".\"));\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":"book-ios-interview-questions-and-answers-preview"}},
    "staticQueryHashes": ["1248279061","1495782094","191195224","1974208801","2048964007","3016322440","3234548963","3770566618","3897982121"]}