Skip to main content

Posts

Showing posts with the label Reference

Swift Generics Explained – A Practical Guide

If you've written Swift for even a short time, you've already used Generics —whether you realized it or not. Types like Array , Dictionary , Set , and even Optional are all built using generics. Generics are one of Swift's most powerful language features because they help us write reusable, type-safe, and maintainable code . Let's understand them step by step. Why Do We Need Generics? Imagine writing separate functions for every data type. func printInt(_ value: Int) { ... } func printString(_ value: String) { ... } func printDouble(_ value: Double) { ... } The logic is identical, but we're repeating code simply because the data types are different. One option is to use Any . func printValue(_ value: Any) { print(value) } While this works, it comes with a drawback—you lose compile-time type safety and often need runtime type casting ( as? or as! ). Generics solve this problem by allowing us to write code once and reuse it with different data types without sacr...

Understanding MVVM + Clean Architecture in SwiftUI

When building an iOS app, it's important to organize your code in a way that keeps things clean, testable, and easy to maintain. One of the best ways to do that is by combining MVVM (Model–View–ViewModel) with Clean Architecture . 1. Presentation Layer — The SwiftUI Frontline This is where your app interacts with the user . In SwiftUI, the View and ViewModel live in this layer. View (SwiftUI View): These are your UI screens — for example, ContentView , LoginView , or ProfileView . SwiftUI Views are simple and reactive. They observe data and automatically update the UI when something changes. struct ContentView: View { @StateObject var viewModel = ContentViewModel() var body: some View { VStack { if viewModel.isLoading { ProgressView() } else { List(viewModel.items) { item in Text(item.title) } } } .onAppear { viewModel.fetchItems() } ...

Benefits of Swift Testing over XCTest

If you’ve been building apps in Swift for a while, you’ve probably spent some time writing tests with  XCTest . It’s been the default testing framework on Apple platforms for years, and while it does the job, it often feels… a little clunky. Now enter Swift Testing — a newer, more modern testing framework that’s part of the Swift open-source project. The difference is immediately noticeable. Writing tests with Swift Testing feels like writing Swift code, not fighting a bunch of boilerplate. Here are some of the reasons why many developers are starting to prefer Swift Testing over XCTest: 1. The Syntax Just Flows Better In XCTest, you’re constantly reaching for XCTAssertEqual , XCTAssertTrue , XCTAssertNil , and so on. Each one has its own function, and you need to remember which is which. In Swift Testing, you simply use #expect with plain Swift expressions: #expect(result == 42) Compare that to: XCTAssertEqual(result, 42) Not a huge difference in one line, but when you multiply ...

Atomic Design Pattern in SwiftUI

Atomic Design is a methodology for creating design systems with a clear, consistent hierarchy. It was introduced by Brad Frost and is inspired by chemistry. The core idea is to break down UI components into the smallest possible parts (atoms) and compose them to build more complex components and pages. Atomic Design Hierarchy 1. Atoms 
The basic building blocks of UI — buttons, labels, text fields, icons, colors, spacing units.
Example: PrimaryButton, AppText, Icon 2. Molecules 
 Groupings of atoms that form simple components.
Example: SearchBar = TextField + Icon, LabeledSwitch 3. Organisms 
 Relatively complex, standalone components made of atoms and molecules.
Example: LoginForm, UserCard, HeaderView 4. Templates 
 Layouts or skeletons that define the structure of pages using organisms.
Example: AuthScreenTemplate, DashboardTemplate 5. Pages 
 Final screens with real data/content, composed of templates.
Example: LoginScreen, SettingsScreen. Here is how an example folders structure l...

