<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Async/Await on Abhishek Shukla</title><link>https://abhishekshukla.dev/tags/async/await/</link><description>Recent content in Async/Await on Abhishek Shukla</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 24 Jun 2026 11:20:00 +0530</lastBuildDate><atom:link href="https://abhishekshukla.dev/tags/async/await/index.xml" rel="self" type="application/rss+xml"/><item><title>The Adapter Design Pattern in Swift: Bridging Legacy Code to Modern APIs</title><link>https://abhishekshukla.dev/blog/adapter-design-pattern/</link><pubDate>Wed, 24 Jun 2026 11:20:00 +0530</pubDate><guid>https://abhishekshukla.dev/blog/adapter-design-pattern/</guid><description>&lt;p&gt;In the real world, you cannot always control the code you work with. You will frequently need to integrate legacy systems, older Objective-C frameworks, or external SDKs into your modern Swift application.&lt;/p&gt;
&lt;p&gt;The problem arises when these external systems have interfaces that are completely incompatible with your app&amp;rsquo;s existing architecture. If you force your app to accommodate these legacy interfaces directly—like dealing with &lt;code&gt;NSArray&lt;/code&gt;, untyped dictionaries, and completion handlers—your code quickly becomes a tightly coupled, unsafe mess.&lt;/p&gt;</description></item></channel></rss>