<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Md. Ibrahim Hassan on Medium]]></title>
        <description><![CDATA[Stories by Md. Ibrahim Hassan on Medium]]></description>
        <link>https://medium.com/@mdibrahimhassan?source=rss-2a62dcb6e4b2------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*VeOkDWspZNJ9fMF_dJy0vQ.jpeg</url>
            <title>Stories by Md. Ibrahim Hassan on Medium</title>
            <link>https://medium.com/@mdibrahimhassan?source=rss-2a62dcb6e4b2------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 04:56:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@mdibrahimhassan/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Objective-C Implementations in Swift]]></title>
            <link>https://blog.swiftify.com/objective-c-implementations-in-swift-72d8fa88e4ee?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/72d8fa88e4ee</guid>
            <category><![CDATA[app-development]]></category>
            <category><![CDATA[objective-c]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[apple]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Mon, 11 Aug 2025 14:21:53 GMT</pubDate>
            <atom:updated>2025-08-11T14:21:53.038Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bUrN7GjdZ0sXOowh3_kayg.png" /></figure><p>Objective-C and Swift offer strong interoperability, making mixed codebases a practical and effective approach for large, complex applications.</p><h4>Importing Swift into Objective-C</h4><p>Xcode automatically generates an interface for the Swift files and a Swift header for the Objective-C files. Swift classes marked with @objcMembers or types annotated with @objc can be accessed from Objective-C, just by importing the Swift header in the implementation. A similar interface is generated for Objective-C files that can be used from Swift. Please check out <a href="https://blog.swiftify.com/understanding-objective-c-swift-interoperability-xcode-generated-interfaces-5e73a5e3a4ec?source=friends_link&amp;sk=68c49ad9a33697dba2c8d7f229765515">this artcle</a> to learn more about the Xcode generated interfaces. This approach has some drawbacks:</p><ol><li>The generated header cannot be included in other headers.</li><li>The generated interface is not well organized and seasoned Objective-C developers use the interface as secondary documentation. For example here is how a <a href="https://gist.github.com/Ibrahimhass/598db7f6d61998ff810938b696ca9a9a">typical generated interface</a> looks like.</li><li>Classes marked with @objc still contain Swift vtables and other Swift-specific data. Objective-C compiler does not fully understand them, so these operate with limited capabilities. Objective-C classes also cannot subclass them.</li></ol><h4>How Swift 6.1 solves these issues?</h4><p>Swift 6.1 allows the use a Swift implementation with the Objective-C header file. For more information, please download this <a href="https://github.com/Swiftify-Corp/ObjCImplementationsInSwift/">sample Xcode project</a> and open the Cat.h file.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e7eb3e87c4f1919dcffc45f7fa259cbd/href">https://medium.com/media/e7eb3e87c4f1919dcffc45f7fa259cbd/href</a></iframe><p>We declared the interface in Objective-C with a class Cat and a category Cat (Actions).</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/225dd540c013098d8739e96af6ebdf0b/href">https://medium.com/media/225dd540c013098d8739e96af6ebdf0b/href</a></iframe><p>Here we completely eliminated the .m file, and the implementation for Cat and Cat(Actions) is written in Swift. Also, please note that we are also able to subclass AfricanWildCat from Cat.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/59ead7dc48fa95e1409ab7b81de9a567/href">https://medium.com/media/59ead7dc48fa95e1409ab7b81de9a567/href</a></iframe><p>We now have the flexibility to implement just a specific class or a category from the header file. The methods defined in the Swift extension are called <strong>member implementations</strong>. The compiler forces us to implement all the member implementations for the chosen @interface. The member implementations should be non-final and non-overrides, and can have an access modifier of open, public, package, or internal. The extensions of the main class can also contain methods and properties other than member implementations. The nonMemberImplementation method is an example in the code snippet above. Also non-category extension using @objc @implementation extensions may contain stored properties, that can be final (can be accessed only from Swift), have overrides, or access scope of private or fileprivate.</p><p>The declarations in the header stay unchanged. Objective-C clients can subclass, swizzle, and interact with the Swift-backed implementation just as they would with a normal .m file. Runtime behavior stays intact.</p><p>A few caveats to keep in mind:</p><ul><li>You cannot declare new conformances inside these extensions.</li><li>Method signatures must match exactly.</li><li>Stored properties are allowed, but only when implementing the main interface (not categories).</li><li>final members and Swift-only helpers are excluded from Objective-C by default.</li></ul><h3>Conclusion</h3><p>It is worth noting that this feature isn’t trying to solve every problem just yet. Factory methods, lightweight generics, and <a href="https://nshipster.com/direct/">objc_direct</a> methods still require traditional Objective-C. But those are niche cases. For 90% of use cases—standard classes, categories, and properties — this feature will cover your needs.</p><p>Adoption is simple. You can retain your .h files as they are, use bridging or umbrella headers to make them accessible to Swift, and start integrating components gradually. The process is steady, reliable, and transparent.</p><p>Swift’s goal has always been safety and simplicity without compromising power. With this update, Swift gets closer to that ideal for mixed-language development. Whether you’re building a framework shared across several apps or modernizing a legacy project, this new capability should make your path forward easier and more maintainable.</p><h3>References</h3><ul><li><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0436-objc-implementation.md">Swift Evolution Proposal SE-0436</a></li><li><a href="https://www.swift.org/blog/swift-6.1-released/">Swift 6.1 Release Notes</a></li><li><a href="https://mjtsai.com/blog/2024/05/10/swift-proposal-objective-c-implementations-in-swift/">Michael Tsai Blog Post</a></li><li><a href="https://medium.com/p/2020-07-21_Understanding-Objective-C-Swift-Interoperability-Xcode-Generated-Interfaces-5e73a5e3a4ec.html">Understanding Objective-C to Swift Interoperability Using Xcode-Generated Interfaces</a></li><li><a href="https://nshipster.com/direct/">https://nshipster.com/direct/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=72d8fa88e4ee" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/objective-c-implementations-in-swift-72d8fa88e4ee">Objective-C Implementations in Swift</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What’s new in Swift 6?]]></title>
            <link>https://blog.swiftify.com/whats-new-in-swift-6-e875ca675a28?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/e875ca675a28</guid>
            <category><![CDATA[swift-6]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[swiftlang]]></category>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Mon, 18 Mar 2024 14:07:16 GMT</pubDate>
            <atom:updated>2024-10-18T20:37:23.908Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k36745AQZ9kTV4gY-qpLFg.jpeg" /></figure><h3>Swift 6 New Features</h3><p>Apple is planning to release Swift 6 in September 2024, alongside Xcode 16. This will be the first major Swift update in five years since Swift 5. This release will be on the 10th anniversary of Swift. Over the years, Swift has evolved significantly, from a mere improvement over Objective-C to a safe, multi-paradigm, and performant language that is easy to use.</p><p>Apple had <a href="https://forums.swift.org/t/on-the-road-to-swift-6/32862">previously mentioned</a> that there would be a succession of <br>Swift 5.x versions introducing incremental changes and new features to pave the way for Swift 6. The major goals mentioned were to improve concurrency support and the memory ownership model. At this point, these have been achieved to a great extent.</p><p>Let’s quickly recap the evolution of Swift 5.x versions over the years.</p><p><strong>Swift 5.1</strong> (Sept 2019) added <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0244-opaque-result-types.md">opaque return types</a> (foundation feature for SwiftUI) <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0255-omit-return.md">implicit returns</a>, and module format stability.</p><p><strong>Swift 5.2</strong> (Mar 2020) brought features like <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0249-key-path-literal-function-expressions.md">key path expressions as functions</a>, and <a href="https://www.hackingwithswift.com/swift/5.2/new-diagnostics">improved diagnostics</a>.</p><p><strong>Swift 5.3</strong> (Sept 2020) brought various language improvements, such as <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0276-multi-pattern-catch-clauses.md">multi-pattern errors catching</a>, <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0279-multiple-trailing-closures.md">multiple trailing closures</a> (which led to significant improvements to SwiftUI APIs), and <a href="https://www.hackingwithswift.com/swift/5.3/spm-improvements">Swift Package Manager improvements</a>.</p><p><strong>Swift 5.4</strong> (Apr 2021) added support for <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0284-multiple-variadic-parameters.md">multiple variadic parameters in functions</a>, and <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0289-result-builders.md">result builder</a>.</p><p><strong>Swift 5.5</strong> (Sept 2021) was a massive update, bringing concurrency-focused features like <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md">async/await</a>,<a href="https://github.com/apple/swift-evolution/blob/main/proposals/0298-asyncsequence.md"> async sequences</a>, <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md">structured concurrency</a>, <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md">actors</a>, <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0316-global-actors.md">global actors</a>, and <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md">Sendable protocol/closures</a>. It also enables the long-awaited <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0307-allow-interchangeable-use-of-double-cgfloat-types.md">interchangeable use of CGFloat and Double types</a>. This update laid the groundwork for other concurrency-related updates in subsequent versions.</p><p><strong>Swift 5.6</strong> (Mar 2022) further improved concurrency and language refinements like <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0315-placeholder-types.md">type placeholders</a> and <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0335-existential-any.md">existential Any</a>. It also added <a href="https://www.hackingwithswift.com/swift/5.6/swiftpm-plugins">plugins for Swift Package Manager</a>.</p><p><strong>Swift 5.7</strong> (Sept 2022) introduced <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0345-if-let-shorthand.md">shorthand syntax for unwrapping optionals</a>, <a href="https://www.hackingwithswift.com/swift/5.7/regexes">Swift Regex</a>, improved interoperability with C APIs, concurrency improvements, and also features a smaller and faster standard library.</p><p><strong>Swift 5.8</strong> (Mar 2023) <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0373-vars-without-limits-in-result-builders.md">relaxed limitations on variables in result builders</a>, <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0365-implicit-self-weak-capture.md">improved implicit self</a>, and allowed <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0376-function-back-deployment.md">back deployment of functions</a>.</p><p><strong>Swift 5.9</strong> (Sept 2023) enhanced generics with <a href="https://www.hackingwithswift.com/swift/5.9/variadic-generics">value and type parameter packs</a> (which eliminated the 10 view limit in SwiftUI), added <a href="https://www.hackingwithswift.com/swift/5.9/macros">macros</a>, improved control flow with <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0380-if-switch-expressions.md">if and switch expressions</a>, and added the ability to <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0381-task-group-discard-results.md">discard task groups</a>.</p><p><strong>Swift 5.10</strong> (Mar 2024) closes all known static data-race safety holes in complete strict concurrency checking. It introduces <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0412-strict-concurrency-for-global-variables.md">strict concurrency for global variables</a> which prevents data races when using global and static variables. It also brings in <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0411-isolated-default-values.md">isolated default value expressions</a> which closes a data-race safety hole that previously permitted isolated default stored property values to be synchronously evaluated from outside the actor.</p><figure><a href="https://swiftify.com/converter/offline/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Whats-new-in-Swift-6"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sZHYZHYbhDCDqNSQBR-YrQ.png" /></a></figure><p>Swift 6 will build upon this base. Let’s dive into its most noticeable features.</p><h4>Expression macro as caller-side argument</h4><p>User-defined macros can now be used as a default argument, just like built-in macros. When user-defined macros are used as default arguments they are expanded at the call site; whereas when they are used as sub-expressions of default arguments, they are expanded at the place they are written. For example, consider the following functions using the #MyFileID macro.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d380ef1d83f109e9ef648303fe02ac34/href">https://medium.com/media/d380ef1d83f109e9ef648303fe02ac34/href</a></iframe><p>Here is how the macro is expanded when it gets called from the app code.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/195484e08ab14e915efd02b1c5abcb98/href">https://medium.com/media/195484e08ab14e915efd02b1c5abcb98/href</a></iframe><h4>Pack Iteration</h4><p>Swift 5.9 introduced parameter value and type parameter packs, which made it possible to write generic functions that accept an arbitrary number of arguments with distinct types. The most noticeable impact was that the 10 view limit in SwiftUI is removed. With Swift 6, we can now iterate over a value pack with for-in loops. This is an advanced feature of Swift and it may significantly impact SwiftUI APIs.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3201f617b6b133da7c38c5eed7731a0c/href">https://medium.com/media/3201f617b6b133da7c38c5eed7731a0c/href</a></iframe><h4>Typed throws</h4><p>Errors in Swift are always type-erased to any Error, which encourages writing generalized error handling code. Once <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0413-typed-throws.md">SE-413</a> has been implemented, functions and closures can throw concrete error types.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5ff8daf1a849952863c40162e2168420/href">https://medium.com/media/5ff8daf1a849952863c40162e2168420/href</a></iframe><h4>count(where:)</h4><p>The count(where:) method lets us easily count elements in a sequence that meets a specific condition, eliminating the need to use filter or reduce methods followed by count, which creates an unnecessary intermediate array.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cccec024fc1590413b118d31e6719417/href">https://medium.com/media/cccec024fc1590413b118d31e6719417/href</a></iframe><h4>128-bit Integer Types</h4><p>New Int128 and UInt128 types are added, expanding the ability to work with large numbers, which is great for large numbers and cryptography.</p><h4>Conclusion</h4><p>The release of Swift 6 is a great milestone for converting your Objective-C apps to Swift, if you haven’t already done so. Switching to Swift allows for the use of brand new frameworks like SwiftUI, SwiftData, RegexBuilder, Algorithms, etc., which makes developing apps faster and easier.</p><p>According to “<a href="https://www.jetbrains.com/lp/devecosystem-2023/languages/">The State of Developer Ecosystem 2023</a>” survey by JetBrains, “Objective-C is objectively retired”. Objective-C has lost two-thirds of its users in the last six years, and in the past year only 2% of the respondents used it in 2023. Also, according to <a href="https://blog.timac.org/2023/1019-state-of-swift-and-swiftui-ios17/">this study</a> on Apple’s use of Swift and SwiftUI in Apple’s binaries, the usage of SwiftUI grew by 70%, while Swift usage grew by 50% from iOS 16 to iOS 17.</p><p>It is clear that the community of Objective-C developers is shrinking, and Apple is gradually gravitating toward Swift in their internal binaries; hence it is a good idea to start migrating to Swift. Migration to Swift also allows for the adoption of SwiftUI and enables your apps to target all Apple platforms.</p><h4>References</h4><p><a href="https://blog.timac.org/2023/1019-state-of-swift-and-swiftui-ios17/">Apple’s use of Swift and SwiftUI in iOS 17</a><a href="https://forums.swift.org/t/on-the-road-to-swift-6/32862"><br>On the road to Swift 6</a><br><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0422-caller-side-default-argument-macro-expression.md">SE-0422: Expression macro as caller-side default argument</a><br><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0408-pack-iteration.md">SE-0408: Pack Iteration</a><br><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0413-typed-throws.md">SE-0413: Typed throws</a><br><a href="https://github.com/apple/swift/blob/release/5.10/CHANGELOG.md">Swift Changelog</a><br><a href="https://www.jetbrains.com/lp/devecosystem-2023/languages/">The State of Developer Ecosystem 2023</a><br><a href="https://www.hackingwithswift.com/swift">What’s new in Swift?</a></p><figure><a href="https://swiftify.com/converter/offline/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Whats-new-in-Swift-6"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sZHYZHYbhDCDqNSQBR-YrQ.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e875ca675a28" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/whats-new-in-swift-6-e875ca675a28">What’s new in Swift 6?</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Storyboard to SwiftUI Converter Producing a Ready-to-Run Xcode Project]]></title>
            <link>https://blog.swiftify.com/storyboard-to-swiftui-converter-producing-a-ready-to-run-xcode-project-a37adaa1f8e7?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/a37adaa1f8e7</guid>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[uikit]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Fri, 15 Dec 2023 10:34:00 GMT</pubDate>
            <atom:updated>2023-12-15T10:34:00.086Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bcXFOYJ-Y1sEV33e5AhYJA.png" /></figure><p>We are happy to announce that the Storyboard to SwiftUI converter now produces a SwiftUI project that compiles and runs out of the box.</p><p>Here is how we convert a <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/blob/main/Calculator-Storyboard/Calculator-Storyboard/Base.lproj/Main.storyboard">storyboard</a> from the Calculator project to SwiftUI.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FP5DfsroicpM%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DP5DfsroicpM&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FP5DfsroicpM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/a323ef5489673365a25a16f48cf022bc/href">https://medium.com/media/a323ef5489673365a25a16f48cf022bc/href</a></iframe><p>Unlike the <a href="https://medium.com/swiftify/storyboard-to-swiftui-converter-supporting-all-controls-cd0dbc117bd5">previous version</a> that combined all output into a single file, the converter now generates a full Xcode project where the source code is organized into groups (Views, Helpers, Models, etc):</p><ul><li>The Views group contains the SwiftUI views.</li><li>The Helpers group contains the extensions required by the SwiftUI views.</li><li>The Models group includes the data models (which will be present if the storyboard contains a UITableView or a UICollectionView).</li></ul><p>You may check our updated converter <a href="https://swiftify.com/converter/storyboard2swiftui/">here</a>. It is free to use for files under 10 KB. We recommend converting smaller XIB and storyboard files to SwiftUI first, thus incrementally converting your project to SwiftUI.</p><p>We would love to hear your feedback and suggestions.<br>You can connect with us on <a href="https://twitter.com/alex_swiftify">Twitter</a>, <a href="https://www.linkedin.com/company/swiftify">LinkedIn</a>, <a href="https://www.facebook.com/swiftify/">Facebook</a>, and <a href="https://github.com/Swiftify-Corp/Swiftify">GitHub</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a37adaa1f8e7" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/storyboard-to-swiftui-converter-producing-a-ready-to-run-xcode-project-a37adaa1f8e7">Storyboard to SwiftUI Converter Producing a Ready-to-Run Xcode Project</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[5 essential tools and tips for iOS developers]]></title>
            <link>https://blog.tarkalabs.com/5-essential-tools-and-tips-for-ios-developers-e8c422f150b4?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8c422f150b4</guid>
            <category><![CDATA[ios-development]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[mac]]></category>
            <category><![CDATA[swift]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Thu, 27 Apr 2023 12:23:51 GMT</pubDate>
            <atom:updated>2023-04-27T12:23:51.955Z</atom:updated>
            <content:encoded><![CDATA[<h3>5 essential tools and tips for every iOS developer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i6u_GZUEY9hZeg5Y-e2B4g.png" /><figcaption>Artwork by <a href="https://medium.com/u/27bc603427b">Gaurav Singh</a></figcaption></figure><p>As an iOS developer, I’m always looking for tools that can help me improve my workflow. Over time, some of these have become absolute essentials in my arsenal of applications, and here they are.</p><h3>1. Cleaner for Xcode</h3><p>If you’ve used Xcode, you know that it’s notorious for eating up disk space. This is particularly true when you update to a newer version of Xcode, because many old files that are no longer required are leftover. This app helps remove unwanted and deprecated files associated with Xcode. It can also clean up all derived data and caches and free up disk space.</p><p><a href="https://apps.apple.com/us/app/cleaner-for-xcode/id1296084683?mt=12">‎Cleaner for Xcode</a></p><h3>2. Rectangle: A Window Manager</h3><p>Quite often, using multiple apps is a necessity. Although window management on Windows is excellent, it could use some enhancements on a Mac. Rectangle steps in to improve window management with keyboard shortcuts and snap areas. I’ve relied on this application, as well as its predecessor, <a href="https://www.spectacleapp.com/">Spectacle</a>, for years, and they’ve proven to be extremely useful for multitasking.</p><p><a href="https://rectangleapp.com/">Rectangle</a></p><h3>3. SF Symbols</h3><p>With SF Symbols, you can incorporate a vast and expanding range of icons into your applications. The best part is that the library keeps growing every year, so you’ll always have fresh icons to work with.</p><p><a href="https://developer.apple.com/sf-symbols/">SF Symbols - Apple Developer</a></p><h3>4. Sigma</h3><p>Sigma, a nifty Figma plugin, is a game-changer for iOS developers that automatically generates SwiftUI code from your designs. I personally haven’t used it much, but with my limited testing, I think it works fine. This time-saving tool can streamline the design-to-development process, and I expect it to be a good time-saver.</p><p><a href="https://www.figma.com/community/plugin/1055606842094169320/Sigma">Figma</a></p><h3>5. Amphetamine</h3><p>This one’s pretty straightforward. Amphetamine keeps your Mac awake, which is perfect during presentations and when you’re running the Macbook in clamshell mode without connecting your laptop to a power source.</p><p><a href="https://apps.apple.com/us/app/amphetamine/id937984704">Amphetamine App - App Store</a></p><h3>Xcode tips for iOS developers</h3><p><strong>Preventing Typos in Xcode</strong></p><p>You can prevent typos across functions and variable names by turning on the spell-checker in Xcode. To turn it on, go to Edit &gt; Format &gt; Spelling and Grammar &gt; Check Spelling While Typing.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cxG7K8sQ2rmLYYAmwetoLQ.png" /></figure><p>You can dive deeper into this by following this <a href="https://sarunw.com/posts/spell-checking-in-xcode">blog by Sarunw</a>.</p><p><strong>Adding a Single AppIcon Image Asset</strong></p><p>If you’re using Xcode 14 or later versions, you can now use a single 1024*1024 AppIcon for iOS and WatchOS targets.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Lz0EnUUuNeJG_MB5VR09Vw.png" /></figure><p><strong>Code Completion with Optional Parameters</strong></p><p>You can enable code completion for optional parameters by using Option ⌥ with return ↵.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hr34KTcPgPvamCiswdEfyg.gif" /></figure><h3>Dock tips for iOS developers</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1002/1*gN32kHjCEV4507LILEcVQg.png" /></figure><p>How I’ve customized my dock:<br>1. Moved the dock to the left since the screens are vertically smaller.<br>2. Minimized windows using Scale Effect. This depends on personal taste, and I find that the animations are quicker and crisp.<br>3. Set the dock to hide automatically. It automatically frees up screen space when the dock is not needed.</p><p>You can hide the dock faster using this command from the Terminal:<br>defaults write com.apple.dock autohide-delay -float 0; defaults write com.apple.dock autohide-time-modifier -int 0;killall Dock</p><p>This can be undone using the following command:<br>defaults write com.apple.dock autohide-delay -float 0.5; defaults write com.apple.dock autohide-time-modifier -int 0.5 ;killall Dock</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zu_Ix4e6-eNqqtlMGCh0Ww.gif" /><figcaption>Dock hiding and unhiding animation</figcaption></figure><p>And we’re done!</p><p>What are some of your go-to applications from your iOS development workflow? Let me know in the comments below!</p><blockquote>If you’ve made it this far, we’re building an incredibly diverse collective of engineers, designers, and product folks at Tarka Labs.</blockquote><blockquote>Check us out 👉 <a href="https://tarkalabs.com/about">https://tarkalabs.com/about</a></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8c422f150b4" width="1" height="1" alt=""><hr><p><a href="https://blog.tarkalabs.com/5-essential-tools-and-tips-for-ios-developers-e8c422f150b4">5 essential tools and tips for iOS developers</a> was originally published in <a href="https://blog.tarkalabs.com">Tarka Labs Blogs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The ultimate VPN detection guide for iOS and Android]]></title>
            <link>https://blog.tarkalabs.com/the-ultimate-vpn-detection-guide-for-ios-and-android-313b521186cb?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/313b521186cb</guid>
            <category><![CDATA[flutter-app-development]]></category>
            <category><![CDATA[vpn]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[react-native-development]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Tue, 11 Apr 2023 12:18:43 GMT</pubDate>
            <atom:updated>2023-05-03T13:57:53.899Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Thy78ujDDtOR2LALzLzlYA.png" /><figcaption>Artwork generated by Dall-E</figcaption></figure><p>A Virtual Private Network (VPN) creates a secure connection between a user’s device and the VPN server by encapsulating data packets in an outer packet using a tunneling protocol. Once the data packets reach the server, they are decrypted and forwarded to their destination on the internet.</p><h4>Why do some service providers disallow VPN Use?</h4><p>The reasons may vary.</p><ol><li>Banks may block VPN connections due to security concerns since they can hide a user’s IP address and encrypt their traffic, which cybercriminals normally use to evade detection.</li><li>OTTs often ban VPNs use due to regional content licensing agreements, varying government laws, and censorship. VPNs can help users bypass content restrictions, leading to legal and ethical concerns for OTTs.</li><li>To prevent users from subscribing from countries where the subscriptions are cheaper.</li></ol><h4>How can we detect VPN Usage?</h4><p>VPN use can be detected both on the server and client sides. Let’s first explore how VPN detection can be done on the server side:</p><ul><li>Check against a list of <a href="https://github.com/X4BNet/lists_vpn/blob/main/output/vpn/ipv4.txt">public</a> / paid VPN Servers IP addresses.</li><li>Analyze the incoming traffic. If you can find a large number of users with the same IP address, then it’s probably a VPN server.</li><li>GeoIP tracking — the user’s location and last login date is analyzed. If there is an unrealistic change in the user’s location in an unrealistic timeframe, it could indicate VPN usage.</li></ul><p>VPN detection on the client side is more straightforward since the data is encrypted on the client side using a tunneling protocol. On the client side, you can check the Network Proxy settings to check if any tunneling protocols are being used.</p><h4>How to detect VPN usage in iOS (Swift)</h4><p>By reading the network proxy settings, you can manually check if tunneling protocols are used. For this, you can use the following code snippet:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/af29c28f640bba32098e0f78fe2a7cd5/href">https://medium.com/media/af29c28f640bba32098e0f78fe2a7cd5/href</a></iframe><p>In the above code snippet, <a href="https://developer.apple.com/documentation/cfnetwork/1426754-cfnetworkcopysystemproxysettings">CFNetworkCopySystemProxySettings</a> is a low-level API that returns current internet proxy settings as a CFDictionary. You can cast this to an NSDictionary and check if any of the tunneling protocols, i.e., tap, tun, ppp, ipsec, utun are in use.</p><h4>How to detect VPN usage in Android (Kotlin)</h4><p>In Android, you can check if the active network is using a VPN by the following code snippet:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/76771c88479c32acee7a0ad4c0d95553/href">https://medium.com/media/76771c88479c32acee7a0ad4c0d95553/href</a></iframe><p><a href="https://developer.android.com/reference/android/net/ConnectivityManager">ConnectivityManager</a> is an Android API to manage network connections. It provides methods to check the availability and status of network connections and request and configure network connections. You can use ConnectivityManager to get the network capabilities of the active network. You can then check if the VPN transport protocol is being used.</p><h4>How to detect VPN usage with Flutter (Dart)</h4><p>In Flutter, the approach is similar to iOS. You can manually check if any of the tunneling protocols are in use:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d4a4deaf5a048bf0edd68f83705a540a/href">https://medium.com/media/d4a4deaf5a048bf0edd68f83705a540a/href</a></iframe><p>Retrieve a list of network interfaces - a <a href="https://api.flutter.dev/flutter/dart-io/NetworkInterface-class.html">NetworkInterface</a> represents an active network interface on the current system. You can then check if any of the interfaces have names that contain tun, ppp, and pptp, which are commonly used in VPN connections.</p><h4>How to detect VPN usage with React Native</h4><p>React Native leverages the platform-specific code discussed above to get the network configuration and detect if a VPN is being used. This can be done by using <a href="https://www.npmjs.com/package/react-native-vpn-detect">the react-native-vpn-detect</a> package.</p><h3>So there you have it!</h3><p>VPN detection is super straightforward on native Android, purely because you don’t have to manually check for tunnelling protocol names in your network proxy settings. Almost all other frameworks manually check for tunnelling protocol names, which can break if the user uses a different tunnelling protocol. These checks can easily break if new tunnelling protocols are added or the APIs change.</p><blockquote>Hi! I’m <a href="https://www.linkedin.com/in/mdibrahimhassan/">Ibrahim</a>, an ex-operations executive turned innovative iOS developer. Currently, I’m creating cutting-edge experiences @ <a href="http://www.tarkalabs.com">TarkaLabs</a> and love to geek out on the latest tech stacks.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=313b521186cb" width="1" height="1" alt=""><hr><p><a href="https://blog.tarkalabs.com/the-ultimate-vpn-detection-guide-for-ios-and-android-313b521186cb">The ultimate VPN detection guide for iOS and Android</a> was originally published in <a href="https://blog.tarkalabs.com">Tarka Labs Blogs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[We Tested Out Kotlin Multiplatform Mobile (KMM). Here’s Our Take.]]></title>
            <link>https://blog.tarkalabs.com/kotlin-multiplatform-mobile-developer-experience-cfdb92d15839?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/cfdb92d15839</guid>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[kotlin-multiplatform]]></category>
            <category><![CDATA[kotlin]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Mon, 06 Mar 2023 12:38:51 GMT</pubDate>
            <atom:updated>2023-05-03T13:48:57.412Z</atom:updated>
            <content:encoded><![CDATA[<h3>We tested out Kotlin Multiplatform Mobile (KMM). Here’s our take.</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*biutMTLp4FXfpaPUqLSIdA.png" /><figcaption>Artwork by <a href="https://medium.com/u/27bc603427b">Gaurav Singh</a></figcaption></figure><p>Kotlin Multiplatform enables you to maintain a single code base for your business logic across mobile platforms (Android and iOS). This is very interesting because there are not many tools out there that helps to unify business logic across platforms.</p><h4>What did we build?</h4><p>We built a simple <a href="https://github.com/tarkalabs/KMM-Expense-Tracker">Expense Tracker Application</a> using KMM, Jetpack Compose, and SwiftUI. The KMM module stores the expenses in a local database and exposes an interface for the iOS and Android apps. Here are some of our findings:</p><h4>Interoperability issues between Objective-C, Swift and Kotlin</h4><p>As the Kotlin compiler creates an iOS framework with Objective-C bindings for the underlying Kotlin code it causes several problems. For example, Kotlin enum are translated to an Objective-C object with the cases added as properties.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_JjsocV0T6EmsT9bABGJkQ.png" /><figcaption>Swift Interface | Kotlin Enum</figcaption></figure><p>For the enum above values() returns a KotlinArray&lt;Category&gt;, which does not conform to Sequence. This can be fixed by converting the KotlinArray to List on the Kotlin side using this approach.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f4779b997c60a9e68c7af277867e9b12/href">https://medium.com/media/f4779b997c60a9e68c7af277867e9b12/href</a></iframe><p>We can use an <a href="https://gist.github.com/Ibrahimhass/d8cc923537a15362950c9bc07914e71a#file-kotlinarray-toarray-swift">extension on KotlinArray</a> but we cannot use generics in that extension as KotlinArray uses some lightweight generics in Objective-C which cannot be used with Swift. So we wrote an helper class that converts KotlinArray to Array&lt;AnyObject&gt; using Generics:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ac876361b708b9d1bfe96a1c661cbab6/href">https://medium.com/media/ac876361b708b9d1bfe96a1c661cbab6/href</a></iframe><h4>Redundant Protocol Conformance for SwiftUI</h4><p>When using SwiftUI, we had to add <a href="https://github.com/tarkalabs/KMM-Expense-Tracker/blob/main/iosApp/iosApp/Utilities/Expense%2BIdentifiable.swift">redundant protocol conformance</a> to Expense so that we can use it to bind to a List.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/440/1*LnaBUt3Q6SpHFsWS9E8xgg.png" /><figcaption><a href="https://github.dev/tarkalabs/KMM-Expense-Tracker/">Expense+Identifiable.swift</a></figcaption></figure><h4>Library Dead-code Elimination</h4><p>We used <a href="https://github.com/Kotlin/kotlinx-datetime">kotlinx-datetime</a> and explored if we could make an Instance object from epoch milliseconds. We could not create an Instance object from epoch milliseconds on the iOS side as the tooling had stripped the required constructor function. The recommended solution is to export the library, but this might increase the compilation time and the binary size. Learn more about this <a href="https://github.com/Kotlin/kotlinx-datetime/issues/78#issuecomment-740573900">here</a>.</p><h4>Limited Coroutine support in iOS</h4><p>Working with coroutines from Swift is tricky as out of the box suspend functions do not have cancellation support, and Flow only has collect function. To solve this we used <a href="https://github.com/rickclephas/KMP-NativeCoroutines">KMP-NativeCoroutines</a> that converts Kotlin Coroutine to swift equivalents i.e. async-await or Combine.</p><blockquote>Like all cross-platform frameworks, KMM has its pros and cons.</blockquote><p>It took a significant amount of time and effort to set up initially. When compared to other cross-platform mobile frameworks, community support is not very substantial, and there are no established guidelines for project architecture or design. However, with a collaborative and cross-functional team, we were able to share much of the business logic using proper abstractions.</p><p>KMM’s performance is comparable to that of a native app, and the development experience for Android developers is similar to that of developing a native Android app, though it may be unfamiliar to iOS developers at first.</p><h3>Conclusion</h3><p>As a relatively new framework, the tooling, community, and best practices around KMM are not yet well-developed. Nonetheless, as more developers and companies adopt KMM, these areas are expected to improve.</p><p>KMM can be a good fit if the mobile development team is cross-functional and exposed to Android and iOS. Also, expertise in Android is required as the tooling and the ecosystem is very similar to native Android development. Many companies like <a href="https://kotlinlang.org/lp/mobile/case-studies/careem">Careem</a>, <a href="https://medium.com/r?url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fnetflixtechblog.com%2Fnetflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23">Netflix</a>, <a href="https://kotlinlang.org/lp/mobile/case-studies/cash-app/">Square</a>, etc. are using KMM in production, but we recommend that teams should build a small application in KMM before committing to the framework.</p><p><strong><em>Special thanks to @kalpeshp03 who worked on this project with me.</em></strong></p><h3>References</h3><ol><li><a href="https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23">Netflix Tech</a></li><li><a href="https://kotlinlang.org/lp/mobile/case-studies/careem">Careem</a></li><li><a href="https://kotlinlang.org/lp/mobile/case-studies/">Kotlin Multiplatform Mobile Case Studies</a></li><li><a href="https://medium.com/kodein-koders/create-a-kotlin-multiplatform-library-with-swift-1a818b2dc1b0">Create a Kotlin/Multiplatform library with Swift</a></li><li><a href="https://medium.com/fiverr-engineering/what-we-learned-using-kmm-for-ios-b0c22a6aa0a3">What We Learned Using KMM For iOS</a></li></ol><blockquote>Hi! I’m <a href="https://www.linkedin.com/in/mdibrahimhassan/">Ibrahim</a>, an ex-operations executive turned innovative iOS developer. Currently, I’m creating cutting-edge experiences @<a href="http://www.tarkalabs.com"> TarkaLabs</a> and love to geek out on the latest tech stacks.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cfdb92d15839" width="1" height="1" alt=""><hr><p><a href="https://blog.tarkalabs.com/kotlin-multiplatform-mobile-developer-experience-cfdb92d15839">We Tested Out Kotlin Multiplatform Mobile (KMM). Here’s Our Take.</a> was originally published in <a href="https://blog.tarkalabs.com">Tarka Labs Blogs</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How many apps use SwiftUI?]]></title>
            <link>https://blog.swiftify.com/how-many-apps-use-swiftui-in-2022-1641e0f2a7a8?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/1641e0f2a7a8</guid>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[app-store]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Tue, 28 Feb 2023 14:02:42 GMT</pubDate>
            <atom:updated>2023-03-01T16:55:36.155Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8dVS2sei_5BQIkF_FxmNFw.png" /></figure><p>At Swiftify, we are keen on tracking the evolution within Apple’s development ecosystem. We recently studied the top 100 applications on the App Store to analyze <a href="https://blog.swiftify.com/how-many-apps-use-swift-in-2022-cd325935f0d3?source=friends_link&amp;sk=808943c55d617eef82ae81d016d444b9">the usage of Swift</a>. After that article, some users naturally asked how many apps in the App Store use SwiftUI?</p><figure><a href="https://twitter.com/YSBoomOfficial/status/1580561555087065088"><img alt="" src="https://cdn-images-1.medium.com/max/945/1*ZBQ1P2GIm1LKKP2LdonFEA.png" /></a></figure><figure><a href="https://medium.com/@unjmwfipr/how-many-use-swiftui-as-oposed-to-uikit-6b25a680d4d6"><img alt="" src="https://cdn-images-1.medium.com/max/828/1*yIxBVWcZks9ZE_1cSdk7_w.png" /></a></figure><p>There are no previous studies on the usage of SwiftUI in apps on the App Store. However some studies look at the usage of Swift and SwiftUI in Apple Frameworks inside <a href="https://blog.timac.org/2021/1219-state-of-swift-and-swiftui-ios15/">iOS 15</a> and <a href="https://blog.timac.org/2022/1005-state-of-swift-and-swiftui-ios16/">iOS 16</a>. In iOS 16, Swift usage has increased from 12.8% to 18.5%, and SwiftUI usage (when compared to UIKit) has increased from 7.3% to 12.6%<strong>.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U4jEl3ITZ6mDyz0wi3YpKg.png" /></figure><h4>Results</h4><p>According to our analysis made in late 2022, out of the top 100 non-game App Store apps (ordered by revenue), 69 apps used SwiftUI. We cannot be sure if all these applications use SwiftUI in the main binary or in a library. But these results are more than we had expected.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j-x7tVSvrxgH34mZAgL4xQ.png" /><figcaption>🤯</figcaption></figure><h4>Methodology</h4><p>To determine whether an app uses SwiftUI, we downloaded the top 100 apps on an iOS 15 device, decrypted them using the <a href="https://github.com/blacktop/ipsw">ipsw</a> tool, and searched for references to SwiftUI by searching for /System/Library/Frameworks/SwiftUI.framework/SwiftUI substring.</p><p>Please note since the introduction of widgets in iOS 14, many apps with a deployment target of iOS 14 and above might have some SwiftUI code just for the widgets.</p><h4>Conclusion</h4><p>Our findings suggest that 69% of all the applications and 90% of applications with a deployment target of iOS 14 and above use SwiftUI directly or depend on libraries that use SwiftUI. The usage of SwiftUI will increase as watchOS Storyboards have been deprecated in Xcode 14. So we can safely assume that SwiftUI is indeed the future of development on the Apple platforms, given that Apple is constantly pushing for its adoption.</p><h4>Data</h4><p>The result of our analysis can be found <a href="https://docs.google.com/spreadsheets/d/1qUIx2nPWEJKZGuvsX7If3tdlK6NV2YK-fCmiOHrOEeo/edit?usp=sharing">here</a>.</p><figure><a href="https://swiftify.com/converter/storyboard2swiftui/"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eCvp_CZUAhUzwBBzQ7SeUA.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1641e0f2a7a8" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/how-many-apps-use-swiftui-in-2022-1641e0f2a7a8">How many apps use SwiftUI?</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Top Mobile App Development Frameworks in 2024]]></title>
            <link>https://blog.swiftify.com/top-mobile-app-development-frameworks-in-2022-ec0b2b7f2952?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/ec0b2b7f2952</guid>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[cross-platform]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[cross-platform-apps]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Thu, 08 Sep 2022 16:54:02 GMT</pubDate>
            <atom:updated>2024-04-08T19:54:24.199Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A8aLOG-4bdfQ-0xNQbEF2Q.jpeg" /></figure><p>Smartphones have become indispensable, with the average US adult having a screen time of <a href="https://elitecontentmarketer.com/screen-time-statistics/">roughly 4 hours</a> daily. In addition to this, 58% of global web traffic comes from mobile phones. Over the years, smartphones have become very capable and efficient to the extent that hardware technologies developed for mobile are finding their way into desktops and laptops like the Apple M1 chips. As of writing, there are roughly <strong>3.5 million</strong> apps on the Google Play Store and nearly <strong>2 million</strong> on the Apple App Store.</p><p>Let us explore some non-native mobile application development frameworks in 2024.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/421/1*KjGu890cNVhhGJHjSiF_uQ.png" /></figure><p>Flutter is an open-source cross-platform UI toolkit for developing highly performant mobile, desktop, and web apps.</p><h4>Advantages of using Flutter:</h4><ol><li>Flutter uses its UI rendering engine (<a href="https://github.com/google/skia">SKIA</a>) and provides a consistent UI with pixel-perfect UI rendering. Hence, the applications look almost the same on different operating systems.</li><li>Flutter provides near-native performance because of Dart’s ahead-of-time compilation, and the Flutter engine’s Dart-to-Native communications use faster binary memory buffers.</li><li>Flutter is growing in popularity with a great community of developers and provides hot reloading, improving the developer experience.</li><li>Dart is the language to program in Flutter and has a mild learning curve.</li></ol><h4>Disadvantages of Flutter:</h4><ol><li>Inferior experience for iOS apps due to <a href="https://github.com/flutter/flutter/issues/61045#issuecomment-768432356">animations jank</a>. Also, the Cupertino widgets are not updated frequently. As of writing, the date and time pickers introduced in iOS 14 are still not supported in Cupertino widgets.</li><li>The apps lack the native look and feel as Flutter does not use the system UI components. When developing with Flutter, you get a Flutter app, not a native iOS or Android App.</li><li>The application size for the most straightforward Flutter app is around 4MB for Android and 10 MB for iOS.</li><li>The framework is relatively new, and a limited number of third-party libraries exist.</li><li>Platforms like tvOS, watchOS, CarPlay, or Android Auto are not yet supported.</li><li>The popularity of Dart is low, and it isn’t easy to find the right talent.</li><li>Since the framework is constantly evolving, there are possible interoperability issues between different packages using different versions of Flutter.</li></ol><p>We recently <a href="https://blog.swiftify.com/how-many-apps-use-swift-in-2022-cd325935f0d3?source=friends_link&amp;sk=808943c55d617eef82ae81d016d444b9">analyzed the top 100 apps</a> on the AppStore to find out the number of applications using Swift. While studying this, we also examined the usage of Flutter and found that none of these applications use Flutter. This is not surprising, as it is a relatively new framework. The top applications on the App Store are from well-established companies with significant resources, which may be more inclined to stick with tried-and-true technologies rather than experimenting with newer ones.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/225/1*_1duheZWdegamRT6905igg.png" /></figure><p>React Native is a mature, open-sourced, cross-platform app development framework from Facebook.</p><h4>Advantages of React Native:</h4><ol><li>React Native uses JavaScript, so the talent pool is quite large. Also, a web developer with React experience can easily pick up React Native.</li><li>Over-the-air updates/code push updates, which can provide updates or patches to the app without going through the app store release process</li><li>React Native renders the native UI elements, making the apps look and behave like native iOS and Android apps.</li><li>Supports other platforms like tvOS, watchOS, CarPlay, and Android Auto.</li></ol><h4>Disadvantages of React Native:</h4><ol><li>You have to rely on many external libraries and open-source maintainers.</li><li>Knowledge of native platforms is required to be a practical React Native developer in a production environment. You need to know that some iOS and Android development knowledge is required for real-world applications.</li><li>The project is hard to debug as the error messages are pretty obscure.</li><li>A React Native app is computationally expensive, the JavaScript code runs inside a JavaScript engine, and the JavaScript context communicates via a bridge with the native code (native host app), which leads to a performance hit on low-spec mobile phones.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*oLeNHP7FajPpG9LiwQdLNw.png" /></figure><p>Qt is open-source software for creating cross-platform applications for Linux, Windows, macOS, Android, iOS, or embedded systems with native capabilities and speed. It provides its custom rendering engine, just like Flutter.</p><h4>Advantages of Qt:</h4><ol><li>The platform is relatively mature, battle-tested, and has been around for 26 years, and the core developer documentation is quite good and detailed.</li><li>It is a perfect option if you have to support multiple platforms like mobile, desktop, and embedded systems. It can run almost anywhere where C++ is supported.</li><li>Since the core of the application logic is in C++, it is a good option if your team is proficient in C++.</li><li>Mature third-party C++ libraries can be used.</li></ol><h4>Disadvantages of Qt:</h4><ol><li>C++ has a steep learning curve, making it difficult for developers without a C++ background.</li><li>Mobile is not a priority for Qt, and the tooling is more geared towards desktop development.</li><li>The community of Qt developers developing non-gaming apps is small, so there is a lack of plugins, libraries, tooling, etc.</li><li>Since Qt uses C++, it is not directly interoperable with Swift.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/473/1*xY_gvoIBOzx1UyZQPu57QA.png" /></figure><p>Xamarin is an open-source mobile app platform for building native and high-performance iOS, Android, tvOS, watchOS, macOS, and Windows apps in C#.</p><h4><strong>Advantages of Xamarin:</strong></h4><ol><li>Xamarin uses C#, a feature-rich and popular language backed by Microsoft.</li><li>Since Xamarin is the oldest cross-platform framework, it has excellent developer documentation and is easy to pick up.</li><li>Existing .NET code (typically from your backend implementation) can be reused in mobile projects to shorten development time.</li><li>It is a Microsoft product; therefore, there will be long-term support and periodic updates like (.NET MAUI).</li></ol><h4>Limitations of Xamarin:</h4><ol><li>It takes some time for Xamarin to integrate the latest OS updates, so the developers have to wait until they can update their apps.</li><li>Some platform-specific knowledge is required.</li><li>The community support is not very good.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/484/1*DAd7rdBcHzHGMgDeqx0XZQ.png" /></figure><p>Kotlin Multiplatform Mobile (KMM) is an SDK for cross-platform mobile application development developed by JetBrains. Kotlin Multiplatform Mobile <strong>simplifies </strong>reusing parts of code<strong> </strong>that previously needed to be written multiple times, like making network requests, storing data, and other business logic.</p><h4>Advantages of using KMM:</h4><ol><li>The apps have full access to Native libraries and UI and are consistent with each platform’s design guidelines. KMM is typically used in a way that’s cross-platform for business logic.</li><li>Since Android developers are already familiar with Kotlin, they can get started easily. Also, Kotlin can be easily adopted by iOS developers developing with Swift.</li></ol><h4>Disadvantages of KMM:</h4><ol><li>Many components are in the early stages of development and can break in the future.</li><li>Requires a cross-functional team working with Objective-C / Swift and Kotlin. Also, iOS developers must learn a new language, build system, IDE, and tooling.</li><li>KMM cannot import pure Swift modules. A Swift library can be used only if its API is exported to Objective-C with @objc, because KMM uses cinterop to support Apple frameworks under the hoods, and can create bindings only from C / Objective-C headers. So the Swift APIs need to be annotated with @objc so that they have an Objective-C <a href="https://blog.swiftify.com/understanding-objective-c-swift-interoperability-xcode-generated-interfaces-5e73a5e3a4ec?source=friends_link&amp;sk=68c49ad9a33697dba2c8d7f229765515">generated interface</a>.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*vyAWYXRZJjWqBV6btX0k1g.png" /></figure><p>Capacitor is a new open-source hybrid app runtime created by the Ionic Framework team. It natively runs modern Web apps on iOS, Android, Electron, and Web.</p><h4>Advantages of Capacitor:</h4><ol><li>Compared with Cordova, it is a more modern framework and uses many new modern APIs.</li><li>It delivers first-class support for web apps and progressive web apps.</li><li>Native mobile developers can use Swift or Objective-C on iOS and Java or Kotlin on Android to build UI experiences or business logic and then expose them to the Web layer through Capacitor’s JavaScript-to-native APIs.</li></ol><h4>Disadvantages of Capacitor:</h4><ol><li>Builds can <a href="https://www.google.com/url?q=https://github.com/ionic-team/capacitor/issues?q%3Dis%253Aissue%2Bcrash&amp;sa=D&amp;source=docs&amp;ust=1661946455156346&amp;usg=AOvVaw1eg9hs8elkWYjMNB9J8-aR">sometimes randomly crash</a> without any reason.</li><li>Debugging can be challenging and time-consuming because of unclear error messages.</li><li>Some native plugins are not ready for production and can conflict with each other.</li><li>The performance is not as good as cross-platform frameworks or native apps.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/538/1*v9tZOGVXvhjlDUHAA00PLA.png" /></figure><p>Cordova is an open-source web-based mobile application development framework. It wraps your web app into a native container that can access several platforms’ device functions and Native APIs.</p><h4>Advantages of Cordova:</h4><ol><li>It provides a faster time to market a product.</li><li>It is also perfect for testing a market.</li><li>The developer community is mature with lots of native plugins.</li></ol><h4>Disadvantages of Cordova:</h4><ol><li>The performance is not as good as cross-platform frameworks or native apps.</li><li>Third-party native plugins can have limited platform support or be outdated.</li><li>Native development expertise might be needed in some cases.</li><li>Cordova is volunteer-driven and does not prioritize the needs of any specific users.</li></ol><h3><strong>Conclusion</strong></h3><p>In terms of business, there are no good or bad tools. Many factors like the following influence the choice:</p><ul><li>Time to market</li><li>Application complexity and scalability</li><li>The skill set of the development team</li><li>Project budget</li></ul><p>Hybrid and cross-platform frameworks promise lesser time to market. You save the development time initially, but in the later stages of development, it takes longer than expected when you have to inevitably write the native iOS and Android code and test the apps. Also, with declarative frameworks like SwiftUI and JetPack Compose, the app development time has been significantly reduced.</p><p>Long-term maintenance of cross-platform and hybrid apps is difficult as they depend on many third-party plugins and frameworks, which usually break with new OS releases. Support for the latest OS features usually takes a while to appear in the corresponding cross-platform components.</p><p>If your application has complex navigation or 3D animations, it isn’t easy to achieve these with cross-platform and hybrid frameworks. All cross-platform and hybrid frameworks have a performance overhead as they are computationally complex.</p><p>Regarding performance, hybrid apps are not very good as they run inside a WebView while communicating with the native APIs. In the case of React Native (cross-platform), it runs a separate JavaScript thread which diminishes the performance. The performance of Flutter is comparatively better, but it has animation jank. These performance issues are more evident when running the apps on lower-spec and old devices.</p><p>Those who advocate for a cross-platform or hybrid framework often say they can have a single codebase to target iOS and Android. However, a single codebase is not very practical in the long term, as there would be a lot of platform-specific checks scattered through the codebase. Also, sharing code among different platforms comes with some overheads. <a href="https://dropbox.tech/mobile/the-not-so-hidden-cost-of-sharing-code-between-ios-and-android">Dropbox</a> did code sharing extensively and later dropped it as the overhead for sharing code eventually became more than maintaining two separate code bases.</p><p>Native applications provide a much better user experience and reliability and are easier to maintain and scale over time. If you are still working on an Objective-C codebase and are planning to <a href="https://medium.com/swiftify/is-migrating-from-objective-c-to-swift-worth-the-investment-148999d15afd?source=friends_link&amp;sk=dcb577550b9f49b6275a8de168cbf462">migrate to Swift</a>, you can save time rewriting the code by using Swiftify to focus more on the creative/intellectual work.</p><figure><a href="https://swiftify.com/converter/offline/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Top_Mobile_App_Development_Frameworks"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Di2Et0NVNOzVb2vdxKPK5w.png" /></a></figure><h4>References:</h4><ul><li><a href="https://dropbox.tech/mobile/the-not-so-hidden-cost-of-sharing-code-between-ios-and-android">The (not so) hidden cost of sharing code between iOS and Android</a></li><li><a href="https://engineering.udacity.com/react-native-a-retrospective-from-the-mobile-engineering-team-at-udacity-89975d6a8102">React Native: A retrospective from the mobile-engineering team at Udacity</a></li><li><a href="https://www.reddit.com/r/FlutterDev/comments/llmkd4/ios_jank_reproducible_example/">iOS jank — Reproducible example</a></li><li><a href="https://www.reddit.com/r/Xamarin/comments/hpvnql/my_xamarin_journey_the_good_the_bad_and_the_ugly/">My Xamarin Journey: the Good, the Bad, and the Ugly</a></li><li><a href="https://youtu.be/aIIL-wG5DkM">Qt vs Flutter — 2020</a></li><li><a href="https://medium.com/@shigmas/my-experience-building-an-app-for-android-and-ios-with-qt-5d4a63ab7d6">My Experience building an app for Android and iOS with Qt</a></li><li><a href="https://www.reddit.com/r/androiddev/comments/8hn8eq/not_sure_whether_to_develop_hybrid_or_native_app/">Not sure whether to develop hybrid or native app for my Medical startup</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ec0b2b7f2952" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/top-mobile-app-development-frameworks-in-2022-ec0b2b7f2952">Top Mobile App Development Frameworks in 2024</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What’s new in Swift 5.7]]></title>
            <link>https://blog.swiftify.com/whats-new-in-swift-5-7-e0a2ba39fb78?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/e0a2ba39fb78</guid>
            <category><![CDATA[application-development]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Wed, 20 Jul 2022 14:03:25 GMT</pubDate>
            <atom:updated>2023-12-12T13:40:01.651Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yqbSIiqgrz_76ymoNcfI0w.png" /></figure><p>Apple’s vision for Swift has been to perform efficiently and to be scalable. Swift 5.7 underwent significant changes to improve the language performance and quality of life improvements, like the if let shorthand syntax. So let’s dive deeper into the improvements and changes in the new Swift release.</p><h4>Swift Package Manager improvements</h4><p>Swift Package Manager now has a new security protocol, Trust on First Use (TOFU), where the fingerprint of a package is recorded on the first download, and subsequent downloads validate this fingerprint. Swift now allows multiple modules in a program to share the same name, thanks to module disambiguation.</p><h4>Smaller and Faster Standard Library</h4><p>The Swift standard library is now smaller and faster. Smaller, faster binaries are a huge benefit when running on event-driven server solutions.</p><h4>Faster build and app launch times</h4><p>Swift 5.7 has faster build times thanks to build parallelization and faster type checking of generics. Protocol checks are now cached, reducing the app launch times. In earlier versions of Swift, the protocols were computed every time the app launched.</p><figure><a href="https://swiftify.com/converter/code/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Whats_New_In_Swift5.7"><img alt="" src="https://cdn-images-1.medium.com/max/779/1*PWlVcQgbzcKQHkMtFkQfaQ.png" /></a></figure><h3>Swift Language Usability</h3><h4>Shorthands for optional unwrapping</h4><p>There are new shorthands for unwrapping optional variables without repeating the variable name for if let, guard, and while</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b8732cedf77795b98293239ab0f77c09/href">https://medium.com/media/b8732cedf77795b98293239ab0f77c09/href</a></iframe><h4>Improved type inference for complex closures</h4><p>Swift’s type inference for closures has improved. It is now able to infer the return type (String) of complex closures like this one:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/82a3bf0e9469b8d837146d2ffbf3970e/href">https://medium.com/media/82a3bf0e9469b8d837146d2ffbf3970e/href</a></iframe><h4>Improved interoperability with C APIs</h4><p>Swift, by design, is type and memory-safe, and never automatically converts between pointers of different types. This behavior contrasts with C, which allows specific pointer conversions. Earlier, this led to problems when using C APIs from Swift, so Swift now has a separate set of rules for calls to imported functions and methods. It allows pointer conversions that would be legal in C even though they usually aren’t in Swift.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n4E8J1u83GlwHzw379PdTQ.png" /></figure><h4>Better string parsing with Swift Regex</h4><p>A regular expression is a powerful tool for pattern matching and string manipulation. Regexes are very compact and sometimes difficult to understand and debug.</p><p>We now have three ways to create a regex. Let’s explore these by writing a regex to extract any words starting with # for the following string:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/271394098dc953122fe57bfabf920350/href">https://medium.com/media/271394098dc953122fe57bfabf920350/href</a></iframe><h4>1) Creating a Regex from string</h4><p>In earlier versions of Swift, we used NSRegularExpression like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/aefc6129b247b0f23825925b4c927ac3/href">https://medium.com/media/aefc6129b247b0f23825925b4c927ac3/href</a></iframe><p>In Swift 5.7 the syntax became much more concise:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b8dbf4f9716748d2e5363b044c6ebe32/href">https://medium.com/media/b8dbf4f9716748d2e5363b044c6ebe32/href</a></iframe><h4>2) Creating a Regex with Regex literal</h4><p>The easiest way to create a regex would be using a regex literal, as shown below. The regex literal provides compile-time checks. You can learn more about regex literals <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0354-regex-literals.md">here</a>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0e319cf35cc7bd6513a97abeeae48e05/href">https://medium.com/media/0e319cf35cc7bd6513a97abeeae48e05/href</a></iframe><h4>3) Creating a Regex using RegexBuilder</h4><p>This provides an expressive result-builder-based, domain-specific language to build regular expressions, very similar to SwiftUI.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/17735a68d7db30ffd7be96fb3793118f/href">https://medium.com/media/17735a68d7db30ffd7be96fb3793118f/href</a></iframe><h4>Unlock existentials for all protocols</h4><p>Swift 5.7 significantly loosens the Swift’s ban on using protocols as types when they have associated type requirements. In simple terms, this means the following code becomes legal:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/94567056461b747c7320c74fee967ccd/href">https://medium.com/media/94567056461b747c7320c74fee967ccd/href</a></iframe><h4>Conclusion</h4><p>Swift 5.7 brings a lot of changes, quality of life improvements, and powerful new features like <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0351-regex-builder.md">Swift regex</a>, <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0329-clock-instant-duration.md">times and durations</a>, distributed actors, and <a href="https://github.com/apple/swift/blob/main/CHANGELOG.md">many others</a>. It also paves the way for the way for <strong>full-thread safety,</strong> which would is planned to be released with Swift 6. The Swift team and collaborators are working on building interoperability with C++. Once implemented, we will be able to call C++ code directly from Swift.</p><h4>References:</h4><p><a href="https://developer.apple.com/wwdc22/110354">What’s new in Swift — WWDC22</a><br><a href="https://www.hackingwithswift.com/articles/249/whats-new-in-swift-5-7">What&#39;s new in Swift 5.7 - Hacking with Swift</a><br><a href="https://www.donnywals.com/whats-the-difference-between-any-and-some-in-swift-5-7/">What’s the difference between any and some in Swift 5.7?</a><br><a href="https://developer.apple.com/videos/play/wwdc2022/110357/">Meet Swift Regex - WWDC22 - Videos - Apple Developer</a></p><p>You can contact us on <a href="https://twitter.com/alex_swiftify">Twitter</a>, <a href="https://www.linkedin.com/company/swiftify">LinkedIn</a>, <a href="https://www.facebook.com/swiftify/">Facebook</a> and <a href="https://github.com/Swiftify-Corp/Swiftify">Github</a>.</p><figure><a href="https://swiftify.com/converter/code/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Whats_New_In_Swift5.7"><img alt="" src="https://cdn-images-1.medium.com/max/779/1*PWlVcQgbzcKQHkMtFkQfaQ.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0a2ba39fb78" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/whats-new-in-swift-5-7-e0a2ba39fb78">What’s new in Swift 5.7</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Converting a Real-World Project from Storyboard to SwiftUI Using Swiftify]]></title>
            <link>https://blog.swiftify.com/storyboard-to-swiftui-converter-supporting-all-controls-cd0dbc117bd5?source=rss-2a62dcb6e4b2------2</link>
            <guid isPermaLink="false">https://medium.com/p/cd0dbc117bd5</guid>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Md. Ibrahim Hassan]]></dc:creator>
            <pubDate>Tue, 22 Feb 2022 14:01:17 GMT</pubDate>
            <atom:updated>2023-09-27T10:27:08.449Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jJ-N7CcsonQHOiliGTTPYQ.png" /></figure><p>We are excited to announce the final release of the <a href="https://swiftify.com/converter/storyboard2swiftui/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Convert_Real-World_Project_from_Storyboard_to_SwiftUI_Using_Swiftify">Storyboard to SwiftUI converter</a>, which now supports all major UIKit controls.</p><p>The converter now <a href="https://developer.apple.com/documentation/swiftui/group">automatically groups</a> SwiftUI views so that the compiler does not complain when dealing with complex view hierarchies.</p><p>At this point, we believe that the Storyboard to SwiftUI Converter can help convert a UIKit project to SwiftUI. For this demo, we took a Calculator project from the CS193p — Developing Apps for iOS Stanford University’s course, converted it to the latest Swift version, and then migrated it to SwiftUI. You can find the UIKit project <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/tree/main/Calculator-Storyboard">here</a>.</p><p>We would convert the storyboard into portrait orientation to get a <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/tree/main/Calculator-SwiftUI(Portrait)">fully functional SwiftUI project</a>. If you want to follow along, please create a new SwiftUI project with Xcode 13+.</p><p><strong>Note:</strong> We create a new SwiftUI project for this demo and import all code from the old storyboard project. For real-world projects, you may instead want to migrate the existing storyboard project to SwiftUI, as explained in <a href="https://stackoverflow.com/a/56515686/">this Stack Overflow post</a>. This way, you can migrate your Storyboard views to SwiftUI incrementally rather than rebuild the whole project at once.</p><figure><a href="https://swiftify.com/converter/storyboard2swiftui/"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GTnKdYumTeEuZqQW3e3Nbg.png" /></a></figure><h4>Convert Main.storyboard (portrait mode) to SwiftUI</h4><p>To get started, convert the Main.storyboard file to SwiftUI using the <a href="https://swiftify.com/converter/storyboard2swiftui/">Storyboard to SwiftUI Converter</a>. Copy the converted SwiftUI code into ContentView.swift replacing all its contents and check the preview:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lh_ynIJOyqzh5gCFMNghkQ.png" /><figcaption>SwiftUI Preview</figcaption></figure><h4>Refactor the converted code</h4><p>Since ContentView.swift is a huge file, we can logically break it into different files:</p><ol><li>Leave ContentView<strong> </strong>struct<strong> </strong>and ContentView_Previews<strong> </strong>struct<strong> </strong>in ContentView.swift</li><li>Move the extension to ContentView, which contains the button actions to ContentView+ButtonActions.swift</li><li>Move the DynamicSize<strong> </strong>struct and View extensions to DynamicSize.swift</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*zeW5Fcl6EGrYN5nvaJor1Q.png" /><figcaption>Project structure after refactoring “ContentView.swift”</figcaption></figure><h4>Completing the button actions</h4><p>Our converter currently handles only the Storyboard or XIB file but not the View Controller’s code. The converter generates the template code for the button actions located in ContentView+ButtonActions.swift.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c3d8ac5e0a2a48d4d3f5894baeee5ae2/href">https://medium.com/media/c3d8ac5e0a2a48d4d3f5894baeee5ae2/href</a></iframe><p>We have to copy the appropriate code from ContentViewController into these action methods, adjusting it to use SwiftUI properties instead of UIKit.</p><ul><li><strong>reset()</strong></li></ul><p>Copy the reset action code from <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/blob/main/Calculator-Storyboard/Calculator-Storyboard/ContentViewController.swift">ContentViewController.swift</a>. The errors can be fixed by:</p><ol><li>Adding brain and userInTheMiddleOfTyping state<strong> </strong>variables. Also, add <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/blob/main/Calculator-Storyboard/Calculator-Storyboard/CalculatorBrain.swift">CalculatorBrain.swift</a> to the project.</li><li>Adding variables computed property, and since variables use a function inside <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/blob/main/Calculator-Storyboard/Calculator-Storyboard/String%2BBeautifyNumbers.swift">String+BeautifyNumbers.swift</a>, we add that as well.</li><li>Removing .text after variable as shown in the image below:</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ha-dSYkCOr5HJgs8zulChQ.png" /><figcaption>Click to zoom</figcaption></figure><p>Similar functions like undo(), storeToMemory() and callMemory()<strong> </strong>can be refactored with the same approach.</p><ul><li><strong>performOperation()</strong></li></ul><p>The performOperation action needs the sender’s title to operate in the <a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/blob/main/Calculator-Storyboard/Calculator-Storyboard/ContentViewController.swift">UIKit project</a>, so we change the action in SwiftUI to accept the title. Here is the refactored button action code:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6957e9f717aa5f95edf57157f94d2ea9/href">https://medium.com/media/6957e9f717aa5f95edf57157f94d2ea9/href</a></iframe><p>We can build a function that constructs a Button with the title and calls the action to avoid code duplication. We can place this builder inside ContentView+ButtonBuilders.swift:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5cc81f84ab6a15fc580f61f66d0c2421/href">https://medium.com/media/5cc81f84ab6a15fc580f61f66d0c2421/href</a></iframe><p>Now we replace the code that creates each operation button with the call to performOperationBuilder() function:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f10a5088e66e4f94a0906eaa4ffa4a44/href">https://medium.com/media/f10a5088e66e4f94a0906eaa4ffa4a44/href</a></iframe><p>Also, touchDigit requires the sender’s title. We can add a builder function for this in ContentView+ButtonBuilders.swift.</p><p>Now we refactor the code that constructs each of the buttons to use the builder:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/336fbe48aa67b612a9df8e16a655096d/href">https://medium.com/media/336fbe48aa67b612a9df8e16a655096d/href</a></iframe><p>Now we can build and run the project with the full functionality present.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ENcxfcfIIxiAF2KLjdecng.png" /><figcaption><a href="https://github.com/Swiftify-Corp/Calculator-SwiftUI/tree/main/Calculator-SwiftUI(Portrait)">Check code</a></figcaption></figure><h4>Final Thoughts and Upcoming Enhancements</h4><p>We would ❤ to know your feedback about the <a href="https://swiftify.com/converter/storyboard2swiftui/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Convert_Real-World_Project_from_Storyboard_to_SwiftUI_Using_Swiftify">converter</a>. You can post your feedback or suggestions <a href="https://github.com/Swiftify-Corp/Storyboard-SwiftUI/issues">here</a>.</p><p>The future version of the converter will add support for platforms like watchOS, tvOS, and macOS.</p><p>In the next release, we would support the remaining elements — UIActivityIndicator, UIProgressView, MKMapView, and WKWebView.</p><p><a href="https://support.swiftify.com/hc/en-us/articles/5190823379858-Storyboard-SwiftUI-Release-Apr-20-"><strong>Update [April 2022]</strong></a><strong>:</strong> We have added support for UIActivityIndicator, UIProgressView, MKMapView, WKWebView and segues.</p><figure><a href="https://swiftify.com/converter/storyboard2swiftui/?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=Convert_Real-World_Project_from_Storyboard_to_SwiftUI_Using_Swiftify"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GTnKdYumTeEuZqQW3e3Nbg.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cd0dbc117bd5" width="1" height="1" alt=""><hr><p><a href="https://blog.swiftify.com/storyboard-to-swiftui-converter-supporting-all-controls-cd0dbc117bd5">Converting a Real-World Project from Storyboard to SwiftUI Using Swiftify</a> was originally published in <a href="https://blog.swiftify.com">Swiftify</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>