Quick look on abbreviations in SE (Software Engineering)

 Here's a quick reference list with some common abbreviations that I have came across frequently in my Engineering journey :  1. PR – Pull Request A request submitted by a developer to merge their code changes from one branch to another, typically for review and collaboration before integration. 2. MR – Merge Request Similar to a Pull Request, a Merge Request is used in GitLab to request code merging. It includes review, discussion, and approval before finalizing changes. 3. CR – Change Request A formal proposal to modify a system or product, often triggered by stakeholder feedback, bug reports, or evolving requirements. 4. LADR – Lightweight Architectural Decision Record A brief document that captures an important architectural decision made during a project. 5. BRD – Business Requirement Document Outlines the high-level business needs, objectives, and expectations of a project. It's used as a reference for aligning technical development with business goals. 6. LLD – Low...

Sorting Algorithms – Quick Reference for Interviews

Sorting is a fundamental operation in computer science and Understanding the basic sorting algorithms is essential for both interviews and real-world programming tasks. I am sharing the notes that I have taken in my learning curve. 1. Selection Sort Selection Sort repeatedly finds the minimum element from the unsorted part and puts it at the beginning. Steps: Loop through the array. For each index, find the smallest element in the rest of the array. Swap it with the current index. Time Complexity: O(n²) Example: [29, 10, 14, 37, 13] → [10, 29, 14, 37, 13] → [10, 13, 14, 37, 29] → [10, 13, 14, 37, 29] → [10, 13, 14, 29, 37] 2. Insertion Sort Insertion Sort builds the sorted array one element at a time by inserting each element into its correct position. Steps: Start from index 1. Compare current element with the left-side elements. Shift elements to the right and insert at the correct position. Time Complexity: O(n²) Example: [8, 4, 1, 3] → [4, 8, 1, 3] → [1, 4, 8, 3] → [1, 3, 4, 8] 3. ...

Successfully installing CocoaPods in M1 Macs

Installation steps of cocoapods in the new Macs with M1 chipset is little different than Intel based Macs. If we casually run `pod install`, we are likely to encounter error related to the ffi gem 🤨. Open the terminal and follow below steps to solve the error and install pod dependencies successfully. Step1 : At first, install ffi gem intel version > sudo arch -x86_64 gem install ffi Steps 2: Install cocoapod  > sudo gem install cocoapods Steps 3 (optional) : Go to project root folder and initialise pod file if not created already. > arch -x86_64 pod init Steps 4: Now Install pod dependencies. > arch -x86_64 pod install

HackerRank Exercise : Kangaroo Number Line Jumps Solved in Swift 5.0

