{"id":2698,"date":"2026-02-05T10:40:49","date_gmt":"2026-02-05T10:40:49","guid":{"rendered":"https:\/\/demo.materiamedica.net\/demo6\/?p=2698"},"modified":"2026-02-05T10:41:15","modified_gmt":"2026-02-05T10:41:15","slug":"chapter-56-real-life-examples","status":"publish","type":"post","link":"https:\/\/demo.materiamedica.net\/demo6\/chapter-56-real-life-examples\/","title":{"rendered":"Chapter 56: Real-Life Examples"},"content":{"rendered":"<h3 dir=\"auto\">1. Retry a failing operation (most classic real-life use of while)<\/h3>\n<p dir=\"auto\">Network calls, file operations, payment gateways, Bluetooth connections, etc. \u2014 they fail sometimes. A very common pattern is: <strong>try again a few times before giving up<\/strong>.<\/p>\n<div dir=\"auto\">\n<div data-testid=\"code-block\">\n<div>\n<div>Swift<\/div>\n<div>\n<pre tabindex=\"0\"><code>func tryToConnectToServer(maxRetries: Int = 4, delaySeconds: Double = 2.0) -&gt; String? {\r\n    var attempt = 0\r\n    \r\n    while attempt &lt; maxRetries {\r\n        attempt += 1\r\n        \r\n        print(\"Attempt \\(attempt) of \\(maxRetries) \u2013 connecting to server...\")\r\n        \r\n        \/\/ Simulate network call (random success\/failure)\r\n        let success = Bool.random()     \/\/ in real code: URLSession, API call, etc.\r\n        \r\n        if success {\r\n            print(\"Success!\")\r\n            return \"Connected \u2013 welcome!\"\r\n        }\r\n        \r\n        print(\"Failed. Waiting \\(delaySeconds) seconds before retry...\")\r\n        Thread.sleep(forTimeInterval: delaySeconds)\r\n    }\r\n    \r\n    print(\"All \\(maxRetries) attempts failed.\")\r\n    return nil\r\n}\r\n\r\n\/\/ Usage\r\nif let result = tryToConnectToServer() {\r\n    print(result)\r\n} else {\r\n    print(\"Could not connect \u2013 please check your internet and try again later.\")\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p dir=\"auto\"><strong>Why while here?<\/strong><\/p>\n<ul dir=\"auto\">\n<li>We <strong>don\u2019t know<\/strong> in advance how many attempts we\u2019ll need (could succeed on 1st, or fail all)<\/li>\n<li>We have a <strong>clear exit condition<\/strong> (attempts reach limit)<\/li>\n<li>We want to <strong>control<\/strong> the delay and logging between attempts<\/li>\n<\/ul>\n<p dir=\"auto\"><strong>Safety improvement<\/strong> (very common in production code):<\/p>\n<div dir=\"auto\">\n<div data-testid=\"code-block\">\n<div>\n<div>Swift<\/div>\n<div>\n<pre tabindex=\"0\"><code>while attempt &lt; maxRetries {\r\n    attempt += 1\r\n    \/\/ ...\r\n    if success { return result }\r\n    \r\n    \/\/ exponential backoff (realistic)\r\n    let waitTime = delaySeconds * pow(2.0, Double(attempt - 1))\r\n    print(\"Waiting \\(waitTime)s...\")\r\n    Thread.sleep(forTimeInterval: waitTime)\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3 dir=\"auto\">2. Keep asking user for valid input (command-line tools, setup wizards)<\/h3>\n<div dir=\"auto\">\n<div data-testid=\"code-block\">\n<div>\n<div>Swift<\/div>\n<div>\n<pre tabindex=\"0\"><code>func getValidUsername() -&gt; String {\r\n    var username = \"\"\r\n    \r\n    while true {\r\n        print(\"Choose a username (3\u201320 characters, letters\/numbers\/underscores only):\")\r\n        if let input = readLine()?.trimmingCharacters(in: .whitespacesAndNewlines) {\r\n            username = input\r\n            \r\n            if username.count &lt; 3 || username.count &gt; 20 {\r\n                print(\"Username must be between 3 and 20 characters.\")\r\n                continue\r\n            }\r\n            \r\n            let allowed = username.allSatisfy { char in\r\n                char.isLetter || char.isNumber || char == \"_\"\r\n            }\r\n            \r\n            if !allowed {\r\n                print(\"Only letters, numbers, and underscores allowed.\")\r\n                continue\r\n            }\r\n            \r\n            \/\/ all checks passed\r\n            break\r\n        } else {\r\n            print(\"Please enter something.\")\r\n        }\r\n    }\r\n    \r\n    return username\r\n}\r\n\r\nlet chosenName = getValidUsername()\r\nprint(\"Great! Your username is: \\(chosenName)\")<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p dir=\"auto\"><strong>Why while true + break here?<\/strong><\/p>\n<ul dir=\"auto\">\n<li>We <strong>must<\/strong> keep asking until valid input \u2192 no \u201cmaximum tries\u201d<\/li>\n<li>while true + break is very readable for \u201ckeep going until I say stop\u201d<\/li>\n<li>continue skips to next iteration when input is bad<\/li>\n<\/ul>\n<h3 dir=\"auto\">3. Accumulate \/ collect until goal is reached<\/h3>\n<div dir=\"auto\">\n<div data-testid=\"code-block\">\n<div>\n<div>Swift<\/div>\n<div>\n<pre tabindex=\"0\"><code>let savingsGoal: Double = 100_000\r\nvar currentSavings: Double = 0\r\nvar month = 0\r\n\r\nwhile currentSavings &lt; savingsGoal {\r\n    month += 1\r\n    \r\n    let monthlyIncome = 48_000.0\r\n    let monthlyExpenses = 35_000.0 + Double.random(in: -8_000...8_000) \/\/ simulate variation\r\n    let savingsThisMonth = monthlyIncome - monthlyExpenses\r\n    \r\n    currentSavings += savingsThisMonth\r\n    \r\n    print(\"Month \\(month): saved \u20b9\\(String(format: \"%.0f\", savingsThisMonth)) \u2192 total: \u20b9\\(String(format: \"%.0f\", currentSavings))\")\r\n    \r\n    \/\/ safety: prevent infinite loop if expenses always &gt; income\r\n    if month &gt; 120 {\r\n        print(\"Warning: 10 years passed \u2013 goal not reached. Check your budget.\")\r\n        break\r\n    }\r\n}\r\n\r\nif currentSavings &gt;= savingsGoal {\r\n    print(\"Goal reached after \\(month) months! \ud83c\udf89\")\r\n} else {\r\n    print(\"Could not reach goal in reasonable time.\")\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p dir=\"auto\"><strong>Why while here?<\/strong><\/p>\n<ul dir=\"auto\">\n<li>We <strong>don\u2019t know<\/strong> how many months it will take<\/li>\n<li>We have a <strong>clear stopping condition<\/strong> (savings \u2265 goal)<\/li>\n<li>We added a <strong>safety counter<\/strong> (max 120 months) \u2014 very good habit<\/li>\n<\/ul>\n<h3 dir=\"auto\">4. Process items until list is empty<\/h3>\n<div dir=\"auto\">\n<div data-testid=\"code-block\">\n<div>\n<div>Swift<\/div>\n<div>\n<pre tabindex=\"0\"><code>var tasks = [\r\n    \"Buy groceries\",\r\n    \"Finish report\",\r\n    \"Call mom\",\r\n    \"Reply to emails\",\r\n    \"Gym\"\r\n]\r\n\r\nprint(\"Processing tasks one by one...\\n\")\r\n\r\nwhile !tasks.isEmpty {\r\n    let nextTask = tasks.removeFirst()\r\n    print(\"Doing: \\(nextTask)\")\r\n    \r\n    \/\/ simulate work\r\n    print(\"   \u2192 completed!\")\r\n    print(\"   Remaining tasks: \\(tasks.count)\\n\")\r\n}\r\n\r\nprint(\"All tasks finished! \ud83c\udfaf\")<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p dir=\"auto\"><strong>Alternative<\/strong> (often cleaner \u2013 many developers prefer this):<\/p>\n<div dir=\"auto\">\n<div data-testid=\"code-block\">\n<div>\n<div>Swift<\/div>\n<div>\n<pre tabindex=\"0\"><code>while let nextTask = tasks.first {\r\n    tasks.removeFirst()\r\n    print(\"Doing: \\(nextTask)\")\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3 dir=\"auto\">5. Very Common Beginner Mistakes &amp; How to Fix Them<\/h3>\n<div>\n<div dir=\"auto\">\n<table dir=\"auto\">\n<thead>\n<tr>\n<th data-col-size=\"lg\">Mistake<\/th>\n<th data-col-size=\"lg\">Wrong \/ Dangerous code<\/th>\n<th data-col-size=\"xl\">Correct \/ Better habit<\/th>\n<th data-col-size=\"md\">Why?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-col-size=\"lg\">Forgetting to update the condition variable<\/td>\n<td data-col-size=\"lg\">while count &gt; 0 { print(count) }<\/td>\n<td data-col-size=\"xl\">count -= 1 inside loop<\/td>\n<td data-col-size=\"md\">Infinite loop<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">Using while true without safe exit<\/td>\n<td data-col-size=\"lg\">while true { \u2026 }<\/td>\n<td data-col-size=\"xl\">while true { if done { break } } or counter<\/td>\n<td data-col-size=\"md\">Hard to see when it stops<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">Not handling empty collection<\/td>\n<td data-col-size=\"lg\">while array.count &gt; 0 { array[0]\u2026 }<\/td>\n<td data-col-size=\"xl\">while let item = array.first { array.removeFirst() }<\/td>\n<td data-col-size=\"md\">Prevents crash \/ infinite loop<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">Modifying collection while looping over it<\/td>\n<td data-col-size=\"lg\">for item in array { array.append(item) }<\/td>\n<td data-col-size=\"xl\">Use while + removeFirst() or indices<\/td>\n<td data-col-size=\"md\">Runtime error: collection mutated<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">No safety limit<\/td>\n<td data-col-size=\"lg\">while !success { tryAgain() }<\/td>\n<td data-col-size=\"xl\">var attempt = 0; while \u2026 &amp;&amp; attempt &lt; 10 { \u2026 }<\/td>\n<td data-col-size=\"md\">Prevents infinite loop in case of bug<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<\/div>\n<\/div>\n<h3 dir=\"auto\">6. Quick Summary \u2013 When to reach for while<\/h3>\n<div>\n<div dir=\"auto\">\n<table dir=\"auto\">\n<thead>\n<tr>\n<th data-col-size=\"lg\">Situation<\/th>\n<th data-col-size=\"xs\">Use while or repeat \u2026 while?<\/th>\n<th data-col-size=\"md\">Alternative (when to prefer)<\/th>\n<th data-col-size=\"lg\">Typical pattern<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-col-size=\"lg\">Retry until success (network, payment, input)<\/td>\n<td data-col-size=\"xs\">Yes<\/td>\n<td data-col-size=\"md\">for try? in some async cases<\/td>\n<td data-col-size=\"lg\">while attempt &lt; max { try\u2026 }<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">Keep asking user until valid input<\/td>\n<td data-col-size=\"xs\">Yes (repeat \u2026 while)<\/td>\n<td data-col-size=\"md\">while + optional binding<\/td>\n<td data-col-size=\"lg\">repeat { readLine() } while invalid<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">Accumulate until goal \/ threshold<\/td>\n<td data-col-size=\"xs\">Yes<\/td>\n<td data-col-size=\"md\">for if fixed steps<\/td>\n<td data-col-size=\"lg\">while savings &lt; goal { savings += monthly }<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">Process collection until empty<\/td>\n<td data-col-size=\"xs\">Yes<\/td>\n<td data-col-size=\"md\">for item in array { \u2026 } if not modifying<\/td>\n<td data-col-size=\"lg\">while !array.isEmpty { array.removeFirst() }<\/td>\n<\/tr>\n<tr>\n<td data-col-size=\"lg\">You know exact number of iterations<\/td>\n<td data-col-size=\"xs\">\u2014<\/td>\n<td data-col-size=\"md\">for i in 0..&lt;count { \u2026 }<\/td>\n<td data-col-size=\"lg\">for is clearer &amp; safer<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div><\/div>\n<\/div>\n<\/div>\n<h3 dir=\"auto\">7. Small Practice \u2013 Try these now<\/h3>\n<ol dir=\"auto\">\n<li><strong>Countdown<\/strong> Start from 10, count down to 1 with while, then print &#8220;Lift off! \ud83d\ude80&#8221;<\/li>\n<li><strong>Savings until goal<\/strong> Goal: \u20b950,000 Start with \u20b90 Each month add \u20b94,500 + random bonus (\u2013\u20b9500 to +\u20b91,500) Print month and current savings until goal is reached<\/li>\n<li><strong>PIN entry<\/strong> Use repeat \u2026 while to keep asking for a 4-digit PIN until user enters exactly 4 digits (0-9)<\/li>\n<\/ol>\n<p dir=\"auto\">Paste your code here if you want feedback, corrections, or more elegant versions!<\/p>\n<p dir=\"auto\">What would you like to explore next?<\/p>\n<ul dir=\"auto\">\n<li>repeat \u2026 while in more depth<\/li>\n<li>while let pattern (very common with optionals)<\/li>\n<li>Infinite loops \u2014 how to debug &amp; prevent them safely<\/li>\n<li>while vs for vs forEach \u2014 decision guide<\/li>\n<li>Loops in <strong>SwiftUI<\/strong> (ForEach vs manual while)<\/li>\n<li>Or move to another topic (switch, functions, arrays, optionals\u2026)<\/li>\n<\/ul>\n<p dir=\"auto\">Just tell me \u2014 we\u2019ll continue in the same clear, patient, detailed style \ud83d\ude0a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Retry a failing operation (most classic real-life use of while) Network calls, file operations, payment gateways, Bluetooth connections, etc. \u2014 they fail sometimes. A very common pattern is: try again a few times&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[76],"tags":[],"class_list":["post-2698","post","type-post","status-publish","format-standard","hentry","category-swift"],"_links":{"self":[{"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/posts\/2698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/comments?post=2698"}],"version-history":[{"count":1,"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/posts\/2698\/revisions"}],"predecessor-version":[{"id":2699,"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/posts\/2698\/revisions\/2699"}],"wp:attachment":[{"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/media?parent=2698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/categories?post=2698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.materiamedica.net\/demo6\/wp-json\/wp\/v2\/tags?post=2698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}