[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"summary-4263963c5856f897-10-ios-pitfalls-to-skip-for-faster-swiftui-builds-summary":3,"summaries-facets-categories":102,"summary-related-4263963c5856f897-10-ios-pitfalls-to-skip-for-faster-swiftui-builds-summary":3671},{"id":4,"title":5,"ai":6,"body":13,"categories":67,"created_at":69,"date_modified":69,"description":61,"extension":70,"faq":69,"featured":71,"kicker_label":69,"meta":72,"navigation":84,"path":85,"published_at":69,"question":69,"scraped_at":86,"seo":87,"sitemap":88,"source_id":89,"source_name":90,"source_type":91,"source_url":92,"stem":93,"tags":94,"thumbnail_url":69,"tldr":99,"tweet":69,"unknown_tags":100,"__hash__":101},"summaries\u002Fsummaries\u002F4263963c5856f897-10-ios-pitfalls-to-skip-for-faster-swiftui-builds-summary.md","10 iOS Pitfalls to Skip for Faster SwiftUI Builds",{"provider":7,"model":8,"input_tokens":9,"output_tokens":10,"processing_time_ms":11,"cost_usd":12},"openrouter","x-ai\u002Fgrok-4.1-fast",8840,1820,17395,0.00265535,{"type":14,"value":15,"toc":60},"minimark",[16,21,25,28,31,34,38,41,44,47,51,54,57],[17,18,20],"h2",{"id":19},"adopt-mvvm-and-master-state-to-prevent-unmaintainable-views","Adopt MVVM and Master State to Prevent Unmaintainable Views",[22,23,24],"p",{},"Separate concerns into Model (data structs like User), ViewModel (logic, @Published state, async calls), and View (UI only) to enable previews, testing, and scalability—even in prototypes. This avoids monolithic files that break on feature adds.",[22,26,27],{},"Distinguish SwiftUI property wrappers by ownership: @State for local view data (e.g., CounterView's count +=1 persists on redraws); @Binding to mutate parent state in children (e.g., ToggleRow mutates SettingsView's notificationsEnabled); @ObservedObject for shared external ViewModels (e.g., TimerViewModel owned elsewhere, observed by TimerDisplay); @StateObject for view-owned ViewModels (e.g., LoginView owns LoginViewModel, survives redraws). Data flows parent-to-child; correct ownership ensures predictable UI updates without resets or stale views.",[22,29,30],{},"For navigation, replace nested NavigationView with iOS 16+ NavigationStack for type-safe paths: use NavigationLink(value: item) with .navigationDestination(for: Item.self) { DetailView(item: $0) }, or state-driven @State path: $path with .navigationDestination(item: $selectedItem).",[22,32,33],{},"Centralize networking in singleton HttpApiManager with async\u002Fawait generics: get\u003CT: Decodable> appends endpoints to baseURL, decodes JSON; post\u003CT,U> sets POST body\u002Fheaders. ViewModels call @MainActor func fetchUser() { user = try await shared.get(\"\u002Fuser\u002Fprofile\") }, enabling reuse, logging, and error handling in one spot.",[17,35,37],{"id":36},"streamline-builds-and-configurations-to-eliminate-xcode-fights","Streamline Builds and Configurations to Eliminate Xcode Fights",[22,39,40],{},"Ditch CocoaPods\u002FCarthage for Swift Package Manager (SPM): Xcode-native, auto-resolves versions, faster builds, no Pods\u002F folder clutter, supports targets\u002Fconfigs—ideal post-Xcode updates. Migrate now for future-proofing.",[22,42,43],{},"Manage files exclusively in Xcode to avoid broken references; verify File Inspector target membership and commit .xcodeproj\u002F.xcworkspace to git.",[22,45,46],{},"Use environment-specific Info.plist or .xcconfig for keys\u002Fpermissions (e.g., NSCameraUsageDescription) via DEBUG\u002FSTAGING\u002FRELEASE flags to prevent crashes or App Review rejections from mismatched staging\u002Fproduction configs.",[17,48,50],{"id":49},"test-early-and-handle-lifecycle-for-production-reliability","Test Early and Handle Lifecycle for Production Reliability",[22,52,53],{},"Write XCTest for ViewModels (e.g., testLoginStartsWithEmptyCredentials asserts vm.email == \"\"; testLoginValidationFailsForEmptyFields asserts !vm.canLogin) before refactors; aim for key coverage, run pre-push via CI like GitHub Actions\u002FXcode Cloud. Keep logic in testable ViewModels, not Views.",[22,55,56],{},"Add AppDelegate even in SwiftUI (@UIApplicationDelegateAdaptor(AppDelegate.self)): handle didFinishLaunching (request notifications), didEnterBackground\u002FwillEnterForeground (hooks for sync\u002Fanalytics), with helpers like sendNotification for local alerts.",[22,58,59],{},"Start free with Apple ID (7-day device installs for prototypes); enroll $99\u002Fyear for TestFlight (100 internal\u002F external testers via App Store Connect links) and archiving (Xcode > Product > Archive > Distribute App) to share builds, gather feedback, and catch bugs pre-launch.",{"title":61,"searchDepth":62,"depth":62,"links":63},"",2,[64,65,66],{"id":19,"depth":62,"text":20},{"id":36,"depth":62,"text":37},{"id":49,"depth":62,"text":50},[68],"Software Engineering",null,"md",false,{"content_references":73,"triage":79},[74],{"type":75,"title":76,"url":77,"context":78},"other","10 Common Mistakes Every Android Developer Should Avoid (Learned the Hard Way)","https:\u002F\u002Fmedium.com\u002Fstackademic\u002F10-common-mistakes-every-android-developer-should-avoid-learned-the-hard-way-54991f1b2bb7","mentioned",{"relevance":80,"novelty":81,"quality":80,"actionability":80,"composite":82,"reasoning":83},4,3,3.8,"Category: Software Engineering. The article provides practical advice on common pitfalls in iOS development using SwiftUI, addressing specific pain points like code structure and dependency management. It offers actionable steps, such as adopting MVVM and using Swift Package Manager, which can directly improve the audience's development process.",true,"\u002Fsummaries\u002F4263963c5856f897-10-ios-pitfalls-to-skip-for-faster-swiftui-builds-summary","2026-04-15 15:26:08",{"title":5,"description":61},{"loc":85},"4263963c5856f897","__oneoff__","article","https:\u002F\u002Fblog.stackademic.com\u002F10-common-mistakes-every-ios-developer-should-avoid-learned-the-hard-way-cf01a8830505","summaries\u002F4263963c5856f897-10-ios-pitfalls-to-skip-for-faster-swiftui-builds-summary",[95,96,97,98],"software-engineering","dev-productivity","swiftui","ios","Structure code with MVVM from day one, use SPM for dependencies, master SwiftUI state wrappers, centralize APIs, add tests and AppDelegate early, and leverage free Apple ID plus TestFlight to ship without setup headaches.",[95,96,97,98],"-iPItcXvXJxBu9R5y7nP4V0-MSaNg0xllg8Hqg1iSp0",[103,106,109,112,115,118,120,122,124,126,128,130,133,135,137,139,141,143,145,147,149,151,154,157,159,161,163,165,167,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,418,420,422,425,427,429,431,433,435,437,439,441,443,445,447,449,451,453,455,457,459,461,463,465,467,469,471,473,475,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667,669,671,673,675,677,679,681,683,685,687,689,691,693,695,697,699,701,703,705,707,709,711,713,715,717,719,721,723,725,727,729,731,733,735,737,739,741,743,745,747,749,751,753,755,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789,791,793,795,797,799,801,803,805,807,809,811,813,815,817,819,821,823,825,827,829,831,833,835,837,839,841,843,845,847,849,851,853,855,857,859,861,863,865,867,869,871,873,875,877,879,881,883,885,887,889,891,893,895,897,899,901,903,905,907,909,911,913,915,917,919,921,923,925,927,929,931,933,935,937,939,941,943,945,947,949,951,953,955,957,959,961,963,965,967,969,971,973,975,977,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055,1057,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107,1109,1111,1113,1115,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085,2087,2089,2091,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347,2349,2351,2353,2355,2357,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607,2609,2611,2613,2615,2617,2619,2621,2623,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891,2893,2895,2897,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919,2921,2923,2925,2927,2929,2931,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951,2953,2955,2957,2959,2961,2963,2965,2967,2969,2971,2973,2975,2977,2979,2981,2983,2985,2987,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033,3035,3037,3039,3041,3043,3045,3047,3049,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071,3073,3075,3077,3079,3081,3083,3085,3087,3089,3091,3093,3095,3097,3099,3101,3103,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127,3129,3131,3133,3135,3137,3139,3141,3143,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227,3229,3231,3233,3235,3237,3239,3241,3243,3245,3247,3249,3251,3253,3255,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311,3313,3315,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337,3339,3341,3343,3345,3347,3349,3351,3353,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431,3433,3435,3437,3439,3441,3443,3445,3447,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523,3525,3527,3529,3531,3533,3535,3537,3539,3541,3543,3545,3547,3549,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597,3599,3601,3603,3605,3607,3609,3611,3613,3615,3617,3619,3621,3623,3625,3627,3629,3631,3633,3635,3637,3639,3641,3643,3645,3647,3649,3651,3653,3655,3657,3659,3661,3663,3665,3667,3669],{"categories":104},[105],"Developer Productivity",{"categories":107},[108],"Business & SaaS",{"categories":110},[111],"AI & LLMs",{"categories":113},[114],"AI Automation",{"categories":116},[117],"Product Strategy",{"categories":119},[111],{"categories":121},[105],{"categories":123},[108],{"categories":125},[],{"categories":127},[111],{"categories":129},[],{"categories":131},[132],"AI News & Trends",{"categories":134},[114],{"categories":136},[132],{"categories":138},[114],{"categories":140},[114],{"categories":142},[111],{"categories":144},[111],{"categories":146},[132],{"categories":148},[111],{"categories":150},[],{"categories":152},[153],"Design & Frontend",{"categories":155},[156],"Data Science & Visualization",{"categories":158},[132],{"categories":160},[],{"categories":162},[68],{"categories":164},[111],{"categories":166},[114],{"categories":168},[169],"Marketing & Growth",{"categories":171},[111],{"categories":173},[114],{"categories":175},[],{"categories":177},[],{"categories":179},[153],{"categories":181},[114],{"categories":183},[105],{"categories":185},[153],{"categories":187},[111],{"categories":189},[114],{"categories":191},[132],{"categories":193},[],{"categories":195},[],{"categories":197},[114],{"categories":199},[68],{"categories":201},[],{"categories":203},[108],{"categories":205},[],{"categories":207},[],{"categories":209},[114],{"categories":211},[114],{"categories":213},[111],{"categories":215},[],{"categories":217},[68],{"categories":219},[],{"categories":221},[],{"categories":223},[],{"categories":225},[111],{"categories":227},[169],{"categories":229},[153],{"categories":231},[153],{"categories":233},[111],{"categories":235},[114],{"categories":237},[111],{"categories":239},[111],{"categories":241},[114],{"categories":243},[114],{"categories":245},[156],{"categories":247},[132],{"categories":249},[114],{"categories":251},[169],{"categories":253},[114],{"categories":255},[117],{"categories":257},[],{"categories":259},[114],{"categories":261},[],{"categories":263},[114],{"categories":265},[68],{"categories":267},[153],{"categories":269},[111],{"categories":271},[],{"categories":273},[],{"categories":275},[114],{"categories":277},[],{"categories":279},[111],{"categories":281},[],{"categories":283},[105],{"categories":285},[68],{"categories":287},[108],{"categories":289},[132],{"categories":291},[111],{"categories":293},[],{"categories":295},[111],{"categories":297},[],{"categories":299},[68],{"categories":301},[156],{"categories":303},[],{"categories":305},[111],{"categories":307},[153],{"categories":309},[],{"categories":311},[153],{"categories":313},[114],{"categories":315},[],{"categories":317},[114],{"categories":319},[132],{"categories":321},[111],{"categories":323},[],{"categories":325},[114],{"categories":327},[111],{"categories":329},[117],{"categories":331},[],{"categories":333},[111],{"categories":335},[114],{"categories":337},[114],{"categories":339},[],{"categories":341},[156],{"categories":343},[111],{"categories":345},[],{"categories":347},[105],{"categories":349},[108],{"categories":351},[111],{"categories":353},[114],{"categories":355},[68],{"categories":357},[111],{"categories":359},[],{"categories":361},[],{"categories":363},[111],{"categories":365},[],{"categories":367},[153],{"categories":369},[],{"categories":371},[111],{"categories":373},[],{"categories":375},[114],{"categories":377},[111],{"categories":379},[153],{"categories":381},[],{"categories":383},[111],{"categories":385},[111],{"categories":387},[108],{"categories":389},[114],{"categories":391},[111],{"categories":393},[153],{"categories":395},[114],{"categories":397},[],{"categories":399},[],{"categories":401},[132],{"categories":403},[],{"categories":405},[111],{"categories":407},[108,169],{"categories":409},[],{"categories":411},[111],{"categories":413},[],{"categories":415},[],{"categories":417},[111],{"categories":419},[],{"categories":421},[111],{"categories":423},[424],"DevOps & Cloud",{"categories":426},[],{"categories":428},[132],{"categories":430},[153],{"categories":432},[],{"categories":434},[132],{"categories":436},[132],{"categories":438},[111],{"categories":440},[169],{"categories":442},[],{"categories":444},[108],{"categories":446},[],{"categories":448},[111,424],{"categories":450},[111],{"categories":452},[111],{"categories":454},[114],{"categories":456},[111,68],{"categories":458},[156],{"categories":460},[111],{"categories":462},[169],{"categories":464},[114],{"categories":466},[114],{"categories":468},[],{"categories":470},[114],{"categories":472},[111,108],{"categories":474},[],{"categories":476},[153],{"categories":478},[153],{"categories":480},[],{"categories":482},[],{"categories":484},[132],{"categories":486},[],{"categories":488},[105],{"categories":490},[68],{"categories":492},[111],{"categories":494},[153],{"categories":496},[114],{"categories":498},[68],{"categories":500},[132],{"categories":502},[153],{"categories":504},[],{"categories":506},[111],{"categories":508},[111],{"categories":510},[111],{"categories":512},[132],{"categories":514},[105],{"categories":516},[111],{"categories":518},[114],{"categories":520},[424],{"categories":522},[153],{"categories":524},[114],{"categories":526},[],{"categories":528},[],{"categories":530},[153],{"categories":532},[132],{"categories":534},[156],{"categories":536},[],{"categories":538},[111],{"categories":540},[111],{"categories":542},[108],{"categories":544},[111],{"categories":546},[111],{"categories":548},[132],{"categories":550},[],{"categories":552},[114],{"categories":554},[68],{"categories":556},[],{"categories":558},[111],{"categories":560},[111],{"categories":562},[114],{"categories":564},[],{"categories":566},[],{"categories":568},[111],{"categories":570},[],{"categories":572},[108],{"categories":574},[114],{"categories":576},[],{"categories":578},[105],{"categories":580},[111],{"categories":582},[108],{"categories":584},[132],{"categories":586},[],{"categories":588},[],{"categories":590},[],{"categories":592},[132],{"categories":594},[132],{"categories":596},[],{"categories":598},[],{"categories":600},[108],{"categories":602},[],{"categories":604},[],{"categories":606},[105],{"categories":608},[],{"categories":610},[169],{"categories":612},[114],{"categories":614},[108],{"categories":616},[114],{"categories":618},[],{"categories":620},[117],{"categories":622},[153],{"categories":624},[68],{"categories":626},[111],{"categories":628},[114],{"categories":630},[108],{"categories":632},[111],{"categories":634},[],{"categories":636},[],{"categories":638},[68],{"categories":640},[156],{"categories":642},[117],{"categories":644},[114],{"categories":646},[111],{"categories":648},[],{"categories":650},[424],{"categories":652},[],{"categories":654},[114],{"categories":656},[],{"categories":658},[],{"categories":660},[111],{"categories":662},[153],{"categories":664},[169],{"categories":666},[114],{"categories":668},[],{"categories":670},[105],{"categories":672},[],{"categories":674},[132],{"categories":676},[111,424],{"categories":678},[132],{"categories":680},[111],{"categories":682},[108],{"categories":684},[111],{"categories":686},[],{"categories":688},[108],{"categories":690},[],{"categories":692},[68],{"categories":694},[153],{"categories":696},[132],{"categories":698},[156],{"categories":700},[105],{"categories":702},[111],{"categories":704},[68],{"categories":706},[],{"categories":708},[],{"categories":710},[117],{"categories":712},[],{"categories":714},[111],{"categories":716},[],{"categories":718},[153],{"categories":720},[153],{"categories":722},[153],{"categories":724},[],{"categories":726},[],{"categories":728},[132],{"categories":730},[114],{"categories":732},[111],{"categories":734},[111],{"categories":736},[111],{"categories":738},[108],{"categories":740},[111],{"categories":742},[],{"categories":744},[68],{"categories":746},[68],{"categories":748},[108],{"categories":750},[],{"categories":752},[111],{"categories":754},[111],{"categories":756},[108],{"categories":758},[132],{"categories":760},[169],{"categories":762},[114],{"categories":764},[],{"categories":766},[153],{"categories":768},[],{"categories":770},[111],{"categories":772},[],{"categories":774},[108],{"categories":776},[114],{"categories":778},[],{"categories":780},[424],{"categories":782},[156],{"categories":784},[68],{"categories":786},[169],{"categories":788},[68],{"categories":790},[114],{"categories":792},[],{"categories":794},[],{"categories":796},[114],{"categories":798},[105],{"categories":800},[114],{"categories":802},[117],{"categories":804},[108],{"categories":806},[],{"categories":808},[111],{"categories":810},[117],{"categories":812},[111],{"categories":814},[111],{"categories":816},[169],{"categories":818},[153],{"categories":820},[114],{"categories":822},[],{"categories":824},[],{"categories":826},[424],{"categories":828},[68],{"categories":830},[],{"categories":832},[114],{"categories":834},[111],{"categories":836},[153,111],{"categories":838},[105],{"categories":840},[],{"categories":842},[111],{"categories":844},[105],{"categories":846},[153],{"categories":848},[114],{"categories":850},[68],{"categories":852},[],{"categories":854},[111],{"categories":856},[],{"categories":858},[105],{"categories":860},[],{"categories":862},[114],{"categories":864},[117],{"categories":866},[111],{"categories":868},[111],{"categories":870},[153],{"categories":872},[114],{"categories":874},[424],{"categories":876},[153],{"categories":878},[114],{"categories":880},[111],{"categories":882},[111],{"categories":884},[111],{"categories":886},[132],{"categories":888},[],{"categories":890},[117],{"categories":892},[114],{"categories":894},[153],{"categories":896},[114],{"categories":898},[68],{"categories":900},[153],{"categories":902},[114],{"categories":904},[132],{"categories":906},[],{"categories":908},[111],{"categories":910},[153],{"categories":912},[111],{"categories":914},[105],{"categories":916},[132],{"categories":918},[111],{"categories":920},[169],{"categories":922},[111],{"categories":924},[111],{"categories":926},[114],{"categories":928},[114],{"categories":930},[111],{"categories":932},[114],{"categories":934},[153],{"categories":936},[111],{"categories":938},[],{"categories":940},[],{"categories":942},[68],{"categories":944},[],{"categories":946},[105],{"categories":948},[424],{"categories":950},[],{"categories":952},[105],{"categories":954},[108],{"categories":956},[169],{"categories":958},[],{"categories":960},[108],{"categories":962},[],{"categories":964},[],{"categories":966},[],{"categories":968},[],{"categories":970},[],{"categories":972},[111],{"categories":974},[114],{"categories":976},[424],{"categories":978},[105],{"categories":980},[111],{"categories":982},[68],{"categories":984},[117],{"categories":986},[111],{"categories":988},[169],{"categories":990},[111],{"categories":992},[111],{"categories":994},[111],{"categories":996},[111,105],{"categories":998},[68],{"categories":1000},[68],{"categories":1002},[153],{"categories":1004},[111],{"categories":1006},[],{"categories":1008},[],{"categories":1010},[],{"categories":1012},[68],{"categories":1014},[156],{"categories":1016},[132],{"categories":1018},[153],{"categories":1020},[],{"categories":1022},[111],{"categories":1024},[111],{"categories":1026},[],{"categories":1028},[],{"categories":1030},[114],{"categories":1032},[111],{"categories":1034},[108],{"categories":1036},[],{"categories":1038},[105],{"categories":1040},[111],{"categories":1042},[105],{"categories":1044},[111],{"categories":1046},[68],{"categories":1048},[169],{"categories":1050},[111,153],{"categories":1052},[132],{"categories":1054},[153],{"categories":1056},[],{"categories":1058},[424],{"categories":1060},[153],{"categories":1062},[114],{"categories":1064},[],{"categories":1066},[],{"categories":1068},[],{"categories":1070},[],{"categories":1072},[68],{"categories":1074},[114],{"categories":1076},[114],{"categories":1078},[111],{"categories":1080},[111],{"categories":1082},[],{"categories":1084},[153],{"categories":1086},[],{"categories":1088},[],{"categories":1090},[114],{"categories":1092},[],{"categories":1094},[],{"categories":1096},[169],{"categories":1098},[169],{"categories":1100},[114],{"categories":1102},[],{"categories":1104},[111],{"categories":1106},[111],{"categories":1108},[68],{"categories":1110},[153],{"categories":1112},[153],{"categories":1114},[114],{"categories":1116},[105],{"categories":1118},[111],{"categories":1120},[153],{"categories":1122},[153],{"categories":1124},[114],{"categories":1126},[114],{"categories":1128},[111],{"categories":1130},[],{"categories":1132},[],{"categories":1134},[111],{"categories":1136},[114],{"categories":1138},[132],{"categories":1140},[68],{"categories":1142},[105],{"categories":1144},[111],{"categories":1146},[],{"categories":1148},[114],{"categories":1150},[114],{"categories":1152},[],{"categories":1154},[105],{"categories":1156},[111],{"categories":1158},[105],{"categories":1160},[105],{"categories":1162},[],{"categories":1164},[],{"categories":1166},[114],{"categories":1168},[114],{"categories":1170},[111],{"categories":1172},[111],{"categories":1174},[132],{"categories":1176},[156],{"categories":1178},[117],{"categories":1180},[132],{"categories":1182},[153],{"categories":1184},[],{"categories":1186},[132],{"categories":1188},[],{"categories":1190},[],{"categories":1192},[],{"categories":1194},[],{"categories":1196},[68],{"categories":1198},[156],{"categories":1200},[],{"categories":1202},[111],{"categories":1204},[111],{"categories":1206},[156],{"categories":1208},[68],{"categories":1210},[],{"categories":1212},[],{"categories":1214},[114],{"categories":1216},[132],{"categories":1218},[132],{"categories":1220},[114],{"categories":1222},[105],{"categories":1224},[111,424],{"categories":1226},[],{"categories":1228},[153],{"categories":1230},[105],{"categories":1232},[114],{"categories":1234},[153],{"categories":1236},[],{"categories":1238},[114],{"categories":1240},[114],{"categories":1242},[111],{"categories":1244},[169],{"categories":1246},[68],{"categories":1248},[153],{"categories":1250},[],{"categories":1252},[114],{"categories":1254},[111],{"categories":1256},[114],{"categories":1258},[114],{"categories":1260},[114],{"categories":1262},[169],{"categories":1264},[114],{"categories":1266},[111],{"categories":1268},[],{"categories":1270},[169],{"categories":1272},[132],{"categories":1274},[114],{"categories":1276},[],{"categories":1278},[],{"categories":1280},[111],{"categories":1282},[114],{"categories":1284},[132],{"categories":1286},[114],{"categories":1288},[],{"categories":1290},[],{"categories":1292},[],{"categories":1294},[114],{"categories":1296},[],{"categories":1298},[],{"categories":1300},[156],{"categories":1302},[111],{"categories":1304},[156],{"categories":1306},[132],{"categories":1308},[111],{"categories":1310},[111],{"categories":1312},[114],{"categories":1314},[111],{"categories":1316},[],{"categories":1318},[],{"categories":1320},[424],{"categories":1322},[],{"categories":1324},[],{"categories":1326},[105],{"categories":1328},[],{"categories":1330},[],{"categories":1332},[],{"categories":1334},[],{"categories":1336},[68],{"categories":1338},[132],{"categories":1340},[169],{"categories":1342},[108],{"categories":1344},[111],{"categories":1346},[111],{"categories":1348},[108],{"categories":1350},[],{"categories":1352},[153],{"categories":1354},[114],{"categories":1356},[108],{"categories":1358},[111],{"categories":1360},[111],{"categories":1362},[105],{"categories":1364},[],{"categories":1366},[105],{"categories":1368},[111],{"categories":1370},[169],{"categories":1372},[114],{"categories":1374},[132],{"categories":1376},[108],{"categories":1378},[111],{"categories":1380},[114],{"categories":1382},[],{"categories":1384},[111],{"categories":1386},[105],{"categories":1388},[111],{"categories":1390},[],{"categories":1392},[132],{"categories":1394},[111],{"categories":1396},[],{"categories":1398},[108],{"categories":1400},[111],{"categories":1402},[],{"categories":1404},[],{"categories":1406},[],{"categories":1408},[111],{"categories":1410},[],{"categories":1412},[424],{"categories":1414},[111],{"categories":1416},[],{"categories":1418},[111],{"categories":1420},[111],{"categories":1422},[111],{"categories":1424},[111,424],{"categories":1426},[111],{"categories":1428},[111],{"categories":1430},[153],{"categories":1432},[114],{"categories":1434},[],{"categories":1436},[114],{"categories":1438},[111],{"categories":1440},[111],{"categories":1442},[111],{"categories":1444},[105],{"categories":1446},[105],{"categories":1448},[68],{"categories":1450},[153],{"categories":1452},[114],{"categories":1454},[],{"categories":1456},[111],{"categories":1458},[132],{"categories":1460},[111],{"categories":1462},[108],{"categories":1464},[],{"categories":1466},[424],{"categories":1468},[153],{"categories":1470},[153],{"categories":1472},[114],{"categories":1474},[132],{"categories":1476},[114],{"categories":1478},[111],{"categories":1480},[],{"categories":1482},[111],{"categories":1484},[],{"categories":1486},[],{"categories":1488},[111],{"categories":1490},[111],{"categories":1492},[111],{"categories":1494},[114],{"categories":1496},[111],{"categories":1498},[],{"categories":1500},[156],{"categories":1502},[114],{"categories":1504},[],{"categories":1506},[111],{"categories":1508},[132],{"categories":1510},[],{"categories":1512},[153],{"categories":1514},[424],{"categories":1516},[132],{"categories":1518},[68],{"categories":1520},[68],{"categories":1522},[132],{"categories":1524},[132],{"categories":1526},[424],{"categories":1528},[],{"categories":1530},[132],{"categories":1532},[111],{"categories":1534},[105],{"categories":1536},[132],{"categories":1538},[],{"categories":1540},[156],{"categories":1542},[132],{"categories":1544},[68],{"categories":1546},[132],{"categories":1548},[424],{"categories":1550},[111],{"categories":1552},[111],{"categories":1554},[],{"categories":1556},[108],{"categories":1558},[],{"categories":1560},[],{"categories":1562},[111],{"categories":1564},[111],{"categories":1566},[111],{"categories":1568},[111],{"categories":1570},[],{"categories":1572},[156],{"categories":1574},[105],{"categories":1576},[],{"categories":1578},[111],{"categories":1580},[111],{"categories":1582},[424],{"categories":1584},[424],{"categories":1586},[],{"categories":1588},[114],{"categories":1590},[132],{"categories":1592},[132],{"categories":1594},[111],{"categories":1596},[114],{"categories":1598},[],{"categories":1600},[153],{"categories":1602},[111],{"categories":1604},[111],{"categories":1606},[],{"categories":1608},[],{"categories":1610},[424],{"categories":1612},[111],{"categories":1614},[68],{"categories":1616},[108],{"categories":1618},[111],{"categories":1620},[],{"categories":1622},[114],{"categories":1624},[105],{"categories":1626},[105],{"categories":1628},[],{"categories":1630},[111],{"categories":1632},[153],{"categories":1634},[114],{"categories":1636},[],{"categories":1638},[111],{"categories":1640},[111],{"categories":1642},[114],{"categories":1644},[],{"categories":1646},[114],{"categories":1648},[68],{"categories":1650},[],{"categories":1652},[111],{"categories":1654},[],{"categories":1656},[111],{"categories":1658},[],{"categories":1660},[111],{"categories":1662},[111],{"categories":1664},[],{"categories":1666},[111],{"categories":1668},[132],{"categories":1670},[111],{"categories":1672},[111],{"categories":1674},[105],{"categories":1676},[111],{"categories":1678},[132],{"categories":1680},[114],{"categories":1682},[],{"categories":1684},[111],{"categories":1686},[169],{"categories":1688},[],{"categories":1690},[],{"categories":1692},[],{"categories":1694},[105],{"categories":1696},[132],{"categories":1698},[114],{"categories":1700},[111],{"categories":1702},[153],{"categories":1704},[114],{"categories":1706},[],{"categories":1708},[114],{"categories":1710},[],{"categories":1712},[111],{"categories":1714},[114],{"categories":1716},[111],{"categories":1718},[],{"categories":1720},[111],{"categories":1722},[111],{"categories":1724},[132],{"categories":1726},[153],{"categories":1728},[114],{"categories":1730},[153],{"categories":1732},[108],{"categories":1734},[],{"categories":1736},[],{"categories":1738},[111],{"categories":1740},[105],{"categories":1742},[132],{"categories":1744},[],{"categories":1746},[],{"categories":1748},[68],{"categories":1750},[153],{"categories":1752},[],{"categories":1754},[111],{"categories":1756},[],{"categories":1758},[169],{"categories":1760},[111],{"categories":1762},[424],{"categories":1764},[68],{"categories":1766},[],{"categories":1768},[114],{"categories":1770},[111],{"categories":1772},[114],{"categories":1774},[114],{"categories":1776},[111],{"categories":1778},[],{"categories":1780},[105],{"categories":1782},[111],{"categories":1784},[108],{"categories":1786},[68],{"categories":1788},[153],{"categories":1790},[],{"categories":1792},[],{"categories":1794},[],{"categories":1796},[114],{"categories":1798},[153],{"categories":1800},[132],{"categories":1802},[111],{"categories":1804},[132],{"categories":1806},[153],{"categories":1808},[],{"categories":1810},[153],{"categories":1812},[132],{"categories":1814},[108],{"categories":1816},[111],{"categories":1818},[132],{"categories":1820},[169],{"categories":1822},[],{"categories":1824},[],{"categories":1826},[156],{"categories":1828},[111,68],{"categories":1830},[132],{"categories":1832},[111],{"categories":1834},[114],{"categories":1836},[114],{"categories":1838},[111],{"categories":1840},[],{"categories":1842},[68],{"categories":1844},[111],{"categories":1846},[156],{"categories":1848},[114],{"categories":1850},[169],{"categories":1852},[424],{"categories":1854},[],{"categories":1856},[105],{"categories":1858},[114],{"categories":1860},[114],{"categories":1862},[68],{"categories":1864},[111],{"categories":1866},[111],{"categories":1868},[],{"categories":1870},[],{"categories":1872},[],{"categories":1874},[424],{"categories":1876},[132],{"categories":1878},[111],{"categories":1880},[111],{"categories":1882},[111],{"categories":1884},[],{"categories":1886},[156],{"categories":1888},[108],{"categories":1890},[],{"categories":1892},[114],{"categories":1894},[424],{"categories":1896},[],{"categories":1898},[153],{"categories":1900},[153],{"categories":1902},[],{"categories":1904},[68],{"categories":1906},[153],{"categories":1908},[111],{"categories":1910},[],{"categories":1912},[132],{"categories":1914},[111],{"categories":1916},[153],{"categories":1918},[114],{"categories":1920},[132],{"categories":1922},[],{"categories":1924},[114],{"categories":1926},[153],{"categories":1928},[111],{"categories":1930},[],{"categories":1932},[111],{"categories":1934},[111],{"categories":1936},[424],{"categories":1938},[132],{"categories":1940},[156],{"categories":1942},[156],{"categories":1944},[],{"categories":1946},[],{"categories":1948},[],{"categories":1950},[114],{"categories":1952},[68],{"categories":1954},[68],{"categories":1956},[],{"categories":1958},[],{"categories":1960},[111],{"categories":1962},[],{"categories":1964},[114],{"categories":1966},[111],{"categories":1968},[],{"categories":1970},[111],{"categories":1972},[108],{"categories":1974},[111],{"categories":1976},[169],{"categories":1978},[114],{"categories":1980},[111],{"categories":1982},[68],{"categories":1984},[132],{"categories":1986},[114],{"categories":1988},[],{"categories":1990},[132],{"categories":1992},[114],{"categories":1994},[114],{"categories":1996},[],{"categories":1998},[108],{"categories":2000},[114],{"categories":2002},[],{"categories":2004},[111],{"categories":2006},[105],{"categories":2008},[132],{"categories":2010},[424],{"categories":2012},[114],{"categories":2014},[114],{"categories":2016},[105],{"categories":2018},[111],{"categories":2020},[],{"categories":2022},[],{"categories":2024},[153],{"categories":2026},[111,108],{"categories":2028},[],{"categories":2030},[105],{"categories":2032},[156],{"categories":2034},[111],{"categories":2036},[68],{"categories":2038},[111],{"categories":2040},[114],{"categories":2042},[111],{"categories":2044},[111],{"categories":2046},[132],{"categories":2048},[114],{"categories":2050},[],{"categories":2052},[],{"categories":2054},[114],{"categories":2056},[111],{"categories":2058},[424],{"categories":2060},[],{"categories":2062},[111],{"categories":2064},[114],{"categories":2066},[],{"categories":2068},[111],{"categories":2070},[169],{"categories":2072},[156],{"categories":2074},[114],{"categories":2076},[111],{"categories":2078},[424],{"categories":2080},[],{"categories":2082},[111],{"categories":2084},[169],{"categories":2086},[153],{"categories":2088},[111],{"categories":2090},[],{"categories":2092},[169],{"categories":2094},[132],{"categories":2096},[111],{"categories":2098},[111],{"categories":2100},[105],{"categories":2102},[],{"categories":2104},[],{"categories":2106},[153],{"categories":2108},[111],{"categories":2110},[156],{"categories":2112},[169],{"categories":2114},[169],{"categories":2116},[132],{"categories":2118},[],{"categories":2120},[],{"categories":2122},[111],{"categories":2124},[],{"categories":2126},[111,68],{"categories":2128},[132],{"categories":2130},[114],{"categories":2132},[68],{"categories":2134},[111],{"categories":2136},[105],{"categories":2138},[],{"categories":2140},[],{"categories":2142},[105],{"categories":2144},[169],{"categories":2146},[111],{"categories":2148},[],{"categories":2150},[153,111],{"categories":2152},[424],{"categories":2154},[105],{"categories":2156},[],{"categories":2158},[108],{"categories":2160},[108],{"categories":2162},[111],{"categories":2164},[68],{"categories":2166},[114],{"categories":2168},[132],{"categories":2170},[169],{"categories":2172},[153],{"categories":2174},[111],{"categories":2176},[111],{"categories":2178},[111],{"categories":2180},[105],{"categories":2182},[111],{"categories":2184},[114],{"categories":2186},[132],{"categories":2188},[],{"categories":2190},[],{"categories":2192},[156],{"categories":2194},[68],{"categories":2196},[111],{"categories":2198},[153],{"categories":2200},[156],{"categories":2202},[111],{"categories":2204},[111],{"categories":2206},[114],{"categories":2208},[114],{"categories":2210},[111,108],{"categories":2212},[],{"categories":2214},[153],{"categories":2216},[],{"categories":2218},[111],{"categories":2220},[132],{"categories":2222},[105],{"categories":2224},[105],{"categories":2226},[114],{"categories":2228},[111],{"categories":2230},[108],{"categories":2232},[68],{"categories":2234},[169],{"categories":2236},[],{"categories":2238},[132],{"categories":2240},[111],{"categories":2242},[111],{"categories":2244},[132],{"categories":2246},[68],{"categories":2248},[111],{"categories":2250},[114],{"categories":2252},[132],{"categories":2254},[111],{"categories":2256},[153],{"categories":2258},[111],{"categories":2260},[111],{"categories":2262},[424],{"categories":2264},[117],{"categories":2266},[114],{"categories":2268},[111],{"categories":2270},[132],{"categories":2272},[114],{"categories":2274},[169],{"categories":2276},[111],{"categories":2278},[],{"categories":2280},[111],{"categories":2282},[],{"categories":2284},[],{"categories":2286},[],{"categories":2288},[108],{"categories":2290},[111],{"categories":2292},[114],{"categories":2294},[132],{"categories":2296},[132],{"categories":2298},[132],{"categories":2300},[132],{"categories":2302},[],{"categories":2304},[105],{"categories":2306},[114],{"categories":2308},[132],{"categories":2310},[105],{"categories":2312},[114],{"categories":2314},[111],{"categories":2316},[111,114],{"categories":2318},[114],{"categories":2320},[424],{"categories":2322},[132],{"categories":2324},[132],{"categories":2326},[114],{"categories":2328},[111],{"categories":2330},[],{"categories":2332},[132],{"categories":2334},[169],{"categories":2336},[105],{"categories":2338},[111],{"categories":2340},[111],{"categories":2342},[],{"categories":2344},[68],{"categories":2346},[],{"categories":2348},[105],{"categories":2350},[114],{"categories":2352},[132],{"categories":2354},[111],{"categories":2356},[132],{"categories":2358},[105],{"categories":2360},[132],{"categories":2362},[132],{"categories":2364},[],{"categories":2366},[108],{"categories":2368},[114],{"categories":2370},[132],{"categories":2372},[132],{"categories":2374},[132],{"categories":2376},[132],{"categories":2378},[132],{"categories":2380},[132],{"categories":2382},[132],{"categories":2384},[132],{"categories":2386},[132],{"categories":2388},[132],{"categories":2390},[156],{"categories":2392},[105],{"categories":2394},[111],{"categories":2396},[111],{"categories":2398},[],{"categories":2400},[111,105],{"categories":2402},[],{"categories":2404},[114],{"categories":2406},[132],{"categories":2408},[114],{"categories":2410},[111],{"categories":2412},[111],{"categories":2414},[111],{"categories":2416},[111],{"categories":2418},[111],{"categories":2420},[114],{"categories":2422},[108],{"categories":2424},[153],{"categories":2426},[132],{"categories":2428},[111],{"categories":2430},[],{"categories":2432},[],{"categories":2434},[114],{"categories":2436},[153],{"categories":2438},[111],{"categories":2440},[],{"categories":2442},[],{"categories":2444},[169],{"categories":2446},[111],{"categories":2448},[],{"categories":2450},[],{"categories":2452},[105],{"categories":2454},[108],{"categories":2456},[111],{"categories":2458},[108],{"categories":2460},[153],{"categories":2462},[],{"categories":2464},[132],{"categories":2466},[],{"categories":2468},[153],{"categories":2470},[111],{"categories":2472},[169],{"categories":2474},[],{"categories":2476},[169],{"categories":2478},[],{"categories":2480},[],{"categories":2482},[114],{"categories":2484},[],{"categories":2486},[108],{"categories":2488},[105],{"categories":2490},[153],{"categories":2492},[68],{"categories":2494},[],{"categories":2496},[],{"categories":2498},[111],{"categories":2500},[105],{"categories":2502},[169],{"categories":2504},[],{"categories":2506},[114],{"categories":2508},[114],{"categories":2510},[132],{"categories":2512},[111],{"categories":2514},[114],{"categories":2516},[111],{"categories":2518},[114],{"categories":2520},[111],{"categories":2522},[117],{"categories":2524},[132],{"categories":2526},[],{"categories":2528},[169],{"categories":2530},[68],{"categories":2532},[114],{"categories":2534},[],{"categories":2536},[111],{"categories":2538},[114],{"categories":2540},[108],{"categories":2542},[105],{"categories":2544},[111],{"categories":2546},[153],{"categories":2548},[68],{"categories":2550},[68],{"categories":2552},[111],{"categories":2554},[156],{"categories":2556},[111],{"categories":2558},[114],{"categories":2560},[108],{"categories":2562},[114],{"categories":2564},[111],{"categories":2566},[111],{"categories":2568},[114],{"categories":2570},[132],{"categories":2572},[],{"categories":2574},[105],{"categories":2576},[111],{"categories":2578},[114],{"categories":2580},[111],{"categories":2582},[111],{"categories":2584},[],{"categories":2586},[153],{"categories":2588},[108],{"categories":2590},[132],{"categories":2592},[111],{"categories":2594},[111],{"categories":2596},[153],{"categories":2598},[169],{"categories":2600},[156],{"categories":2602},[111],{"categories":2604},[132],{"categories":2606},[111],{"categories":2608},[114],{"categories":2610},[424],{"categories":2612},[111],{"categories":2614},[114],{"categories":2616},[156],{"categories":2618},[],{"categories":2620},[114],{"categories":2622},[68],{"categories":2624},[153],{"categories":2626},[111],{"categories":2628},[105],{"categories":2630},[108],{"categories":2632},[68],{"categories":2634},[],{"categories":2636},[114],{"categories":2638},[111],{"categories":2640},[],{"categories":2642},[132],{"categories":2644},[],{"categories":2646},[132],{"categories":2648},[111],{"categories":2650},[114],{"categories":2652},[114],{"categories":2654},[114],{"categories":2656},[],{"categories":2658},[],{"categories":2660},[111],{"categories":2662},[111],{"categories":2664},[],{"categories":2666},[153],{"categories":2668},[114],{"categories":2670},[169],{"categories":2672},[105],{"categories":2674},[],{"categories":2676},[],{"categories":2678},[132],{"categories":2680},[68],{"categories":2682},[111],{"categories":2684},[111],{"categories":2686},[111],{"categories":2688},[68],{"categories":2690},[132],{"categories":2692},[153],{"categories":2694},[111],{"categories":2696},[111],{"categories":2698},[111],{"categories":2700},[132],{"categories":2702},[111],{"categories":2704},[132],{"categories":2706},[114],{"categories":2708},[114],{"categories":2710},[68],{"categories":2712},[114],{"categories":2714},[111],{"categories":2716},[68],{"categories":2718},[153],{"categories":2720},[],{"categories":2722},[114],{"categories":2724},[],{"categories":2726},[],{"categories":2728},[108],{"categories":2730},[111],{"categories":2732},[114],{"categories":2734},[105],{"categories":2736},[114],{"categories":2738},[169],{"categories":2740},[],{"categories":2742},[114],{"categories":2744},[],{"categories":2746},[105],{"categories":2748},[114],{"categories":2750},[],{"categories":2752},[114],{"categories":2754},[111],{"categories":2756},[132],{"categories":2758},[111],{"categories":2760},[114],{"categories":2762},[132],{"categories":2764},[114],{"categories":2766},[68],{"categories":2768},[153],{"categories":2770},[105],{"categories":2772},[],{"categories":2774},[114],{"categories":2776},[153],{"categories":2778},[132],{"categories":2780},[111],{"categories":2782},[153],{"categories":2784},[105],{"categories":2786},[],{"categories":2788},[114],{"categories":2790},[114],{"categories":2792},[111],{"categories":2794},[],{"categories":2796},[114],{"categories":2798},[117],{"categories":2800},[132],{"categories":2802},[114],{"categories":2804},[108],{"categories":2806},[],{"categories":2808},[111],{"categories":2810},[117],{"categories":2812},[111],{"categories":2814},[114],{"categories":2816},[132],{"categories":2818},[105],{"categories":2820},[424],{"categories":2822},[111],{"categories":2824},[111],{"categories":2826},[111],{"categories":2828},[132],{"categories":2830},[108],{"categories":2832},[111],{"categories":2834},[153],{"categories":2836},[132],{"categories":2838},[424],{"categories":2840},[111],{"categories":2842},[],{"categories":2844},[],{"categories":2846},[424],{"categories":2848},[156],{"categories":2850},[114],{"categories":2852},[114],{"categories":2854},[132],{"categories":2856},[111],{"categories":2858},[105],{"categories":2860},[153],{"categories":2862},[114],{"categories":2864},[111],{"categories":2866},[169],{"categories":2868},[111],{"categories":2870},[114],{"categories":2872},[],{"categories":2874},[111],{"categories":2876},[111],{"categories":2878},[132],{"categories":2880},[105],{"categories":2882},[],{"categories":2884},[111],{"categories":2886},[111],{"categories":2888},[68],{"categories":2890},[153],{"categories":2892},[111,114],{"categories":2894},[169,108],{"categories":2896},[111],{"categories":2898},[],{"categories":2900},[114],{"categories":2902},[],{"categories":2904},[68],{"categories":2906},[111],{"categories":2908},[132],{"categories":2910},[],{"categories":2912},[114],{"categories":2914},[],{"categories":2916},[114],{"categories":2918},[105],{"categories":2920},[114],{"categories":2922},[111],{"categories":2924},[424],{"categories":2926},[169],{"categories":2928},[108],{"categories":2930},[108],{"categories":2932},[105],{"categories":2934},[105],{"categories":2936},[111],{"categories":2938},[114],{"categories":2940},[111],{"categories":2942},[111],{"categories":2944},[105],{"categories":2946},[111],{"categories":2948},[169],{"categories":2950},[132],{"categories":2952},[111],{"categories":2954},[114],{"categories":2956},[111],{"categories":2958},[],{"categories":2960},[68],{"categories":2962},[],{"categories":2964},[114],{"categories":2966},[105],{"categories":2968},[],{"categories":2970},[424],{"categories":2972},[111],{"categories":2974},[],{"categories":2976},[132],{"categories":2978},[114],{"categories":2980},[68],{"categories":2982},[111],{"categories":2984},[114],{"categories":2986},[68],{"categories":2988},[114],{"categories":2990},[132],{"categories":2992},[105],{"categories":2994},[132],{"categories":2996},[68],{"categories":2998},[111],{"categories":3000},[153],{"categories":3002},[111],{"categories":3004},[111],{"categories":3006},[111],{"categories":3008},[111],{"categories":3010},[114],{"categories":3012},[111],{"categories":3014},[114],{"categories":3016},[111],{"categories":3018},[105],{"categories":3020},[111],{"categories":3022},[114],{"categories":3024},[153],{"categories":3026},[105],{"categories":3028},[114],{"categories":3030},[153],{"categories":3032},[],{"categories":3034},[111],{"categories":3036},[111],{"categories":3038},[68],{"categories":3040},[],{"categories":3042},[114],{"categories":3044},[169],{"categories":3046},[111],{"categories":3048},[132],{"categories":3050},[169],{"categories":3052},[114],{"categories":3054},[108],{"categories":3056},[108],{"categories":3058},[111],{"categories":3060},[105],{"categories":3062},[],{"categories":3064},[111],{"categories":3066},[],{"categories":3068},[105],{"categories":3070},[111],{"categories":3072},[114],{"categories":3074},[114],{"categories":3076},[],{"categories":3078},[68],{"categories":3080},[68],{"categories":3082},[169],{"categories":3084},[153],{"categories":3086},[],{"categories":3088},[111],{"categories":3090},[105],{"categories":3092},[111],{"categories":3094},[68],{"categories":3096},[105],{"categories":3098},[132],{"categories":3100},[132],{"categories":3102},[],{"categories":3104},[132],{"categories":3106},[114],{"categories":3108},[153],{"categories":3110},[156],{"categories":3112},[111],{"categories":3114},[],{"categories":3116},[132],{"categories":3118},[68],{"categories":3120},[108],{"categories":3122},[111],{"categories":3124},[105],{"categories":3126},[424],{"categories":3128},[105],{"categories":3130},[],{"categories":3132},[],{"categories":3134},[132],{"categories":3136},[],{"categories":3138},[114],{"categories":3140},[114],{"categories":3142},[114],{"categories":3144},[],{"categories":3146},[111],{"categories":3148},[],{"categories":3150},[132],{"categories":3152},[105],{"categories":3154},[153],{"categories":3156},[111],{"categories":3158},[132],{"categories":3160},[132],{"categories":3162},[],{"categories":3164},[132],{"categories":3166},[105],{"categories":3168},[111],{"categories":3170},[],{"categories":3172},[114],{"categories":3174},[114],{"categories":3176},[105],{"categories":3178},[],{"categories":3180},[],{"categories":3182},[],{"categories":3184},[153],{"categories":3186},[114],{"categories":3188},[111],{"categories":3190},[],{"categories":3192},[],{"categories":3194},[],{"categories":3196},[153],{"categories":3198},[],{"categories":3200},[105],{"categories":3202},[],{"categories":3204},[],{"categories":3206},[153],{"categories":3208},[111],{"categories":3210},[132],{"categories":3212},[],{"categories":3214},[169],{"categories":3216},[132],{"categories":3218},[169],{"categories":3220},[111],{"categories":3222},[],{"categories":3224},[],{"categories":3226},[114],{"categories":3228},[],{"categories":3230},[],{"categories":3232},[114],{"categories":3234},[111],{"categories":3236},[],{"categories":3238},[114],{"categories":3240},[132],{"categories":3242},[169],{"categories":3244},[156],{"categories":3246},[114],{"categories":3248},[114],{"categories":3250},[],{"categories":3252},[],{"categories":3254},[],{"categories":3256},[132],{"categories":3258},[],{"categories":3260},[],{"categories":3262},[153],{"categories":3264},[105],{"categories":3266},[],{"categories":3268},[108],{"categories":3270},[169],{"categories":3272},[111],{"categories":3274},[68],{"categories":3276},[105],{"categories":3278},[156],{"categories":3280},[108],{"categories":3282},[68],{"categories":3284},[],{"categories":3286},[],{"categories":3288},[114],{"categories":3290},[105],{"categories":3292},[153],{"categories":3294},[105],{"categories":3296},[114],{"categories":3298},[424],{"categories":3300},[114],{"categories":3302},[],{"categories":3304},[111],{"categories":3306},[132],{"categories":3308},[68],{"categories":3310},[],{"categories":3312},[153],{"categories":3314},[132],{"categories":3316},[105],{"categories":3318},[114],{"categories":3320},[111],{"categories":3322},[108],{"categories":3324},[114,424],{"categories":3326},[114],{"categories":3328},[68],{"categories":3330},[111],{"categories":3332},[156],{"categories":3334},[169],{"categories":3336},[114],{"categories":3338},[],{"categories":3340},[114],{"categories":3342},[111],{"categories":3344},[108],{"categories":3346},[],{"categories":3348},[],{"categories":3350},[111],{"categories":3352},[156],{"categories":3354},[111],{"categories":3356},[],{"categories":3358},[132],{"categories":3360},[],{"categories":3362},[132],{"categories":3364},[68],{"categories":3366},[114],{"categories":3368},[111],{"categories":3370},[169],{"categories":3372},[68],{"categories":3374},[],{"categories":3376},[132],{"categories":3378},[111],{"categories":3380},[],{"categories":3382},[111],{"categories":3384},[114],{"categories":3386},[111],{"categories":3388},[114],{"categories":3390},[111],{"categories":3392},[111],{"categories":3394},[111],{"categories":3396},[111],{"categories":3398},[108],{"categories":3400},[],{"categories":3402},[117],{"categories":3404},[132],{"categories":3406},[111],{"categories":3408},[],{"categories":3410},[68],{"categories":3412},[111],{"categories":3414},[111],{"categories":3416},[114],{"categories":3418},[132],{"categories":3420},[111],{"categories":3422},[111],{"categories":3424},[108],{"categories":3426},[114],{"categories":3428},[153],{"categories":3430},[],{"categories":3432},[156],{"categories":3434},[111],{"categories":3436},[],{"categories":3438},[132],{"categories":3440},[169],{"categories":3442},[],{"categories":3444},[],{"categories":3446},[132],{"categories":3448},[132],{"categories":3450},[169],{"categories":3452},[105],{"categories":3454},[114],{"categories":3456},[114],{"categories":3458},[111],{"categories":3460},[108],{"categories":3462},[],{"categories":3464},[],{"categories":3466},[132],{"categories":3468},[156],{"categories":3470},[68],{"categories":3472},[114],{"categories":3474},[153],{"categories":3476},[156],{"categories":3478},[156],{"categories":3480},[],{"categories":3482},[132],{"categories":3484},[111],{"categories":3486},[111],{"categories":3488},[68],{"categories":3490},[],{"categories":3492},[132],{"categories":3494},[132],{"categories":3496},[132],{"categories":3498},[],{"categories":3500},[114],{"categories":3502},[111],{"categories":3504},[],{"categories":3506},[105],{"categories":3508},[108],{"categories":3510},[],{"categories":3512},[111],{"categories":3514},[111],{"categories":3516},[],{"categories":3518},[68],{"categories":3520},[],{"categories":3522},[],{"categories":3524},[],{"categories":3526},[],{"categories":3528},[111],{"categories":3530},[132],{"categories":3532},[],{"categories":3534},[],{"categories":3536},[111],{"categories":3538},[111],{"categories":3540},[111],{"categories":3542},[156],{"categories":3544},[111],{"categories":3546},[156],{"categories":3548},[],{"categories":3550},[156],{"categories":3552},[156],{"categories":3554},[424],{"categories":3556},[114],{"categories":3558},[68],{"categories":3560},[],{"categories":3562},[],{"categories":3564},[156],{"categories":3566},[68],{"categories":3568},[68],{"categories":3570},[68],{"categories":3572},[],{"categories":3574},[105],{"categories":3576},[68],{"categories":3578},[68],{"categories":3580},[105],{"categories":3582},[68],{"categories":3584},[108],{"categories":3586},[68],{"categories":3588},[68],{"categories":3590},[68],{"categories":3592},[156],{"categories":3594},[132],{"categories":3596},[132],{"categories":3598},[111],{"categories":3600},[68],{"categories":3602},[156],{"categories":3604},[424],{"categories":3606},[156],{"categories":3608},[156],{"categories":3610},[156],{"categories":3612},[],{"categories":3614},[108],{"categories":3616},[],{"categories":3618},[424],{"categories":3620},[68],{"categories":3622},[68],{"categories":3624},[68],{"categories":3626},[114],{"categories":3628},[132,108],{"categories":3630},[156],{"categories":3632},[],{"categories":3634},[],{"categories":3636},[156],{"categories":3638},[],{"categories":3640},[156],{"categories":3642},[132],{"categories":3644},[114],{"categories":3646},[],{"categories":3648},[68],{"categories":3650},[111],{"categories":3652},[153],{"categories":3654},[],{"categories":3656},[111],{"categories":3658},[],{"categories":3660},[132],{"categories":3662},[105],{"categories":3664},[156],{"categories":3666},[],{"categories":3668},[68],{"categories":3670},[132],[3672,4353,4701,4751],{"id":3673,"title":3674,"ai":3675,"body":3680,"categories":4328,"created_at":69,"date_modified":69,"description":61,"extension":70,"faq":69,"featured":71,"kicker_label":69,"meta":4329,"navigation":84,"path":4341,"published_at":4342,"question":69,"scraped_at":4343,"seo":4344,"sitemap":4345,"source_id":4346,"source_name":90,"source_type":91,"source_url":4347,"stem":4348,"tags":4349,"thumbnail_url":69,"tldr":4350,"tweet":69,"unknown_tags":4351,"__hash__":4352},"summaries\u002Fsummaries\u002F1e45509feec027b6-swiftui-state-ownership-rules-end-view-redraw-bugs-summary.md","SwiftUI State: Ownership Rules End View Redraw Bugs",{"provider":7,"model":8,"input_tokens":3676,"output_tokens":3677,"processing_time_ms":3678,"cost_usd":3679},6903,2144,14144,0.00242995,{"type":14,"value":3681,"toc":4322},[3682,3686,3694,3701,3792,3795,3880,3883,3936,3940,3950,4032,4047,4118,4129,4136,4183,4186,4190,4197,4229,4236,4268,4271,4311,4315,4318],[17,3683,3685],{"id":3684},"views-as-functions-of-state-redraws-are-features-not-bugs","Views as Functions of State: Redraws Are Features, Not Bugs",[22,3687,3688,3689,3693],{},"SwiftUI views are structs that act like pure functions: UI = f(state). When state changes, SwiftUI re-runs the body computation and redraws only affected parts—no manual ",[3690,3691,3692],"code",{},"reloadData()"," needed. State is any value the UI depends on, like a counter, toggle, or form validity.",[22,3695,3696,3697,3700],{},"Use ",[3690,3698,3699],{},"@State"," for local, simple state owned by the view (Bool, Int, String, small structs). It persists across redraws because SwiftUI stores it stably:",[3702,3703,3707],"pre",{"className":3704,"code":3705,"language":3706,"meta":61,"style":61},"language-swift shiki shiki-themes github-light github-dark","import SwiftUI\nstruct CounterView: View {\n    @State private var count = 0\n    var body: some View {\n        VStack(spacing: 16) {\n            Text(\"Count: \\(count)\")\n                .font(.title)\n            Button(\"Tap Me\") {\n                count += 1\n            }\n        }\n        .padding()\n    }\n}\n","swift",[3690,3708,3709,3717,3722,3727,3732,3738,3744,3750,3756,3762,3768,3774,3780,3786],{"__ignoreMap":61},[3710,3711,3714],"span",{"class":3712,"line":3713},"line",1,[3710,3715,3716],{},"import SwiftUI\n",[3710,3718,3719],{"class":3712,"line":62},[3710,3720,3721],{},"struct CounterView: View {\n",[3710,3723,3724],{"class":3712,"line":81},[3710,3725,3726],{},"    @State private var count = 0\n",[3710,3728,3729],{"class":3712,"line":80},[3710,3730,3731],{},"    var body: some View {\n",[3710,3733,3735],{"class":3712,"line":3734},5,[3710,3736,3737],{},"        VStack(spacing: 16) {\n",[3710,3739,3741],{"class":3712,"line":3740},6,[3710,3742,3743],{},"            Text(\"Count: \\(count)\")\n",[3710,3745,3747],{"class":3712,"line":3746},7,[3710,3748,3749],{},"                .font(.title)\n",[3710,3751,3753],{"class":3712,"line":3752},8,[3710,3754,3755],{},"            Button(\"Tap Me\") {\n",[3710,3757,3759],{"class":3712,"line":3758},9,[3710,3760,3761],{},"                count += 1\n",[3710,3763,3765],{"class":3712,"line":3764},10,[3710,3766,3767],{},"            }\n",[3710,3769,3771],{"class":3712,"line":3770},11,[3710,3772,3773],{},"        }\n",[3710,3775,3777],{"class":3712,"line":3776},12,[3710,3778,3779],{},"        .padding()\n",[3710,3781,3783],{"class":3712,"line":3782},13,[3710,3784,3785],{},"    }\n",[3710,3787,3789],{"class":3712,"line":3788},14,[3710,3790,3791],{},"}\n",[22,3793,3794],{},"Normal variables reset on redraws since views are disposable. For UI toggles:",[3702,3796,3798],{"className":3704,"code":3797,"language":3706,"meta":61,"style":61},"struct ShowDetailsView: View {\n    @State private var showDetails = false\n    var body: some View {\n        VStack(spacing: 16) {\n            Button(showDetails ? \"Hide Details\" : \"Show Details\") {\n                showDetails.toggle()\n            }\n            if showDetails {\n                Text(\"Here are the details you definitely won't read.\")\n                    .padding()\n                    .background(.thinMaterial)\n                    .cornerRadius(12)\n            }\n        }\n        .padding()\n    }\n}\n",[3690,3799,3800,3805,3810,3814,3818,3823,3828,3832,3837,3842,3847,3852,3857,3861,3865,3870,3875],{"__ignoreMap":61},[3710,3801,3802],{"class":3712,"line":3713},[3710,3803,3804],{},"struct ShowDetailsView: View {\n",[3710,3806,3807],{"class":3712,"line":62},[3710,3808,3809],{},"    @State private var showDetails = false\n",[3710,3811,3812],{"class":3712,"line":81},[3710,3813,3731],{},[3710,3815,3816],{"class":3712,"line":80},[3710,3817,3737],{},[3710,3819,3820],{"class":3712,"line":3734},[3710,3821,3822],{},"            Button(showDetails ? \"Hide Details\" : \"Show Details\") {\n",[3710,3824,3825],{"class":3712,"line":3740},[3710,3826,3827],{},"                showDetails.toggle()\n",[3710,3829,3830],{"class":3712,"line":3746},[3710,3831,3767],{},[3710,3833,3834],{"class":3712,"line":3752},[3710,3835,3836],{},"            if showDetails {\n",[3710,3838,3839],{"class":3712,"line":3758},[3710,3840,3841],{},"                Text(\"Here are the details you definitely won't read.\")\n",[3710,3843,3844],{"class":3712,"line":3764},[3710,3845,3846],{},"                    .padding()\n",[3710,3848,3849],{"class":3712,"line":3770},[3710,3850,3851],{},"                    .background(.thinMaterial)\n",[3710,3853,3854],{"class":3712,"line":3776},[3710,3855,3856],{},"                    .cornerRadius(12)\n",[3710,3858,3859],{"class":3712,"line":3782},[3710,3860,3767],{},[3710,3862,3863],{"class":3712,"line":3788},[3710,3864,3773],{},[3710,3866,3868],{"class":3712,"line":3867},15,[3710,3869,3779],{},[3710,3871,3873],{"class":3712,"line":3872},16,[3710,3874,3785],{},[3710,3876,3878],{"class":3712,"line":3877},17,[3710,3879,3791],{},[22,3881,3882],{},"Never store derived state—compute it to avoid sync bugs. Example form validation:",[3702,3884,3886],{"className":3704,"code":3885,"language":3706,"meta":61,"style":61},"struct SignupView: View {\n    @State private var email = \"\"\n    @State private var password = \"\"\n    private var isValid: Bool {\n        email.contains(\"@\") && password.count >= 8\n    }\n    \u002F\u002F ...\n    Button(\"Create Account\")\n        .disabled(!isValid)\n}\n",[3690,3887,3888,3893,3898,3903,3908,3913,3917,3922,3927,3932],{"__ignoreMap":61},[3710,3889,3890],{"class":3712,"line":3713},[3710,3891,3892],{},"struct SignupView: View {\n",[3710,3894,3895],{"class":3712,"line":62},[3710,3896,3897],{},"    @State private var email = \"\"\n",[3710,3899,3900],{"class":3712,"line":81},[3710,3901,3902],{},"    @State private var password = \"\"\n",[3710,3904,3905],{"class":3712,"line":80},[3710,3906,3907],{},"    private var isValid: Bool {\n",[3710,3909,3910],{"class":3712,"line":3734},[3710,3911,3912],{},"        email.contains(\"@\") && password.count >= 8\n",[3710,3914,3915],{"class":3712,"line":3740},[3710,3916,3785],{},[3710,3918,3919],{"class":3712,"line":3746},[3710,3920,3921],{},"    \u002F\u002F ...\n",[3710,3923,3924],{"class":3712,"line":3752},[3710,3925,3926],{},"    Button(\"Create Account\")\n",[3710,3928,3929],{"class":3712,"line":3758},[3710,3930,3931],{},"        .disabled(!isValid)\n",[3710,3933,3934],{"class":3712,"line":3764},[3710,3935,3791],{},[17,3937,3939],{"id":3938},"sharing-and-model-state-bindings-and-observable-objects","Sharing and Model State: Bindings and Observable Objects",[22,3941,3942,3943,3946,3947,3949],{},"Pass ownership with ",[3690,3944,3945],{},"@Binding",": parent holds ",[3690,3948,3699],{},", child gets a binding like a remote control:",[3702,3951,3953],{"className":3704,"code":3952,"language":3706,"meta":61,"style":61},"struct ParentView: View {\n    @State private var isOn = false\n    var body: some View {\n        VStack {\n            Text(isOn ? \"On\" : \"Off\")\n            OnOffButton(isOn: $isOn)\n        }\n    }\n}\nstruct OnOffButton: View {\n    @Binding var isOn: Bool\n    var body: some View {\n        Button(isOn ? \"Turn Off\" : \"Turn On\") {\n            isOn.toggle()\n        }\n    }\n}\n",[3690,3954,3955,3960,3965,3969,3974,3979,3984,3988,3992,3996,4001,4006,4010,4015,4020,4024,4028],{"__ignoreMap":61},[3710,3956,3957],{"class":3712,"line":3713},[3710,3958,3959],{},"struct ParentView: View {\n",[3710,3961,3962],{"class":3712,"line":62},[3710,3963,3964],{},"    @State private var isOn = false\n",[3710,3966,3967],{"class":3712,"line":81},[3710,3968,3731],{},[3710,3970,3971],{"class":3712,"line":80},[3710,3972,3973],{},"        VStack {\n",[3710,3975,3976],{"class":3712,"line":3734},[3710,3977,3978],{},"            Text(isOn ? \"On\" : \"Off\")\n",[3710,3980,3981],{"class":3712,"line":3740},[3710,3982,3983],{},"            OnOffButton(isOn: $isOn)\n",[3710,3985,3986],{"class":3712,"line":3746},[3710,3987,3773],{},[3710,3989,3990],{"class":3712,"line":3752},[3710,3991,3785],{},[3710,3993,3994],{"class":3712,"line":3758},[3710,3995,3791],{},[3710,3997,3998],{"class":3712,"line":3764},[3710,3999,4000],{},"struct OnOffButton: View {\n",[3710,4002,4003],{"class":3712,"line":3770},[3710,4004,4005],{},"    @Binding var isOn: Bool\n",[3710,4007,4008],{"class":3712,"line":3776},[3710,4009,3731],{},[3710,4011,4012],{"class":3712,"line":3782},[3710,4013,4014],{},"        Button(isOn ? \"Turn Off\" : \"Turn On\") {\n",[3710,4016,4017],{"class":3712,"line":3788},[3710,4018,4019],{},"            isOn.toggle()\n",[3710,4021,4022],{"class":3712,"line":3867},[3710,4023,3773],{},[3710,4025,4026],{"class":3712,"line":3872},[3710,4027,3785],{},[3710,4029,4030],{"class":3712,"line":3877},[3710,4031,3791],{},[22,4033,4034,4035,4038,4039,4042,4043,4046],{},"For complex state, use ",[3690,4036,4037],{},"ObservableObject"," with ",[3690,4040,4041],{},"@Published"," properties. View creating the object uses ",[3690,4044,4045],{},"@StateObject"," to prevent recreation on redraws:",[3702,4048,4050],{"className":3704,"code":4049,"language":3706,"meta":61,"style":61},"@MainActor\nfinal class ProfileViewModel: ObservableObject {\n    @Published var name: String = \"Sanjay\"\n    @Published var status: String = \"Trying not to over-engineer\"\n    func updateStatus() {\n        status = \"Still trying. Still failing.\"\n    }\n}\n\nstruct ProfileView: View {\n    @StateObject private var vm = ProfileViewModel()\n    \u002F\u002F ...\n    Button(\"Update Status\") { vm.updateStatus() }\n}\n",[3690,4051,4052,4057,4062,4067,4072,4077,4082,4086,4090,4095,4100,4105,4109,4114],{"__ignoreMap":61},[3710,4053,4054],{"class":3712,"line":3713},[3710,4055,4056],{},"@MainActor\n",[3710,4058,4059],{"class":3712,"line":62},[3710,4060,4061],{},"final class ProfileViewModel: ObservableObject {\n",[3710,4063,4064],{"class":3712,"line":81},[3710,4065,4066],{},"    @Published var name: String = \"Sanjay\"\n",[3710,4068,4069],{"class":3712,"line":80},[3710,4070,4071],{},"    @Published var status: String = \"Trying not to over-engineer\"\n",[3710,4073,4074],{"class":3712,"line":3734},[3710,4075,4076],{},"    func updateStatus() {\n",[3710,4078,4079],{"class":3712,"line":3740},[3710,4080,4081],{},"        status = \"Still trying. Still failing.\"\n",[3710,4083,4084],{"class":3712,"line":3746},[3710,4085,3785],{},[3710,4087,4088],{"class":3712,"line":3752},[3710,4089,3791],{},[3710,4091,4092],{"class":3712,"line":3758},[3710,4093,4094],{"emptyLinePlaceholder":84},"\n",[3710,4096,4097],{"class":3712,"line":3764},[3710,4098,4099],{},"struct ProfileView: View {\n",[3710,4101,4102],{"class":3712,"line":3770},[3710,4103,4104],{},"    @StateObject private var vm = ProfileViewModel()\n",[3710,4106,4107],{"class":3712,"line":3776},[3710,4108,3921],{},[3710,4110,4111],{"class":3712,"line":3782},[3710,4112,4113],{},"    Button(\"Update Status\") { vm.updateStatus() }\n",[3710,4115,4116],{"class":3712,"line":3788},[3710,4117,3791],{},[22,4119,4120,4121,4124,4125,4128],{},"Injected objects use ",[3690,4122,4123],{},"@ObservedObject",". Avoid ",[3690,4126,4127],{},"@ObservedObject var vm = ProfileViewModel()","—it recreates and resets data\u002FAPI calls.",[22,4130,4131,4132,4135],{},"For app-wide state (user login, theme), inject ",[3690,4133,4134],{},"@EnvironmentObject"," at root:",[3702,4137,4139],{"className":3704,"code":4138,"language":3706,"meta":61,"style":61},"struct RootView: View {\n    @StateObject private var appState = AppState()\n    var body: some View {\n        ContentView()\n            .environmentObject(appState)\n    }\n}\n\u002F\u002F In any descendant:\n@EnvironmentObject var appState: AppState\n",[3690,4140,4141,4146,4151,4155,4160,4165,4169,4173,4178],{"__ignoreMap":61},[3710,4142,4143],{"class":3712,"line":3713},[3710,4144,4145],{},"struct RootView: View {\n",[3710,4147,4148],{"class":3712,"line":62},[3710,4149,4150],{},"    @StateObject private var appState = AppState()\n",[3710,4152,4153],{"class":3712,"line":81},[3710,4154,3731],{},[3710,4156,4157],{"class":3712,"line":80},[3710,4158,4159],{},"        ContentView()\n",[3710,4161,4162],{"class":3712,"line":3734},[3710,4163,4164],{},"            .environmentObject(appState)\n",[3710,4166,4167],{"class":3712,"line":3740},[3710,4168,3785],{},[3710,4170,4171],{"class":3712,"line":3746},[3710,4172,3791],{},[3710,4174,4175],{"class":3712,"line":3752},[3710,4176,4177],{},"\u002F\u002F In any descendant:\n",[3710,4179,4180],{"class":3712,"line":3758},[3710,4181,4182],{},"@EnvironmentObject var appState: AppState\n",[22,4184,4185],{},"Limit to true globals; they hide dependencies.",[17,4187,4189],{"id":4188},"persistence-and-decision-framework-survive-restarts","Persistence and Decision Framework: Survive Restarts",[22,4191,4192,4193,4196],{},"Persist simple values across app kills with ",[3690,4194,4195],{},"@AppStorage"," (UserDefaults-backed):",[3702,4198,4200],{"className":3704,"code":4199,"language":3706,"meta":61,"style":61},"struct SettingsView: View {\n    @AppStorage(\"isDarkMode\") private var isDarkMode = false\n    var body: some View {\n        Toggle(\"Dark Mode\", isOn: $isDarkMode)\n    }\n}\n",[3690,4201,4202,4207,4212,4216,4221,4225],{"__ignoreMap":61},[3710,4203,4204],{"class":3712,"line":3713},[3710,4205,4206],{},"struct SettingsView: View {\n",[3710,4208,4209],{"class":3712,"line":62},[3710,4210,4211],{},"    @AppStorage(\"isDarkMode\") private var isDarkMode = false\n",[3710,4213,4214],{"class":3712,"line":81},[3710,4215,3731],{},[3710,4217,4218],{"class":3712,"line":80},[3710,4219,4220],{},"        Toggle(\"Dark Mode\", isOn: $isDarkMode)\n",[3710,4222,4223],{"class":3712,"line":3734},[3710,4224,3785],{},[3710,4226,4227],{"class":3712,"line":3740},[3710,4228,3791],{},[22,4230,4231,4232,4235],{},"For scene\u002Fwindow-specific UI (drafts, tabs), use ",[3690,4233,4234],{},"@SceneStorage",":",[3702,4237,4239],{"className":3704,"code":4238,"language":3706,"meta":61,"style":61},"struct NotesView: View {\n    @SceneStorage(\"draftText\") private var draftText = \"\"\n    var body: some View {\n        TextEditor(text: $draftText)\n    }\n}\n",[3690,4240,4241,4246,4251,4255,4260,4264],{"__ignoreMap":61},[3710,4242,4243],{"class":3712,"line":3713},[3710,4244,4245],{},"struct NotesView: View {\n",[3710,4247,4248],{"class":3712,"line":62},[3710,4249,4250],{},"    @SceneStorage(\"draftText\") private var draftText = \"\"\n",[3710,4252,4253],{"class":3712,"line":81},[3710,4254,3731],{},[3710,4256,4257],{"class":3712,"line":80},[3710,4258,4259],{},"        TextEditor(text: $draftText)\n",[3710,4261,4262],{"class":3712,"line":3734},[3710,4263,3785],{},[3710,4265,4266],{"class":3712,"line":3740},[3710,4267,3791],{},[22,4269,4270],{},"Decision checklist by ownership\u002Flifetime:",[4272,4273,4274,4280,4285,4290,4295,4301,4306],"ul",{},[4275,4276,4277,4278],"li",{},"Local\u002Fsimple: ",[3690,4279,3699],{},[4275,4281,4282,4283],{},"Child edits: ",[3690,4284,3945],{},[4275,4286,4287,4288],{},"View-owned model: ",[3690,4289,4045],{},[4275,4291,4292,4293],{},"Injected model: ",[3690,4294,4123],{},[4275,4296,4297,4298,4300],{},"App-shared: ",[3690,4299,4134],{}," (sparingly)",[4275,4302,4303,4304],{},"App-persistent: ",[3690,4305,4195],{},[4275,4307,4308,4309],{},"Scene-persistent: ",[3690,4310,4234],{},[17,4312,4314],{"id":4313},"pitfalls-that-cause-90-of-state-confusion","Pitfalls That Cause 90% of State Confusion",[22,4316,4317],{},"Common bugs: storing computed values (leads to staleness), wrong object wrapper (data resets), overusing globals (debug hell), fearing redraws (they're efficient). Answer: Who owns it? How long does it live? This shifts state from magic to predictable tools.",[4319,4320,4321],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":61,"searchDepth":62,"depth":62,"links":4323},[4324,4325,4326,4327],{"id":3684,"depth":62,"text":3685},{"id":3938,"depth":62,"text":3939},{"id":4188,"depth":62,"text":4189},{"id":4313,"depth":62,"text":4314},[68],{"content_references":4330,"triage":4338},[4331,4335],{"type":75,"title":4332,"url":4333,"context":4334},"SwiftUI Navigation in iOS: A Practical Guide","https:\u002F\u002Fmedium.com\u002Fgitconnected\u002Fswiftui-navigation-in-ios-a-practical-guide-2a4820971681","recommended",{"type":75,"title":4336,"url":4337,"context":4334},"MVVM in SwiftUI: Build an iOS App That Stays Organized as It Grows","https:\u002F\u002Flevelup.gitconnected.com\u002Fmvvm-in-swiftui-build-an-ios-app-that-stays-organized-as-it-grows-a16e64d9eb3a",{"relevance":3734,"novelty":81,"quality":80,"actionability":80,"composite":4339,"reasoning":4340},4.15,"Category: Software Engineering. The article provides a practical guide on managing state in SwiftUI, which is directly relevant to developers building AI-powered products that may involve UI components. It includes specific examples and code snippets that can be immediately applied, addressing common pain points in UI development.","\u002Fsummaries\u002F1e45509feec027b6-swiftui-state-ownership-rules-end-view-redraw-bugs-summary","2026-03-16 15:49:07","2026-04-14 14:30:07",{"title":3674,"description":61},{"loc":4341},"1e45509feec027b6","https:\u002F\u002Fmedium.com\u002Fgitconnected\u002Fswiftui-state-in-ios-a-practical-guide-993a70794cdd","summaries\u002F1e45509feec027b6-swiftui-state-ownership-rules-end-view-redraw-bugs-summary",[95,96,97],"Treat SwiftUI views as functions of state (UI = f(state)). Choose wrappers by ownership: @State for local simple values, @Binding to share edits, @StateObject for view-owned models, @ObservedObject for injected ones. Compute derived state, persist with @AppStorage.",[95,96,97],"pcfRBH2XDV6VJA40AS3Zz8Qxct8wm6viRFns7bL4nLM",{"id":4354,"title":4355,"ai":4356,"body":4361,"categories":4679,"created_at":69,"date_modified":69,"description":61,"extension":70,"faq":69,"featured":71,"kicker_label":69,"meta":4680,"navigation":84,"path":4690,"published_at":4691,"question":69,"scraped_at":4692,"seo":4693,"sitemap":4694,"source_id":4695,"source_name":90,"source_type":91,"source_url":4333,"stem":4696,"tags":4697,"thumbnail_url":69,"tldr":4698,"tweet":69,"unknown_tags":4699,"__hash__":4700},"summaries\u002Fsummaries\u002Faa1eff4735e85871-swiftui-navigationstack-typed-routes-for-scalable--summary.md","SwiftUI NavigationStack: Typed Routes for Scalable Apps",{"provider":7,"model":8,"input_tokens":4357,"output_tokens":4358,"processing_time_ms":4359,"cost_usd":4360},6513,1853,15421,0.0022066,{"type":14,"value":4362,"toc":4673},[4363,4367,4394,4409,4465,4476,4480,4486,4516,4531,4534,4538,4544,4581,4588,4602,4626,4630,4664,4671],[17,4364,4366],{"id":4365},"typed-routes-make-navigation-predictable-and-refactor-safe","Typed Routes Make Navigation Predictable and Refactor-Safe",[22,4368,4369,4370,4373,4374,4377,4378,4381,4382,4385,4386,4389,4390,4393],{},"Treat navigation as a stack of typed ",[3690,4371,4372],{},"Hashable"," routes where the path array drives pushes (append) and pops (removeLast or removeAll). Define routes in one ",[3690,4375,4376],{},"enum Route: Hashable"," (e.g., ",[3690,4379,4380],{},"case details(id: Int)",", ",[3690,4383,4384],{},"case settings","), then map them centrally via ",[3690,4387,4388],{},".navigationDestination(for: Route.self)"," at the ",[3690,4391,4392],{},"NavigationStack"," root.",[22,4395,4396,4397,4400,4401,4404,4405,4408],{},"This eliminates scattered ",[3690,4398,4399],{},"NavigationLink(destination:)"," closures and ",[3690,4402,4403],{},"isActive"," bindings, which cause duplicate pushes and spaghetti state. Compiler enforces exhaustive ",[3690,4406,4407],{},"switch"," coverage for safe refactors. Basic setup:",[3702,4410,4412],{"className":3704,"code":4411,"language":3706,"meta":61,"style":61},"NavigationStack {\n    List {\n        NavigationLink(\"Open Details\", value: Route.details(id: 42))\n    }\n    .navigationDestination(for: Route.self) { route in\n        switch route {\n        case .details(let id): DetailsView(id: id)\n        case .settings: SettingsView()\n        }\n    }\n}\n",[3690,4413,4414,4419,4424,4429,4433,4438,4443,4448,4453,4457,4461],{"__ignoreMap":61},[3710,4415,4416],{"class":3712,"line":3713},[3710,4417,4418],{},"NavigationStack {\n",[3710,4420,4421],{"class":3712,"line":62},[3710,4422,4423],{},"    List {\n",[3710,4425,4426],{"class":3712,"line":81},[3710,4427,4428],{},"        NavigationLink(\"Open Details\", value: Route.details(id: 42))\n",[3710,4430,4431],{"class":3712,"line":80},[3710,4432,3785],{},[3710,4434,4435],{"class":3712,"line":3734},[3710,4436,4437],{},"    .navigationDestination(for: Route.self) { route in\n",[3710,4439,4440],{"class":3712,"line":3740},[3710,4441,4442],{},"        switch route {\n",[3710,4444,4445],{"class":3712,"line":3746},[3710,4446,4447],{},"        case .details(let id): DetailsView(id: id)\n",[3710,4449,4450],{"class":3712,"line":3752},[3710,4451,4452],{},"        case .settings: SettingsView()\n",[3710,4454,4455],{"class":3712,"line":3758},[3710,4456,3773],{},[3710,4458,4459],{"class":3712,"line":3764},[3710,4460,3785],{},[3710,4462,4463],{"class":3712,"line":3770},[3710,4464,3791],{},[22,4466,4467,4468,4471,4472,4475],{},"For apps under 5 screens, bind ",[3690,4469,4470],{},"@State private var path: [Route] = []"," directly to ",[3690,4473,4474],{},"NavigationStack(path: $path)",". Outcomes: deep links parse to routes cleanly, testing isolates route logic, and state stays explicit.",[17,4477,4479],{"id":4478},"router-centralizes-control-for-programmatic-flows","Router Centralizes Control for Programmatic Flows",[22,4481,4482,4483,4235],{},"For 20+ screens, multiple flows (auth, onboarding), or post-API navigation, extract path to a ",[3690,4484,4485],{},"@MainActor final class Router: ObservableObject",[3702,4487,4489],{"className":3704,"code":4488,"language":3706,"meta":61,"style":61},"@Published var path: [Route] = []\nfunc push(_ route: Route) { path.append(route) }\nfunc pop() { _ = path.popLast() }\nfunc popToRoot() { path.removeAll() }\nfunc setPath(_ newPath: [Route]) { path = newPath }\n",[3690,4490,4491,4496,4501,4506,4511],{"__ignoreMap":61},[3710,4492,4493],{"class":3712,"line":3713},[3710,4494,4495],{},"@Published var path: [Route] = []\n",[3710,4497,4498],{"class":3712,"line":62},[3710,4499,4500],{},"func push(_ route: Route) { path.append(route) }\n",[3710,4502,4503],{"class":3712,"line":81},[3710,4504,4505],{},"func pop() { _ = path.popLast() }\n",[3710,4507,4508],{"class":3712,"line":80},[3710,4509,4510],{},"func popToRoot() { path.removeAll() }\n",[3710,4512,4513],{"class":3712,"line":3734},[3710,4514,4515],{},"func setPath(_ newPath: [Route]) { path = newPath }\n",[22,4517,4518,4519,4522,4523,4526,4527,4530],{},"Inject via ",[3690,4520,4521],{},"@StateObject private var router = Router()"," at root, pass ",[3690,4524,4525],{},"@ObservedObject var router: Router"," to views. Buttons call ",[3690,4528,4529],{},"router.push(.details(id: 100))"," for programmatic navigation—no nested conditionals or view knowledge of siblings.",[22,4532,4533],{},"This keeps views UI-focused, scales to tabs\u002Fdeep links, and avoids \"why did it push twice?\" bugs from pre-iOS 16 patterns.",[17,4535,4537],{"id":4536},"deep-links-and-tabs-via-isolated-stacks","Deep Links and Tabs via Isolated Stacks",[22,4539,4540,4541,4235],{},"Parse URLs to route paths with a ",[3690,4542,4543],{},"DeepLinkParser",[3702,4545,4547],{"className":3704,"code":4546,"language":3706,"meta":61,"style":61},"static func parse(_ url: URL) -> [Route]? {\n    guard url.scheme == \"myapp\" else { return nil }\n    if url.host == \"details\", let id = Int(url.pathComponents.filter({ $0 != \"\u002F\" }).first ?? \"\") {\n        return [.details(id: id)]\n    }\n    \u002F\u002F ...\n}\n",[3690,4548,4549,4554,4559,4564,4569,4573,4577],{"__ignoreMap":61},[3710,4550,4551],{"class":3712,"line":3713},[3710,4552,4553],{},"static func parse(_ url: URL) -> [Route]? {\n",[3710,4555,4556],{"class":3712,"line":62},[3710,4557,4558],{},"    guard url.scheme == \"myapp\" else { return nil }\n",[3710,4560,4561],{"class":3712,"line":81},[3710,4562,4563],{},"    if url.host == \"details\", let id = Int(url.pathComponents.filter({ $0 != \"\u002F\" }).first ?? \"\") {\n",[3710,4565,4566],{"class":3712,"line":80},[3710,4567,4568],{},"        return [.details(id: id)]\n",[3710,4570,4571],{"class":3712,"line":3734},[3710,4572,3785],{},[3710,4574,4575],{"class":3712,"line":3740},[3710,4576,3921],{},[3710,4578,4579],{"class":3712,"line":3746},[3710,4580,3791],{},[22,4582,4583,4584,4587],{},"Apply via ",[3690,4585,4586],{},".onOpenURL { if let newPath = DeepLinkParser.parse(url) { router.setPath(newPath) } }",". SwiftUI handles the rest—no intermediate hacks.",[22,4589,4590,4591,4594,4595,4598,4599,4235],{},"For ",[3690,4592,4593],{},"TabView",", isolate stacks per tab to prevent cross-tab state bleed (e.g., one tab remembering another's history). Use separate ",[3690,4596,4597],{},"NavigationStack(path:)"," and optionally tab-specific enums like ",[3690,4600,4601],{},"HomeRoute",[3702,4603,4605],{"className":3704,"code":4604,"language":3706,"meta":61,"style":61},"TabView {\n    AppRoot().tabItem { Label(\"Home\", systemImage: \"house\") }\n    SettingsTab().tabItem { Label(\"Settings\", systemImage: \"gear\") } \u002F\u002F Own path\n}\n",[3690,4606,4607,4612,4617,4622],{"__ignoreMap":61},[3710,4608,4609],{"class":3712,"line":3713},[3710,4610,4611],{},"TabView {\n",[3710,4613,4614],{"class":3712,"line":62},[3710,4615,4616],{},"    AppRoot().tabItem { Label(\"Home\", systemImage: \"house\") }\n",[3710,4618,4619],{"class":3712,"line":81},[3710,4620,4621],{},"    SettingsTab().tabItem { Label(\"Settings\", systemImage: \"gear\") } \u002F\u002F Own path\n",[3710,4623,4624],{"class":3712,"line":80},[3710,4625,3791],{},[17,4627,4629],{"id":4628},"pitfalls-fixed-by-this-model","Pitfalls Fixed by This Model",[4272,4631,4632,4639,4649,4658],{},[4275,4633,4634,4638],{},[4635,4636,4637],"strong",{},"Destinations in children",": Centralize at root to avoid missing routes on deep paths.",[4275,4640,4641,4644,4645,4648],{},[4635,4642,4643],{},"Mixing old\u002Fnew links",": Stick to ",[3690,4646,4647],{},"NavigationLink(value:)"," + typed destinations.",[4275,4650,4651,4654,4655,4657],{},[4635,4652,4653],{},"Non-Hashable routes",": Ensure enum cases hold only ",[3690,4656,4372],{}," data.",[4275,4659,4660,4663],{},[4635,4661,4662],{},"No auto-persistence",": Manually serialize path for app restarts if needed.",[22,4665,4666,4667,4670],{},"iOS 16+ APIs outperform ",[3690,4668,4669],{},"NavigationView"," for real apps with tabs, deep links, and programmatic control.",[4319,4672,4321],{},{"title":61,"searchDepth":62,"depth":62,"links":4674},[4675,4676,4677,4678],{"id":4365,"depth":62,"text":4366},{"id":4478,"depth":62,"text":4479},{"id":4536,"depth":62,"text":4537},{"id":4628,"depth":62,"text":4629},[68],{"content_references":4681,"triage":4688},[4682,4685],{"type":75,"title":4683,"author":4684,"url":92,"context":78},"10 Common Mistakes Every iOS Developer Should Avoid (Learned the Hard Way)","Sanjay Nelagadde",{"type":75,"title":4686,"author":4684,"url":4687,"context":78},"Apple Vision API Explained (With Code)","https:\u002F\u002Fmedium.com\u002Fdata-has-better-idea\u002Fapple-vision-api-explained-with-code-from-theory-to-github-6613e6628566",{"relevance":80,"novelty":81,"quality":80,"actionability":80,"composite":82,"reasoning":4689},"Category: Software Engineering. The article provides a practical guide on implementing typed routes in SwiftUI, addressing a specific pain point for developers dealing with navigation complexities. It offers concrete code examples and a structured approach to improve navigation management, making it actionable for developers looking to enhance their app's architecture.","\u002Fsummaries\u002Faa1eff4735e85871-swiftui-navigationstack-typed-routes-for-scalable-summary","2026-02-02 15:48:02","2026-04-14 14:30:05",{"title":4355,"description":61},{"loc":4690},"aa1eff4735e85871","summaries\u002Faa1eff4735e85871-swiftui-navigationstack-typed-routes-for-scalable--summary",[95,96,97],"Replace fragile NavigationLink hacks with NavigationStack, typed Hashable routes, and a central router: enables programmatic pushes\u002Fpops, deep links, and isolated tabs without state bugs.",[95,96,97],"qOtOZ5L_a5c_tjrRfCO-Lmpy8N6oQCP1MmBkt9frkPs",{"id":4702,"title":4703,"ai":4704,"body":4709,"categories":4737,"created_at":69,"date_modified":69,"description":61,"extension":70,"faq":69,"featured":71,"kicker_label":69,"meta":4738,"navigation":84,"path":4739,"published_at":4740,"question":69,"scraped_at":69,"seo":4741,"sitemap":4742,"source_id":4743,"source_name":4744,"source_type":91,"source_url":4745,"stem":4746,"tags":4747,"thumbnail_url":69,"tldr":4748,"tweet":69,"unknown_tags":4749,"__hash__":4750},"summaries\u002Fsummaries\u002Fdebug-like-a-plumber-probe-hidden-bugs-indirectly-summary.md","Debug Like a Plumber: Probe Hidden Bugs Indirectly",{"provider":7,"model":8,"input_tokens":4705,"output_tokens":4706,"processing_time_ms":4707,"cost_usd":4708},3670,895,9736,0.00115885,{"type":14,"value":4710,"toc":4732},[4711,4715,4718,4722,4725,4729],[17,4712,4714],{"id":4713},"force-hidden-problems-to-reveal-themselves","Force Hidden Problems to Reveal Themselves",[22,4716,4717],{},"A leak detection specialist fixed an underground pipe leak near a driveway without digging: he connected a compressor to inject tracer gas into the pipe, then walked the surface with a handheld detector. The gas escaped only through the break, bubbling up through soil to the detector. In 20 minutes, he pinpointed the spot: 'Dig here.' He succeeded by assuming the problem was invisible—buried under concrete—so his method didn't try direct visibility. Instead, it created an inescapable signal from the issue itself.",[17,4719,4721],{"id":4720},"engineers-faulty-assumption-slows-debugging","Engineers' Faulty Assumption Slows Debugging",[22,4723,4724],{},"Software teams facing production bugs assume visibility: code is readable, dashboards show metrics, logs capture events. They read code, stare at dashboards, add logging (often more logging). This direct inspection fails because production issues are 'underground'—intermittent, environment-specific, or emergent—making them hard to spot even when staring.",[17,4726,4728],{"id":4727},"adopt-the-tracer-gas-mindset-for-faster-fixes","Adopt the Tracer Gas Mindset for Faster Fixes",[22,4730,4731],{},"Shift to the plumber's assumption: production bugs can't be seen directly, so inject probes that the problem can't hide from. Examples include targeted canary deployments, synthetic traffic simulating user paths, or chaos experiments flipping switches to surface weaknesses. These methods guarantee the bug announces itself, cutting debug time from hours\u002Fdays to minutes, just as tracer gas did.",{"title":61,"searchDepth":62,"depth":62,"links":4733},[4734,4735,4736],{"id":4713,"depth":62,"text":4714},{"id":4720,"depth":62,"text":4721},{"id":4727,"depth":62,"text":4728},[68],{},"\u002Fsummaries\u002Fdebug-like-a-plumber-probe-hidden-bugs-indirectly-summary","2026-04-08 21:21:18",{"title":4703,"description":61},{"loc":4739},"eab4d08860b92327","Level Up Coding","https:\u002F\u002Funknown","summaries\u002Fdebug-like-a-plumber-probe-hidden-bugs-indirectly-summary",[95,96],"Production bugs hide like underground leaks—don't inspect directly; inject 'tracer gas' probes that force issues to surface, as a leak specialist did in 20 minutes without digging.",[95,96],"an1lWZBnf3t3cE2cl9ZoyxtBgErx10MA-Ja1DYlyi-s",{"id":4752,"title":4753,"ai":4754,"body":4759,"categories":4787,"created_at":69,"date_modified":69,"description":61,"extension":70,"faq":69,"featured":71,"kicker_label":69,"meta":4788,"navigation":84,"path":4793,"published_at":4794,"question":69,"scraped_at":4795,"seo":4796,"sitemap":4797,"source_id":4798,"source_name":4799,"source_type":91,"source_url":4800,"stem":4801,"tags":4802,"thumbnail_url":69,"tldr":4803,"tweet":69,"unknown_tags":4804,"__hash__":4805},"summaries\u002Fsummaries\u002Ff0cb31fd5d79ac17-juniors-ship-faster-but-lack-system-shape-summary.md","Juniors Ship Faster But Lack System Shape",{"provider":7,"model":8,"input_tokens":4755,"output_tokens":4756,"processing_time_ms":4757,"cost_usd":4758},3927,1130,12244,0.00084355,{"type":14,"value":4760,"toc":4782},[4761,4765,4768,4772,4775,4779],[17,4762,4764],{"id":4763},"speed-masks-shallow-understanding","Speed Masks Shallow Understanding",[22,4766,4767],{},"Junior engineers now close far more tickets than seniors—14 per sprint versus 4—while delivering clean PRs, passing tests, and earning minimal code review feedback. Dashboards label them high performers. This isn't luck; it's consistent over months. Use this metric cautiously: it measures output volume, not depth. Juniors excel at tactical tasks like syntax and implementation because tools (implied AI in context) accelerate routine coding, freeing seniors for architecture—but eroding that edge if not addressed.",[17,4769,4771],{"id":4770},"incidents-expose-the-gap","Incidents Expose the Gap",[22,4773,4774],{},"During a subtle production incident, the junior on-call couldn't navigate despite reading stack traces and logs. She pinged the senior not for syntax help, but because she didn't recognize 'which part mattered'—lacking the system's 'shape.' This mental model lets experienced engineers orient quickly: predicting where bugs hide based on architecture, data flows, and historical patterns. Without it, juniors ship fast but debug slowly, risking outages. Build this by pairing juniors on incidents, diagramming system boundaries early, and enforcing architecture reviews in PRs.",[17,4776,4778],{"id":4777},"redefining-seniority-for-ai-era","Redefining Seniority for AI Era",[22,4780,4781],{},"Traditional seniority wasn't shipping speed; it was maintaining the full system shape in working memory to triage, hypothesize, and fix under pressure. As juniors close the speed gap, teams risk a bench of fast coders who can't handle chaos. Counter by measuring 'shape mastery': incident resolution time, architecture docs contributed, and cross-module changes proposed. Promote based on this, not tickets closed—ensuring velocity doesn't trade away reliability.",{"title":61,"searchDepth":62,"depth":62,"links":4783},[4784,4785,4786],{"id":4763,"depth":62,"text":4764},{"id":4770,"depth":62,"text":4771},{"id":4777,"depth":62,"text":4778},[105],{"content_references":4789,"triage":4790},[],{"relevance":3734,"novelty":80,"quality":80,"actionability":80,"composite":4791,"reasoning":4792},4.35,"Category: Software Engineering. The article addresses the balance between speed and understanding in software engineering, highlighting a critical pain point for product builders: the need for juniors to grasp system architecture. It provides actionable strategies like pairing juniors on incidents and enforcing architecture reviews, making it relevant and practical for the target audience.","\u002Fsummaries\u002Ff0cb31fd5d79ac17-juniors-ship-faster-but-lack-system-shape-summary","2026-04-21 00:22:22","2026-04-21 15:26:05",{"title":4753,"description":61},{"loc":4793},"f0cb31fd5d79ac17","Generative AI","https:\u002F\u002Fgenerativeai.pub\u002Fmy-juniors-ship-faster-than-my-seniors-and-im-worried-about-them-4b284c7384ff?source=rss----440100e76000---4","summaries\u002Ff0cb31fd5d79ac17-juniors-ship-faster-but-lack-system-shape-summary",[96,95],"Juniors outperform seniors on tickets shipped (14 vs 4) with clean PRs, but falter in incidents because they don't grasp the system's architecture—seniority means holding that mental model, not raw speed.",[96,95],"S9jMq69SxPImW6BmMsWM_CG-GwHD-ZP24uMhYzx8OrA"]