Given two kangaroos on a number line ready to jump in the positive direction, we have to figure out a way to get both kangaroos at the same location at the same time as part of the show. If it is possible, return YES , otherwise return NO . Read full problem statement from here Working solution in Swift           func kangaroo ( x1 : Int , v1 : Int , x2 : Int , v2 : Int ) -> String {         var multiplier = 1         // 1.         while (multiplier < 10000 ) {             // 2.             if (x1+(v1*multiplier) == x2+(v2*multiplier)) {                 return "YES"             }                          multiplier += 1         }            ...

HackerRank Exercise: Subarray Division solved in Swift 5

 In this post we can see complete solution for the HackerRank Exercise Subarray Division. The problem statement goes like this - Determine how many ways can divide the chocolate bar (as contiguous segment) between Lily and Ron given condition :  The length of the segment matches Ron's birth month The sum of the integers on the squares is equal to his birth day. Read complete challenge detail from HackerRank Working solution in Swift given below:      func birthday ( s : [ Int ] , d : Int , m : Int ) -> Int { var sCount = 0 var index = 0 // 1 while ( index < s. count ) { var dayLength = 0 let limit = index +m > s. count ? s. count : index +m // 2 for jIndex in index ..< limit { dayLength += s [ jIndex ] } // 3 if dayLength == d { sCount += 1 } ...

HackerRank Exercise: Apple and Orange solved in Swift

 In this post we can solve exercise problem "Apple and Orange" in which we should print the number of apples and oranges that land on Sam's house.  Read complete challenge detail from  hackerrank.com Full Swift Solution is given below: func countApplesAndOranges ( s : Int , t : Int , a : Int , b : Int , apples : [ Int ] , oranges : [ Int ]) -> Void { // 1 let applesDistance = apples. map ( { $ 0 + a }) var totalAppleOk = 0 applesDistance. forEach ({ ad in // 2 if ( s .. . t ) . contains ( ad ) { totalAppleOk = totalAppleOk + 1 } }) print ( " \( totalAppleOk ) " ) // prints number of Apples let orangeDistance = oranges. map ( { $ 0 + b }) var totalOrangeOk = 0 orangeDistance. forEach ({ od in if ( s .. . t ) . contains ( od ) { totalOrangeOk = totalOrangeOk ...

Hackerrank Exercise : Utopian Tree solved in Swift

In this post, we have Swift 5.0 solution for Hackerrank exercise - Utopian Tree . We have find out the height of  Utopian Tree, which goes through 2 cycles of growth every year. Each spring, it doubles in height. Each summer, its height increases by 1 meter. Full details of exercise link  hackerrank.com/challenges/utopian-tree/problem Here is the working solution:           func   utopianTree ( n :   Int )   ->   Int   {          var   height   =   0          for   cycle   in   0 .. . n   {              height   =   ( cycle   -   1 )   %   2   ==   0   ?   height   *   2   :   height   +   1            }  ...

Safari Technology Preview | Best way to debug WebPages in iPhone, iPad or Mac Apps.

I enjoyed using Web Inspector tool from Safari Developer options to debug active web pages in iPhone or iPad. For instance, WKWebView running on iPhone. With the update of MacOS Big Sur 11.4 it got broke !! The Safari (14.1.1) web inspector only limited to Sources, Console and Audit. Also this issue started floating in SO thread here . Last week I got rescued by a lesser known application (at lest in my team!) Safari Technology Preview from Apple. Safari Technology Preview app will give you full scale options includes the most recent version of WebKit, the rendering engine that powers Safari. It requires a Mac running macOS Mojave v10.14 or later. I highly recommend this Apple provided in-house Browser for Developer.

Pocket guide to iOS app development enthusiasts

I would like to share all possible channels & resources that helps to pitch in iOS development. I'm sure existing iOS ninjas who are already consuming those in one or other ways. Before listing my points - we all know it's most important to keep updated techs and trends. Many cases I have seen some of the channels & connections helped developers to get their new jobs or app contracts. 1. Apple's Official Developer guide. Apple Documentation  is the first go over for all references.  Swift.org for Swift Language starting point. WWDC Videos (& New app launched as well) 2. Social Media Groups - Fast & easy way to connect with iOS community. Facebook Group   Twitter Lists for iOS handles 3. Slack workspaces - A sweet hub of all iOS developers connected by channels. ios-developers.slack.com (Suggested) 4. Online Courses   - Gives opportunity to learn and be certified developers. Udemy AppBrewery  Alison ( and more ) 5...

UICollectionViewCell shows with wrong size on First time - Solved

We commonly use Collection view where its cell size calculated run time. The flow layout delegate is responsible to return individual cell sizes. BUT in most of the cases, delegate method `collectionView: layout sizeForItem:` expects cell size too early. Before generating actual cell size. extension YourViewController : UICollectionViewDelegateFlowLayout { func collectionView ( _ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize (width: externalWidth, height: externalHeight) } } For instance, if a cell size depends on external view and its frame is not yet ready - results with wrong (or outdated) cell size. Typically happens for the first time view controller laid out all views. You can find similar queries in StackOverflow community : Collection view sizeForItemNotWorking UICollectionViewCell content wrong size on first load How to refresh UICollec...

Popular posts from this blog

Implementing autocompletion OTP field in iOS

Long waiting is over. !!  iOS 12 brings Autofill for OTP text field which is close to Android provided a decade back. Previously in iOS we used to toggle between OTP text screen and message inbox.  Which was hard to remember and time consuming resulting a bad user experience. Personally, I have been asked from the client/customer couple of times to implement autocompletion for OTP field and took me a lot of time to convey that it is not possible in iOS. Why Autofill was not possible previously?  We all know that Apple gives at most care for user privacy. When we see iOS architecture, each individual app is like a separate island. There is no inter-app bridge between apps (exception for Keychain and URLSchemes APIs which gives very limited scope). Thus we cannot read message content from inbox. Where to start Autofilling? First of all, the target SMS need to have the OTP Code with prefix string "Code" or "Passcode"on its message content. Beware of OTP c...

Animating label text update - choosing a better way

Recently I published a countdown app .  At one point of development - I have to show a timer on a UILabel which ticks on each seconds. As usual I started  setting text to a label object - self .timerLabel.text = someString Easy piece of cake right !?   But wait ... it won't take much user attention when timer ticks on every seconds. So I decided to make use of a simple animation while label gets text update. I found there are dozens of ways to animate a label. In this short article, I listed 3 best way you can animate text on a label. ( Spoiler Alert 👀- I decided to go with 3rd option)  1. Fade In - Fade out animation : CATransition class has got transition type `fade`. With timing function of CATransition - I was able to see the below result. let animation: CATransition = CATransition () animation.timingFunction = CAMediaTimingFunction (name: CAMediaTimingFunctionName .easeInEaseOut) animation.type = CATransitionType .fade animation.subtype = C...

Cached Async Image in SwiftUI

 SwiftUI’s AsyncImage is handy, but every time your view appears, it refetches the image—leading to flicker, delays, and unnecessary network use. What if you could fetch once, then reuse instantly? That's exactly what the Cached Async Image  delivers: a memory-powered caching layer that keeps SwiftUI image loading smooth, snappy, and resilient. First a simple in-memory cache without disk persistence. This will be thread-safe and auto-purges under memory pressure. A Singleton wrapping NSCache for URL → UIImage caching as follows : final class ImageCache {   static let shared = ImageCache()   private init() {}   private let cache = NSCache<NSURL, UIImage>()   func image(for url: URL) -> UIImage? {     cache.object(forKey: url as NSURL)   }   func insertImage(_ image: UIImage?, for url: URL) {     guard let image else { return }     cache.setObject(image, forKey: url as NSURL)   }   func clearAll() { ...

Prevent Navigationbar or Tabbar overlapping Subview - solved for Card view

Recently, I started with a Card view added as a subview of UIView in a view-controller. When a view controller created along subviews, it tends to use entire screen bounds and also slips behind Tab bar or Navigation bar. In my current situation, it's second case. Casually new iOS developers will write a patch by additional value for coordinate y and subtracting bar height from its size. A lot of them posted in SO threads too : How to prevent UINavigationBar from covering top of view? View got hidden below UINavigationBar iOS 7 Navigation Bar covers some part of view at Top So, how I got solved ? self.edgesForExtendedLayout = [] This  will avoid all subviews in a view controller get behind any bars. Read full apple  documentation on here. Full Source code below :  //Simple view controller where its view layed-out as a card. class WidgetCardViewController : UIViewController { var containerView = UIView () //MARK:- View Controller Life Cyc...

UICollectionViewCell shows with wrong size on First time - Solved

We commonly use Collection view where its cell size calculated run time. The flow layout delegate is responsible to return individual cell sizes. BUT in most of the cases, delegate method `collectionView: layout sizeForItem:` expects cell size too early. Before generating actual cell size. extension YourViewController : UICollectionViewDelegateFlowLayout { func collectionView ( _ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize (width: externalWidth, height: externalHeight) } } For instance, if a cell size depends on external view and its frame is not yet ready - results with wrong (or outdated) cell size. Typically happens for the first time view controller laid out all views. You can find similar queries in StackOverflow community : Collection view sizeForItemNotWorking UICollectionViewCell content wrong size on first load How to refresh UICollec...