{"id":16340,"date":"2024-12-28T14:56:09","date_gmt":"2024-12-28T14:56:09","guid":{"rendered":"https:\/\/bestkora.com\/IosDeveloper\/?p=16340"},"modified":"2025-01-15T07:23:43","modified_gmt":"2025-01-15T07:23:43","slug":"%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c","status":"publish","type":"post","link":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/","title":{"rendered":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: <a href=\"https:\/\/chatgpt.com\/\" title=\"\">ChatGPT 4.o1<\/a>, <a href=\"https:\/\/claude.ai\" title=\"\">Claude 3.5 Sonnet<\/a>, <a href=\"https:\/\/gemini.google.com\/\" title=\"\">Gemini 2.0 Flash<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 <a href=\"https:\/\/www.cursor.com\/\" title=\"\">Cursor AI <\/a>\u0438 <a href=\"https:\/\/alexcodes.app\/\" title=\"\">Alex Sidebar<\/a>. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <strong>Countries<\/strong>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f, \u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430 \u0438 \u0442.\u0434.) \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0435\u0451 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0444\u043b\u0430\u0433. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u0443, \u0442\u043e \u043e \u043d\u0435\u0439 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0412\u0412\u041f (\u0432\u0430\u043b\u043e\u0432\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430) <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXclINX6cpI77H6JWX_i5BoWjUozd9YqRJR-vKpJzEGVNtPZD-69s8wq6qQiO-J41iz2mOv0OLcvA3y_DKqqoUiOoHaUOiRp4cIUYQGWzK_6h6trGT4tYRuUZcrE5nxq6_qiRVJQog?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0441\u0447\u0438\u0442\u0430\u044e<strong> Claude 3.5 Sonnet<\/strong> \u043b\u0443\u0447\u0448\u0438\u043c AI (\u0418\u0418) \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0443 \u0418\u0418 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438 \u043d\u0430\u0447\u043d\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0417\u0430\u0431\u0435\u0433\u0430\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u043e\u0431\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044f \u043d\u0430\u0448\u0438 \u043f\u043b\u0430\u043d\u044b, \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442  <span style=\"font-weight: 400;\"><strong>Claude 3.5 Sonnet<\/strong> <\/span>\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044d\u0442\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0440\u043e\u0433\u043e <strong>GCD<\/strong> (Grand Central Dispatch) \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 (<a href=\"https:\/\/github.com\/BestKora\/CountriesClaude\" title=\"\"><strong>Github<\/strong>)<\/a>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <strong>async await<\/strong> <span style=\"font-weight: 400;\">(<a href=\"https:\/\/github.com\/BestKora\/CountriesClaudeAsync\" title=\"\"><strong>Github<\/strong><\/a>)<\/span>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418 \u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 <strong>Swift 6 strict concurrency<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0435\u0442 \u201c\u0433\u043e\u043d\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u201d (data races) (<a href=\"https:\/\/github.com\/BestKora\/CountriesClaudeSwift6StrictConcurrency\" title=\"\"><strong>Github<\/strong><\/a>). \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 <strong>Swift 6 concurrency<\/strong>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u0438\u0437 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/www.massicotte.org\/step-by-step-network-request\" title=\"\">Concurrency Step-by-Step: A Network Request <\/a>\u0438\u043b\u0438 \u0435\u0451 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a <span style=\"font-weight: 400;\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c-\u043f\u043e-\u0448\u0430\u0433\u0430\u043c-\u0441\u0435\u0442\u0435\u0432\u043e\u0439-\u0437\u0430\/\" title=\"\">\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0448\u0430\u0433\u0430\u043c:&nbsp; \u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441<\/a><\/span>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Claude 3.5 Sonnet <\/strong>\u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043d\u0430\u043c \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u041c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u041c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Views<\/mark><\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041c\u044b \u043d\u0435 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0435 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u044b \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u043d\u0438 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0435\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0411\u0430\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438. \u0418 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u201c\u0443\u0433\u043e\u0432\u043e\u0440\u044b\u201d&nbsp;<strong> Claude 3.5 Sonnet<\/strong> \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0430\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c \u0444\u0430\u043a\u0442\u043e\u043c, \u0447\u0442\u043e <strong>Claude 3.5 Sonnet \u043f\u043b\u043e\u0445\u043e \u201c\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u201d \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 JSON \u0434\u0430\u043d\u043d\u044b\u0435.<\/strong><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0418\u0418. <\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Gemini 1.5 Flash<\/strong> \u0442\u0430\u043a\u0436\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c \u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e <strong>ChatGPT 4.o1-mini <\/strong>\u0438&nbsp;<strong>Gemini 2.0 Flash<\/strong> \u0441\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441 \u044d\u0442\u043e\u0439 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043b\u0435\u0433\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0438\u0445 \u043e\u0442\u0432\u0435\u0442 \u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 <strong>Claude 3.5 Sonnet<\/strong>. \u041d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <strong>ChatGPT 4.o1-Preview<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e, \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0434\u0430\u0441\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0441\u043c\u043e\u0433 \u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u0443\u043f\u0435\u0440 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 <strong>ChatGPT 4.o1-mini<\/strong>, \u043d\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 2 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438:&nbsp; <strong>Claude 3.5 Sonnet<\/strong>, &nbsp;<strong>Gemini 2.0 Flash<\/strong>, <strong>ChatGPT 4.o1-mini,<\/strong> <strong>ChatGPT 4.o1-Preview <\/strong>\u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0441 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CGD<\/mark><\/code> \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async await <\/mark><\/code>\u0438 \u0434\u0430\u043b\u0435\u0435 \u043d\u0430 <strong>Swift 6 <\/strong><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">strict concurrency<\/mark><\/code>.<\/span><\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418\u0442\u0430\u043a, \u0432\u0441\u0451 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<span style=\"font-weight: 400;\">&nbsp;&nbsp;<\/span><\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Claude 3.5 Sonnet<\/strong>. \u041d\u0430\u0447\u0430\u043b\u043e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a Claude 3.5 Sonnet:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"364\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07-1024x364.png\" alt=\"\" class=\"wp-image-16404\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07-1024x364.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07-300x107.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07-768x273.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07-500x178.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-04-at-16.05.07.png 1318w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u0432\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 SwiftUI, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u044b \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c. \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Countries by Categories iOS App version 1\/<\/strong>3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 SwiftUI, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code> \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">categories<\/mark><\/code>, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c <span style=\"font-weight: 400;\">\u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430. <\/span> <\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Models<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    let population: Int?\n    let gdp: Double?\n    let iso2Code: String\n}\n\nstruct WorldBankResponse: Decodable {\n    let page: Int\n    let pages: Int\n    let total: Int\n    let data: [CountryData]\n}\n\nstruct CountryData: Decodable {\n    let name: String\n    let region: Region\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    let id: String\n    let iso2Code: String\n    \n    struct Region: Decodable {\n        let id: String\n        let value: String\n    }\n}\n\nstruct IndicatorResponse: Decodable {\n    let data: [IndicatorData]\n}\n\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [CountryData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>ViewModel<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    private var countryDataCache: [String: (population: Int?, gdp: Double?)] = [:]\n    \n    func loadCountries() {\n        isLoading = true\n        errorMessage = nil\n        \n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n            errorMessage = &quot;Invalid URL&quot;\n            isLoading = false\n            return\n        }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            DispatchQueue.main.async {\n                if let error = error {\n                    self?.errorMessage = error.localizedDescription\n                    self?.isLoading = false\n                    return\n                }\n                \n                guard let data = data else {\n                    self?.errorMessage = &quot;No data received&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                do {\n                    let decoder = JSONDecoder()\n                    let response = try decoder.decode([WorldBankResponse?].self, \n                                                                             from: data)\n                    guard let countryData = response[1] else {\n                        self?.errorMessage = &quot;Invalid response format&quot;\n                        self?.isLoading = false\n                        return\n                    }\n                    \n                    let countries = countryData.data.map { data in\n                        Country(\n                            name: data.name,\n                            category: data.region.value,\n                            flag: self?.flagEmoji(from: data.iso2Code) ?? &quot;\ud83c\udff3\ufe0f&quot;,\n                            population: nil,\n                            gdp: nil,\n                            iso2Code: data.iso2Code\n                        )\n                    }\n                    \n                    self?.countries = countries.filter { $0.category != &quot;&quot; }\n                    self?.fetchAdditionalData(for: countries)\n                    \n                } catch {\n                    self?.errorMessage = \n                               &quot;Failed to decode response: \\(error.localizedDescription)&quot;\n                }\n                self?.isLoading = false\n            }\n        }.resume()\n    }\n    \n    private func fetchAdditionalData(for countries: [Country]) {\n        for country in countries {\n            fetchPopulation(for: country)\n            fetchGDP(for: country)\n        }\n    }\n    \n    private func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot; \/\/ Population indicator\n        fetchIndicator(country: country, indicator: indicator) { [weak self] value in\n            if let value = value {\n                self?.updateCountryData(iso2Code: country.iso2Code, population: Int(value))\n            }\n        }\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot; \/\/ GDP indicator\n        fetchIndicator(country: country, indicator: indicator) { [weak self] value in\n            if let value = value {\n                self?.updateCountryData(iso2Code: country.iso2Code, gdp: value)\n            }\n        }\n    }\n    \n    private func fetchIndicator(country: Country, indicator: String, completion: @escaping (Double?) -&gt; Void) {\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022:2022&quot;\n        guard let url = URL(string: urlString) else {\n            completion(nil)\n            return\n        }\n        \n        URLSession.shared.dataTask(with: url) { data, response, error in\n            guard let data = data,\n                  error == nil else {\n                DispatchQueue.main.async {\n                    completion(nil)\n                }\n                return\n            }\n            \n            do {\n                let response = try JSONDecoder().decode([IndicatorResponse?].self, \n                                                                           from: data)\n                let value = response[1]?.data.first?.value\n                DispatchQueue.main.async {\n                    completion(value)\n                }\n            } catch {\n                DispatchQueue.main.async {\n                    completion(nil)\n                }\n            }\n        }.resume()\n    }\n    \n    private func updateCountryData(iso2Code: String, population: Int? = nil, \n                                                     gdp: Double? = nil) {\n        var cached = countryDataCache[iso2Code] ?? (population: nil, gdp: nil)\n        \n        if let population = population {\n            cached.population = population\n        }\n        if let gdp = gdp {\n            cached.gdp = gdp\n        }\n        \n        countryDataCache[iso2Code] = cached\n        \n        \/\/ Update the countries array with new data\n        countries = countries.map { country in\n            if country.iso2Code == iso2Code {\n                return Country(\n                    name: country.name,\n                    category: country.category,\n                    flag: country.flag,\n                    population: cached.population,\n                    gdp: cached.gdp,\n                    iso2Code: country.iso2Code\n                )\n            }\n            return country\n        }\n    }\n    \n    private func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        var flag = &quot;&quot;\n        for unicode in iso2Code.uppercased().unicodeScalars {\n            if let scalar = UnicodeScalar(base + unicode.value) {\n                flag.append(String(scalar))\n            }\n        }\n        return flag\n    }\n    \n    var categories: [String] {\n        Array(Set(countries.map { $0.category })).sorted()\n    }\n    \n    func countries(in category: String) -&gt; [Country] {\n        countries.filter { $0.category == category }\n    }\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countryDataCache: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">: (population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?, gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?)] = [<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> error = error {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;No data received&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankResponse?].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                                             <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countryData = response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">] <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Invalid response format&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = countryData.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { data <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: data.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: data.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">) ?? <\/span><span style=\"color: #98C379\">&quot;\ud83c\udff3\ufe0f&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: data.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> != <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: countries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #98C379\">&quot;Failed to decode response: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Population indicator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">fetchIndicator<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country, <\/span><span style=\"color: #61AFEF\">indicator<\/span><span style=\"color: #ABB2BF\">: indicator) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] value <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = value {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ GDP indicator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">fetchIndicator<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country, <\/span><span style=\"color: #61AFEF\">indicator<\/span><span style=\"color: #ABB2BF\">: indicator) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] value <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = value {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchIndicator<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country, <\/span><span style=\"color: #61AFEF; font-style: italic\">indicator<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">completion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #C678DD\">@escaping<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?) -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022:2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">completion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  error == <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">completion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorResponse?].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                                           <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">]?.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">completion<\/span><span style=\"color: #ABB2BF\">(value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">completion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                     <\/span><span style=\"color: #61AFEF; font-style: italic\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> cached = countryDataCache[iso2Code] ?? (<\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countryDataCache[iso2Code] = cached<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Update the countries array with new data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries = countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> country.iso2Code == iso2Code {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> flag = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> unicode <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> scalar = <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + unicode.value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                flag.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(scalar))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> flag<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Views<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ Main Content View\nstruct ContentView: View {\n    @StateObject private var viewModel = CountriesViewModel()\n    \n    var body: some View {\n        NavigationView {\n            Group {\n                if viewModel.isLoading {\n                    ProgressView(&quot;Loading countries...&quot;)\n                } else if let errorMessage = viewModel.errorMessage {\n                    ErrorView(message: errorMessage, retryAction: {\n                        viewModel.loadCountries()\n                    })\n                } else {\n                    CountryListView(viewModel: viewModel)\n                }\n            }\n            .navigationTitle(&quot;World Countries&quot;)\n        }\n        .onAppear {\n            viewModel.loadCountries()\n        }\n    }\n}\n\nstruct CountryListView: View {\n    @ObservedObject var viewModel: CountriesViewModel\n    \n    var body: some View {\n        List {\n            ForEach(viewModel.categories, id: \\.self) { category in\n                Section(header: Text(category)) {\n                    ForEach(viewModel.countries(in: category)) { country in\n                        NavigationLink(destination: CountryDetailView(country: country)) {\n                            CountryRowView(country: country)\n                        }\n                    }\n                }\n            }\n        }\n        .refreshable {\n            viewModel.loadCountries()\n        }\n    }\n}\n\nstruct CountryRowView: View {\n    let country: Country\n    \n    var body: some View {\n        HStack {\n            Text(country.flag)\n                .font(.title2)\n            Text(country.name)\n                .font(.body)\n        }\n        .padding(.vertical, 4)\n    }\n}\n\nstruct CountryDetailView: View {\n    let country: Country\n    \n    var body: some View {\n        ScrollView {\n            VStack(spacing: 20) {\n                Text(country.flag)\n                    .font(.system(size: 100))\n                \n                Text(country.name)\n                    .font(.title)\n                    .fontWeight(.bold)\n                \n                VStack(alignment: .leading, spacing: 15) {\n                    DetailRow(title: &quot;Region&quot;, value: country.category)\n                    \n                    if let population = country.population {\n                        DetailRow(\n                            title: &quot;Population&quot;,\n                            value: formatNumber(population)\n                        )\n                    }\n                    \n                    if let gdp = country.gdp {\n                        DetailRow(\n                            title: &quot;GDP (USD)&quot;,\n                            value: formatCurrency(gdp)\n                        )\n                    }\n                }\n                .padding()\n                \n                Spacer()\n            }\n        }\n        .navigationBarTitleDisplayMode(.inline)\n        .padding()\n    }\n    \n    private func formatNumber(_ number: Int) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .decimal\n        return formatter.string(from: NSNumber(value: number)) ?? String(number)\n    }\n    \n    private func formatCurrency(_ number: Double) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .currency\n        formatter.currencyCode = &quot;USD&quot;\n        formatter.maximumFractionDigits = 0\n        return formatter.string(from: NSNumber(value: number)) ?? String(number)\n    }\n}\n\nstruct DetailRow: View {\n    let title: String\n    let value: String\n    \n    var body: some View {\n        HStack {\n            Text(title)\n                .fontWeight(.medium)\n                .foregroundColor(.gray)\n            Spacer()\n            Text(value)\n                .fontWeight(.medium)\n        }\n    }\n}\n\nstruct ErrorView: View {\n    let message: String\n    let retryAction: () -&gt; Void\n    \n    var body: some View {\n        VStack(spacing: 16) {\n            Text(&quot;Error&quot;)\n                .font(.title)\n                .foregroundColor(.red)\n            Text(message)\n                .multilineTextAlignment(.center)\n            Button(&quot;Retry&quot;, action: retryAction)\n                .buttonStyle(.bordered)\n        }\n        .padding()\n    }\n}\n\n#Preview {  \n        ContentView()\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Main Content View<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ContentView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@StateObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel = <\/span><span style=\"color: #61AFEF\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Group<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Loading countries...&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> errorMessage = viewModel.errorMessage {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ErrorView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: errorMessage, <\/span><span style=\"color: #61AFEF\">retryAction<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">CountryListView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">viewModel<\/span><span style=\"color: #ABB2BF\">: viewModel)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;World Countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onAppear<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryListView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel: CountriesViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">List<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">categories<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { category <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Section<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">header<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(category)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: category)) { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">NavigationLink<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">destination<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">CountryDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">CountryRowView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">refreshable<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryRowView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> country: Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title2<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">body<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryDetailView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> country: Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">20<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">100<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bold<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Region&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = country.population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Population&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">formatNumber<\/span><span style=\"color: #ABB2BF\">(population)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = country.gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;GDP (USD)&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">formatCurrency<\/span><span style=\"color: #ABB2BF\">(gdp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: number)) ?? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(number)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatCurrency<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">currency<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">currencyCode<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;USD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">maximumFractionDigits<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: number)) ?? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(number)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">DetailRow<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> title: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(title)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ErrorView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> message: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> retryAction: () -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(message)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">multilineTextAlignment<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">center<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Retry&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: retryAction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">buttonStyle<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bordered<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ContentView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0421\u0442\u0440\u0430\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code> \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">categories<\/mark><\/code> (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f, \u0410\u043c\u0435\u0440\u0438\u043a\u0430).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">country<\/mark><\/code> \u0435\u0441\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">name<\/mark><\/code>, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">category<\/mark><\/code>, \u0444\u043b\u0430\u0433-\u044d\u043c\u043e\u0434\u0437\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">flag<\/mark><\/code>,  \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code>, \u0412\u0412\u041f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gpd<\/mark><\/code>, \u043a\u043e\u0434 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">iso2Code<\/mark><\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code> API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430&nbsp;<\/span><\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><code>Views<\/code>:<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">View<\/mark><\/code> &#8212;&nbsp; \u0441\u043f\u0438\u0441\u043e\u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">List<\/mark><\/code> \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Sections<\/mark><\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">category<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountryRowView<\/mark><\/code> \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0444\u043b\u0430\u0433 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u044b<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountryDetailView<\/mark><\/code>, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0442\u0440\u0430\u043d\u0435<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">isLoading<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">errorMessage<\/mark><\/code> \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u0430 (<code>Retry<\/code>)<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b \u0434\u043b\u044f \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0412\u0412\u041f<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u044d\u043c\u043e\u0434\u0437\u0438 \u0444\u043b\u0430\u0433\u0430 \u0438\u0437 &nbsp;ISO \u043a\u043e\u0434\u043e\u0432 \u0441\u0442\u0440\u0430\u043d<br><\/span><\/li>\n<\/ul>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430:<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041f\u0430\u0442\u0442\u0435\u0440\u043d MVVM \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">ObservableObject<\/mark><\/code> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Views<\/mark><\/code>: <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountryRowView<\/mark><\/code>, <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountryDetailView<\/mark><\/code><\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">4. <span style=\"font-weight: 400;\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f API (<code>ViewModel)<\/code>:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code> \u0438\u0437 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e l<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">oadCountries()<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0438 \u0412\u0412\u041f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">func fetchPopulation(for country: Country)<\/mark><\/code> \u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">func fetchGDP(for country: Country)&nbsp;<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code> \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">error<\/mark><\/code> API \u0434\u043e\u043b\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u041c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442  JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u041c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Views<\/mark><\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c  \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0431\u0440\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438 <code>Retry<\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcd2-iX8-h6bqIgi9430EquBr4CV7Nah_Z_r23ZPysMdJ285vWRInp7_4DjiWqUoTx-wPUAX1gwDkG7vNFwLIR7CEXrV534fpbPeIfbd3Xpd0EXAMznnRm4cieQAHeWub4BMK63fw?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\" style=\"width:326px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0411\u0430\u043d\u043a\u0430.<br>\u0412\u043e\u0442 \u0434\u0432\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u044d\u0442\u043e: \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0435\u0451 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code>:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ 1-\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    let population: Int?\n    let gdp: Double?\n    let iso2Code: String\n}\n\nstruct WorldBankResponse: Decodable {\n    let page: Int\n    let pages: Int\n    let total: Int\n    let data: [CountryData]\n}\n\nstruct CountryData: Decodable {\n    let name: String\n    let region: Region\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    let id: String\n    let iso2Code: String\n    \n    struct Region: Decodable {\n        let id: String\n        let value: String\n    }\n}\n\/\/ 2-\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\n\/\/ .  .  .  .  .  .\n              do {\n                 let decoder = JSONDecoder()\n                 let response = try decoder.decode([WorldBankResponse?].self, from: data)\n                  guard let countryData = response[1] else {\n                        self?.errorMessage = &quot;Invalid response format&quot;\n                        self?.isLoading = false\n                        return\n                  }\n\/\/ .  .  .  .  .  .\n                } catch {\n                    self?.errorMessage = \n                            &quot;Failed to decode response: \\(error.localizedDescription)&quot;\n                }\n\/\/ .  .  .  .  .  .\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ 1-\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [CountryData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ 2-\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ .  .  .  .  .  .<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankResponse?].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countryData = response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">] <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Invalid response format&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ .  .  .  .  .  .<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #98C379\">&quot;Failed to decode response: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ .  .  .  .  .  .<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0411\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0442\u0435\u043c, \u043a\u0430\u043a<strong> Claude 3.5 Sonnet<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430, \u0441\u0442\u0440\u0435\u043c\u044f\u0441\u044c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a. <br>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u043c <strong>Claude 3.5 Sonnet <\/strong>\u043e \u043d\u0430\u0448\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-17.51.36.png\"><img loading=\"lazy\" decoding=\"async\" width=\"974\" height=\"280\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-17.51.36.png\" alt=\"\" class=\"wp-image-16360\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-17.51.36.png 974w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-17.51.36-300x86.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-17.51.36-768x221.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-17.51.36-500x144.png 500w\" sizes=\"auto, (max-width: 974px) 100vw, 974px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Fixed Countries App with World Bank API Integration 2\/3<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Models<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    let population: Int?\n    let gdp: Double?\n    let iso2Code: String\n}\n\n\/\/ World Bank API response format\nstruct WorldBankResponse: Decodable {\n    let data: [CountryData]\n    \n    enum CodingKeys: String, CodingKey {\n        case data = &quot;1&quot;\n    }\n    \n    init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        self.data = try container.decode([CountryData].self, forKey: .data)\n    }\n}\n\nstruct CountryData: Decodable {\n    let name: String\n    let region: Region\n    let capitalCity: String?\n    let longitude: String?\n    let latitude: String?\n    let id: String\n    let iso2Code: String\n    \n    struct Region: Decodable {\n        let id: String\n        let value: String\n    }\n}\n\nstruct IndicatorResponse: Decodable {\n    let data: [IndicatorData]\n    \n    enum CodingKeys: String, CodingKey {\n        case data = &quot;1&quot;\n    }\n    \n    init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        self.data = (try? container.decode([IndicatorData].self, forKey: .data)) ?? []\n    }\n}\n\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ World Bank API response format<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [CountryData]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;1&quot;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">container<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">keyedBy<\/span><span style=\"color: #ABB2BF\">: CodingKeys.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([CountryData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">forKey<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;1&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">container<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">keyedBy<\/span><span style=\"color: #ABB2BF\">: CodingKeys.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> = (<\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">forKey<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">)) ?? []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>ViewModel<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    private var countryDataCache: [String: (population: Int?, gdp: Double?)] = [:]\n    \n    func loadCountries() {\n        isLoading = true\n        errorMessage = nil\n        \n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        \n        guard let url = URL(string: urlString) else {\n            errorMessage = &quot;Invalid URL&quot;\n            isLoading = false\n            return\n        }\n        \n        let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            DispatchQueue.main.async {\n                if let error = error {\n                    self?.errorMessage = &quot;Network error: \\(error.localizedDescription)&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                guard let data = data else {\n                    self?.errorMessage = &quot;No data received&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                do {\n                    \/\/ Print the raw JSON for debugging\n                    if let jsonString = String(data: data, encoding: .utf8) {\n                        print(&quot;Raw JSON response: \\(jsonString)&quot;)\n                    }\n                    \n                    let decoder = JSONDecoder()\n                    let response = try decoder.decode([Any?].self, from: data) as! \n                                                                         [String: Any]\n                    \n                    if let countryDataArray = response[&quot;1&quot;] as? [[String: Any]] {\n                        let countries = countryDataArray.compactMap {\n                           countryDict -&gt; Country? in\n                            guard let name = countryDict[&quot;name&quot;] as? String,\n                                  let region = countryDict[&quot;region&quot;] as? [String: Any],\n                                  let regionValue = region[&quot;value&quot;] as? String,\n                                  let iso2Code = countryDict[&quot;iso2Code&quot;] as? String else {\n                                return nil\n                            }\n                            \n                            return Country(\n                                name: name,\n                                category: regionValue,\n                                flag: self?.flagEmoji(from: iso2Code) ?? &quot;\ud83c\udff3\ufe0f&quot;,\n                                population: nil,\n                                gdp: nil,\n                                iso2Code: iso2Code\n                            )\n                        }\n                        \n                        self?.countries = countries.filter { !$0.category.isEmpty }\n                        self?.fetchAdditionalData(for: countries)\n                    }\n                    \n                } catch {\n                    self?.errorMessage = &quot;Failed to decode response: \\(error)&quot;\n                    print(&quot;Decoding error: \\(error)&quot;)\n                }\n                self?.isLoading = false\n            }\n        }\n        task.resume()\n    }\n    \n    private func fetchAdditionalData(for countries: [Country]) {\n        for country in countries {\n            fetchPopulation(for: country)\n            fetchGDP(for: country)\n        }\n    }\n    \n    private func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                if let jsonArray = try JSONSerialization.jsonObject(with: data) as? [Any],\n                   let dataArray = (jsonArray[1] as? [[String: Any]])?.first,\n                   let value = dataArray[&quot;value&quot;] as? Double {\n                    \n                    DispatchQueue.main.async {\n                      self?.updateCountryData(iso2Code: country.iso2Code, \n                                                            population: Int(value))\n                    }\n                }\n            } catch {\n                print(&quot;Population fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                if let jsonArray = try JSONSerialization.jsonObject(with: data) as? [Any],\n                   let dataArray = (jsonArray[1] as? [[String: Any]])?.first,\n                   let value = dataArray[&quot;value&quot;] as? Double {\n                    \n                    DispatchQueue.main.async {\n                        self?.updateCountryData(iso2Code: country.iso2Code, gdp: value)\n                    }\n                }\n            } catch {\n                print(&quot;GDP fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func updateCountryData(iso2Code: String, population: Int? = nil, gdp: Double? = nil) {\n        var cached = countryDataCache[iso2Code] ?? (population: nil, gdp: nil)\n        \n        if let population = population {\n            cached.population = population\n        }\n        if let gdp = gdp {\n            cached.gdp = gdp\n        }\n        \n        countryDataCache[iso2Code] = cached\n        \n        countries = countries.map { country in\n            if country.iso2Code == iso2Code {\n                return Country(\n                    name: country.name,\n                    category: country.category,\n                    flag: country.flag,\n                    population: cached.population,\n                    gdp: cached.gdp,\n                    iso2Code: country.iso2Code\n                )\n            }\n            return country\n        }\n    }\n    \n    private func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        var flag = &quot;&quot;\n        for unicode in iso2Code.uppercased().unicodeScalars {\n            if let scalar = UnicodeScalar(base + unicode.value) {\n                flag.append(String(scalar))\n            }\n        }\n        return flag\n    }\n    \n    var categories: [String] {\n        Array(Set(countries.map { $0.category })).sorted()\n    }\n    \n    func countries(in category: String) -&gt; [Country] {\n        countries.filter { $0.category == category }\n    }\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countryDataCache: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">: (population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?, gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?)] = [<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> task = URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> error = error {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Network error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;No data received&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Print the raw JSON for debugging<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonString = <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">: data, <\/span><span style=\"color: #61AFEF\">encoding<\/span><span style=\"color: #ABB2BF\">: .utf8) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Raw JSON response: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">jsonString<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Any?].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data) as! <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                                                         [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Any]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countryDataArray = response[<\/span><span style=\"color: #98C379\">&quot;1&quot;<\/span><span style=\"color: #ABB2BF\">] as? [[<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Any]] {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = countryDataArray.<\/span><span style=\"color: #61AFEF\">compactMap<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                           countryDict -&gt; Country? <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name = countryDict[<\/span><span style=\"color: #98C379\">&quot;name&quot;<\/span><span style=\"color: #ABB2BF\">] as? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region = countryDict[<\/span><span style=\"color: #98C379\">&quot;region&quot;<\/span><span style=\"color: #ABB2BF\">] as? [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Any],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> regionValue = region[<\/span><span style=\"color: #98C379\">&quot;value&quot;<\/span><span style=\"color: #ABB2BF\">] as? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code = countryDict[<\/span><span style=\"color: #98C379\">&quot;iso2Code&quot;<\/span><span style=\"color: #ABB2BF\">] as? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: regionValue,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: iso2Code) ?? <\/span><span style=\"color: #98C379\">&quot;\ud83c\udff3\ufe0f&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { !<\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">.isEmpty }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: countries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Failed to decode response: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Decoding error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        task.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonArray = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> JSONSerialization.<\/span><span style=\"color: #61AFEF\">jsonObject<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: data) as? [Any],<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> dataArray = (jsonArray[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">] as? [[<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Any]])?.first,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = dataArray[<\/span><span style=\"color: #98C379\">&quot;value&quot;<\/span><span style=\"color: #ABB2BF\">] as? <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                            <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonArray = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> JSONSerialization.<\/span><span style=\"color: #61AFEF\">jsonObject<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: data) as? [Any],<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> dataArray = (jsonArray[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">] as? [[<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> Any]])?.first,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = dataArray[<\/span><span style=\"color: #98C379\">&quot;value&quot;<\/span><span style=\"color: #ABB2BF\">] as? <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;GDP fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> cached = countryDataCache[iso2Code] ?? (<\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countryDataCache[iso2Code] = cached<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries = countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> country.iso2Code == iso2Code {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> flag = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> unicode <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> scalar = <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + unicode.value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                flag.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(scalar))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> flag<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Views ( \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435, \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 ):<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.5 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Views remain the same as in the previous version\nstruct ContentView: View {\n    @StateObject private var viewModel = CountriesViewModel()\n    \n    var body: some View {\n        NavigationView {\n            Group {\n                if viewModel.isLoading {\n                    ProgressView(&quot;Loading countries...&quot;)\n                } else if let errorMessage = viewModel.errorMessage {\n                    ErrorView(message: errorMessage, retryAction: {\n                        viewModel.loadCountries()\n                    })\n                } else {\n                    CountryListView(viewModel: viewModel)\n                }\n            }\n            .navigationTitle(&quot;World Countries&quot;)\n        }\n        .onAppear {\n            viewModel.loadCountries()\n        }\n    }\n}\n\n\/\/ Rest of the view code remains the same...\nstruct CountryListView: View {\n    @ObservedObject var viewModel: CountriesViewModel\n    \n    var body: some View {\n        List {\n            ForEach(viewModel.categories, id: \\.self) { category in\n                Section(header: Text(category)) {\n                    ForEach(viewModel.countries(in: category)) { country in\n                        NavigationLink(destination: CountryDetailView(country: country)) {\n                            CountryRowView(country: country)\n                        }\n                    }\n                }\n            }\n        }\n        .refreshable {\n            viewModel.loadCountries()\n        }\n    }\n}\n\nstruct CountryRowView: View {\n    let country: Country\n    \n    var body: some View {\n        HStack {\n            Text(country.flag)\n                .font(.title2)\n            Text(country.name)\n                .font(.body)\n        }\n        .padding(.vertical, 4)\n    }\n}\n\nstruct CountryDetailView: View {\n    let country: Country\n    \n    var body: some View {\n        ScrollView {\n            VStack(spacing: 20) {\n                Text(country.flag)\n                    .font(.system(size: 100))\n                \n                Text(country.name)\n                    .font(.title)\n                    .fontWeight(.bold)\n                \n                VStack(alignment: .leading, spacing: 15) {\n                    DetailRow(title: &quot;Region&quot;, value: country.category)\n                    \n                    if let population = country.population {\n                        DetailRow(\n                            title: &quot;Population&quot;,\n                            value: formatNumber(population)\n                        )\n                    }\n                    \n                    if let gdp = country.gdp {\n                        DetailRow(\n                            title: &quot;GDP (USD)&quot;,\n                            value: formatCurrency(gdp)\n                        )\n                    }\n                }\n                .padding()\n                \n                Spacer()\n            }\n        }\n        .navigationBarTitleDisplayMode(.inline)\n        .padding()\n    }\n    \n    private func formatNumber(_ number: Int) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .decimal\n        return formatter.string(from: NSNumber(value: number)) ?? String(number)\n    }\n    \n    private func formatCurrency(_ number: Double) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .currency\n        formatter.currencyCode = &quot;USD&quot;\n        formatter.maximumFractionDigits = 0\n        return formatter.string(from: NSNumber(value: number)) ?? String(number)\n    }\n}\n\nstruct DetailRow: View {\n    let title: String\n    let value: String\n    \n    var body: some View {\n        HStack {\n            Text(title)\n                .fontWeight(.medium)\n                .foregroundColor(.gray)\n            Spacer()\n            Text(value)\n                .fontWeight(.medium)\n        }\n    }\n}\n\nstruct ErrorView: View {\n    let message: String\n    let retryAction: () -&gt; Void\n    \n    var body: some View {\n        VStack(spacing: 16) {\n            Text(&quot;Error&quot;)\n                .font(.title)\n                .foregroundColor(.red)\n            Text(message)\n                .multilineTextAlignment(.center)\n            Button(&quot;Retry&quot;, action: retryAction)\n                .buttonStyle(.bordered)\n        }\n        .padding()\n    }\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Views remain the same as in the previous version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ContentView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@StateObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel = <\/span><span style=\"color: #61AFEF\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Group<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Loading countries...&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> errorMessage = viewModel.errorMessage {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ErrorView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: errorMessage, <\/span><span style=\"color: #61AFEF\">retryAction<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">CountryListView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">viewModel<\/span><span style=\"color: #ABB2BF\">: viewModel)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;World Countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onAppear<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Rest of the view code remains the same...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryListView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel: CountriesViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">List<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">categories<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { category <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Section<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">header<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(category)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: category)) { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">NavigationLink<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">destination<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">CountryDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">CountryRowView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">refreshable<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryRowView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> country: Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title2<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">body<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryDetailView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> country: Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">20<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">100<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bold<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Region&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = country.population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Population&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">formatNumber<\/span><span style=\"color: #ABB2BF\">(population)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = country.gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;GDP (USD)&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">formatCurrency<\/span><span style=\"color: #ABB2BF\">(gdp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: number)) ?? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(number)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatCurrency<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">currency<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">currencyCode<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;USD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">maximumFractionDigits<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: number)) ?? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(number)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">DetailRow<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> title: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(title)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ErrorView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> message: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> retryAction: () -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(message)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">multilineTextAlignment<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">center<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Retry&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: retryAction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">buttonStyle<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bordered<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 response API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>Model<\/code>):<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u200b\u200b\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0443 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430&nbsp; \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init(from decoder: Decoder) throws {<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u200b\u200b\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Optional<\/mark><\/code> \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u0431\u043e\u0435\u0432 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/span><\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (<code>ViewModel<\/code>):<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u043b\u0430\u0434\u043e\u043a<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 2-\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcqWc8rcIx9h3MeYMZIsW_ukPVqkAihC8rYmxZtAFZfFahtiueTJtmtXJAnPDI12oHRJpYpTnNSh9YgiagCAr914CzFrTOM830zNsIidcz4kDAxw4dKOUYUj-9OstE6QJupDprj?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0423 \u043d\u0430\u0441 \u043e\u0434\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><em><code>Any<\/code> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u2018<code>Decodable<\/code>\u201d <br>\u041a\u0430\u0441\u0442\u0438\u043d\u0433<code> [Any?] <\/code>\u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0422\u0418\u041f\u043e\u043c <code>\u2018[String:A<\/code><\/em><code>ny?]<\/code>\u2019 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u0430\u0442\u044c\u0441\u044f.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043e\u0440\u043e\u0447\u0435, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfFkxcd1HZs2kzqenmguNK6bLQUl8OpGlD8enAlU92pxN3knAVxvCCuvS3OXCTBrwnkCWyN_2zK_DWELHbahl96hRQvYYnfi2MkmIKmxmBjaZoV6r2B69Avvgj9Z8_6TbQ_Dpouow?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0442\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 1-\u043e\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435, <span style=\"font-weight: 400;\">a \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u041c\u043e\u0434\u0435\u043b\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankResponse<\/mark><\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u201c\u0440\u0443\u0447\u043d\u043e\u0435\u201d \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init(from decoder: Decoder) throws,<\/mark><\/code> \u043d\u043e \u043e\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e <strong>\u043d\u0435\u0432\u0435\u0440\u043d\u043e<\/strong>, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 <strong>Claude 3.5 Sonnet&nbsp; <\/strong>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430:<\/span><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ World Bank API response format\nstruct WorldBankResponse: Decodable {\n    let data: [CountryData]\n    \n    enum CodingKeys: String, CodingKey {\n        case data = &quot;1&quot;\n    }\n    \n    init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        self.data = try container.decode([CountryData].self, forKey: .data)\n    }\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ World Bank API response format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [CountryData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;1&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">container<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">keyedBy<\/span><span style=\"color: #ABB2BF\">: CodingKeys.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([CountryData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">forKey<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418\u0442\u0430\u043a, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <strong>Claude 3.5 Sonnet <\/strong>\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u043d\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON \u0434\u0430\u043d\u043d\u044b\u0445&nbsp; \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u0435 \u0436\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u044d\u0442\u0438 JSON&nbsp; \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <a href=\"https:\/\/api.worldbank.org\/v2\/country?format=json&amp;per_page=300\">https:\/\/api.worldbank.org\/v2\/country?format=json&amp;per_page=300<\/a>&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfogz1tXkE2UvRh4s8QG2G7T3cvl-jZ5g_I7fO2gYMGL-yqo5Jx0PzH4LaTUjjV4mAQmMWnQG23yz-_qDsn1viSsGAFIc7sOZ67FNr9aKnBk0RNR_O7nOmOE1jaN31F4yywGxHUkA?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Metadata<\/mark><\/code> \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[Country]<\/mark><\/code>. <\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"[\n MetaData,\n  [Country]\n]  \" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> MetaData,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  [Country]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">]  <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 JSON \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e \u0432 Swift \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Codable<\/mark><\/code> \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u201c\u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c\u201d \u044d\u0442\u0438 &#171;\u0436\u0438\u0432\u044b\u0435&#187; JSON \u0434\u0430\u043d\u043d\u044b\u0435&nbsp; <strong>Claude 3.5 Sonnet <\/strong>\u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043c \u0435\u0451 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39-1024x584.png\" alt=\"\" class=\"wp-image-16361\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39-1024x584.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39-300x171.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39-768x438.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39-500x285.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-29-at-20.00.39.png 1274w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 JSON \u0438\u0437 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430.<br><br><strong>Fixed Countries App with Correct World Bank API Models 3 \/ 3<\/strong><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Models:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    let population: Int?\n    let gdp: Double?\n    let iso2Code: String\n}\n\n\/\/ Exact World Bank API response format\nstruct WorldBankMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page: String\n    let total: Int\n}\n\nstruct WorldBankCountry: Decodable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: AdminRegion\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    \n    struct Region: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct AdminRegion: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct IncomeLevel: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct LendingType: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n}\n\nstruct IndicatorResponse: Decodable {\n    let metadata: IndicatorMetadata\n    let data: [IndicatorData]\n    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(WorldBankMetadata.self)\n        data = try container.decode([IndicatorData].self)\n    }\n}\n\nstruct IndicatorMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page:Int\n    let total: Int\n}\n\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Exact World Bank API response format<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankCountry<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: AdminRegion<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AdminRegion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: IndicatorMetadata<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        data = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page:<\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>ViewModel:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    private var countryDataCache: [String: (population: Int?, gdp: Double?)] = [:]\n    \n    func loadCountries() {\n        isLoading = true\n        errorMessage = nil\n        \n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n            errorMessage = &quot;Invalid URL&quot;\n            isLoading = false\n            return\n        }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            DispatchQueue.main.async {\n                if let error = error {\n                    self?.errorMessage = &quot;Network error: \\(error.localizedDescription)&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                guard let data = data else {\n                    self?.errorMessage = &quot;No data received&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                do {\n                    let decoder = JSONDecoder()\n                    \/\/ Decode as array containing metadata and countries array\n                    let container = try decoder.decode([Any].self, from: data)\n                    if let jsonData = \n                try? JSONSerialization.data(withJSONObject: container[1], options: []),\n                let countries = try? decoder.decode([WorldBankCountry].self, \n                                                                    from: jsonData) {\n                        \n                        let filteredCountries = countries\n                            .filter { $0.region.value != &quot;Aggregates&quot; } \n                            .map { countryData in\n                                Country(\n                                  name: countryData.name,\n                                  category: countryData.region.value,\n                                  flag: \n                                  self?.flagEmoji(from: countryData.iso2Code) ?? &quot;\ud83c\udff3\ufe0f&quot;,\n                                  population: nil,\n                                  gdp: nil,\n                                  iso2Code: countryData.iso2Code\n                                )\n                            }\n                        \n                        self?.countries = filteredCountries\n                        self?.fetchAdditionalData(for: filteredCountries)\n                    }\n                } catch {\n                    self?.errorMessage = \n                             &quot;Failed to decode response: \\(error.localizedDescription)&quot;\n                    print(&quot;Decoding error: \\(error)&quot;)\n                }\n                self?.isLoading = false\n            }\n        }.resume()\n    }\n    \n    private func fetchAdditionalData(for countries: [Country]) {\n        for country in countries {\n            fetchPopulation(for: country)\n            fetchGDP(for: country)\n        }\n    }\n    \n    private func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                let decoder = JSONDecoder()\n                let response = try decoder.decode([Any].self, from: data)\n                if let jsonData =\n                   try? JSONSerialization.data(withJSONObject: response[1], options: []),\n                   let indicators = try? decoder.decode([IndicatorData].self, \n                                                             from: jsonData),\n                   let value = indicators.first?.value {\n                    DispatchQueue.main.async {\n                        self?.updateCountryData(iso2Code: country.iso2Code, population: Int(value))\n                    }\n                }\n            } catch {\n                print(&quot;Population fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n              let decoder = JSONDecoder()\n              let response = try decoder.decode([Any].self, from: data)\n              if let jsonData = try? \n                JSONSerialization.data(withJSONObject: response[1], options: []),\n               let indicators = try? decoder.decode([IndicatorData].self, from: jsonData),\n                   let value = indicators.first?.value {\n                    DispatchQueue.main.async {\n                        self?.updateCountryData(iso2Code: country.iso2Code, gdp: value)\n                    }\n              }\n           } catch {\n                print(&quot;GDP fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    \/\/ Rest of the ViewModel implementation remains the same...\n    private func updateCountryData(iso2Code: String, population: Int? = nil, gdp: Double? = nil) {\n        var cached = countryDataCache[iso2Code] ?? (population: nil, gdp: nil)\n        \n        if let population = population {\n            cached.population = population\n        }\n        if let gdp = gdp {\n            cached.gdp = gdp\n        }\n        \n        countryDataCache[iso2Code] = cached\n        \n        countries = countries.map { country in\n            if country.iso2Code == iso2Code {\n                return Country(\n                    name: country.name,\n                    category: country.category,\n                    flag: country.flag,\n                    population: cached.population,\n                    gdp: cached.gdp,\n                    iso2Code: country.iso2Code\n                )\n            }\n            return country\n        }\n    }\n    \n    private func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        var flag = &quot;&quot;\n        for unicode in iso2Code.uppercased().unicodeScalars {\n            if let scalar = UnicodeScalar(base + unicode.value) {\n                flag.append(String(scalar))\n            }\n        }\n        return flag\n    }\n    \n    var categories: [String] {\n        Array(Set(countries.map { $0.category })).sorted()\n    }\n    \n    func countries(in category: String) -&gt; [Country] {\n        countries.filter { $0.category == category }\n    }\n}\n\n\/\/ Views remain the same as in the previous version\n\/\/ (ContentView, CountryListView, CountryRowView, CountryDetailView, DetailRow, ErrorView)\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countryDataCache: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">: (population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?, gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?)] = [<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> error = error {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;Network error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;No data received&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Decode as array containing metadata and countries array<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Any].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? JSONSerialization.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">withJSONObject<\/span><span style=\"color: #ABB2BF\">: container[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: []),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankCountry].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                                                    <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value != <\/span><span style=\"color: #98C379\">&quot;Aggregates&quot;<\/span><span style=\"color: #ABB2BF\"> } <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { countryData <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">) ?? <\/span><span style=\"color: #98C379\">&quot;\ud83c\udff3\ufe0f&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = filteredCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: filteredCountries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #98C379\">&quot;Failed to decode response: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Decoding error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Any].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData =<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? JSONSerialization.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">withJSONObject<\/span><span style=\"color: #ABB2BF\">: response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: []),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                                             <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Any].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                JSONSerialization.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">withJSONObject<\/span><span style=\"color: #ABB2BF\">: response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: []),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;GDP fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Rest of the ViewModel implementation remains the same...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> cached = countryDataCache[iso2Code] ?? (<\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countryDataCache[iso2Code] = cached<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries = countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> country.iso2Code == iso2Code {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> flag = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> unicode <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> scalar = <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + unicode.value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                flag.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(scalar))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> flag<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Views remain the same as in the previous version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ (ContentView, CountryListView, CountryRowView, CountryDetailView, DetailRow, ErrorView)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443 \u043e\u0442\u0432\u0435\u0442\u0430 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankMetadata<\/mark><\/code> \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0421\u043e\u0437\u0434\u0430\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Region<\/mark><\/code>, \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">AdminRegion<\/mark><\/code>, \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0434\u043e\u0445\u043e\u0434\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IncomeLevel<\/mark><\/code> \u0438 \u0442\u0438\u043f\u043e\u0432 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432\u0430\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LendingType<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d \u043f\u0430\u0440\u0441\u0438\u043d\u0433 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/span><\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f:<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u200b\u200b\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Aggregate<\/mark><\/code>&nbsp;<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041b\u0443\u0447\u0448\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Optional<\/mark><\/code> \u043f\u043e\u043b\u0435\u0439<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0411\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/span><\/li>\n<\/ul>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u200b\u200b\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/span><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code> \u043a\u0430\u043a \u0434\u0432\u0443\u0445\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041b\u0443\u0447\u0448\u0430\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0422\u0418\u041f\u043e\u0432 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0422\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043c\u0435\u043d \u0438 \u0422\u0418\u041f\u043e\u0432 \u043f\u043e\u043b\u0435\u0439<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041b\u0443\u0447\u0448\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Optional<\/mark><\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 3 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2018<code>Any<\/code>\u2019 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u2018<code>Decodable<\/code>\u2019. <br>\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0422\u0418\u041f\u044b &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>struct<\/code>, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>enum<\/code>, \u043a\u043b\u0430\u0441\u0441\u044b <code>class<\/code> \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u2018<code>Decodable<\/code>\u2019.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdCocRaSQMSZtW90FFGgEa8rybWK5pi-1ouPpDrqqEQR7krS2wpjJzxvNEeu3UQo9DF5FZZSyJgIkSmGxNKTZ38ZuWEMPtwGk1m4TYJmJfUw-K7ypOBG7eOKC8xP1K8JJaemsJMkw?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXffhUPFwkR-bSELam0bTezvx2w7CX1ge4RELVX0HHxvp1Ej0xVf-pc2dERAor00d08J0aZ2-fwVdSh6aGqCALf3gX33HYmqROJYMoHGuhxrseucOobmWZ-UklPKd9-ur02C4yJwKg?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfFxlDQBro6f7u09mUOsAEPv8i6Hbb8GsyoWOyx3NTCJ7BYUqI-yLnQQhoVX51UQwvO3uYMp6oDqNHOxJ8C7RkNvyqAuy5HJOmOqb6i1bdt9lOC737A2zViDdaRvIU0hFqoBVdRWA?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u201c\u0434\u0440\u0435\u0432\u043d\u0435\u0435\u201d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">JSONSerialization<\/mark><\/code>. <br>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 <strong>Claude 3.5 Sonnet<\/strong>:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    let population: Int?\n    let gdp: Double?\n    let iso2Code: String\n}\n\n\/\/ Exact World Bank API response format\nstruct WorldBankMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page: String\n    let total: Int\n}\n\nstruct WorldBankCountry: Decodable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: AdminRegion\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    \n    struct Region: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct AdminRegion: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct IncomeLevel: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct LendingType: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n}\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Exact World Bank API response format<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankCountry<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: AdminRegion<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AdminRegion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Countries<\/mark><\/code>, \u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankMetadata<\/mark><\/code> \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankCountry<\/mark><\/code>, \u043d\u043e \u043d\u0435\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankResponse<\/mark><\/code>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 &#8212; \u043e\u0434\u0438\u043d <mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"><code>WorldBankMetadata<\/code><\/mark> , a \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043c\u0430\u0441\u0441\u0438\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[WorldBankCountry]<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u044d\u0442\u043e\u043c\u0443 <strong>Claude 3.5 Sonnet,<\/strong> \u043f\u044b\u0442\u0430\u044f\u0441\u044c &#171;\u0432\u044b\u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f&#187;, \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u201c\u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u201d \u0441 \u2018<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Any<\/mark><\/code>\u2019, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(1 * 0.5 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"let decoder = JSONDecoder()\n\/\/ Decode as array containing metadata and countries array\n\nlet container = try decoder.decode([Any].self, from: data)\nif let jsonData = try? JSONSerialization.data(withJSONObject: container[1], options: []),\n let countries = try? decoder.decode([WorldBankCountry].self, from: jsonData) {\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Decode as array containing metadata and countries array<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Any].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? JSONSerialization.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">withJSONObject<\/span><span style=\"color: #ABB2BF\">: container[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">], <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: []),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankCountry].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData) {<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u043e \u0441 \u041c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0438 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0435\u0451 \u0412\u0412\u041f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u0432\u0441\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u0435\u0441\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IndicatorResponse<\/mark><\/code>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 &#8212; \u043e\u0434\u0438\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IndicatorMetadata<\/mark><\/code> , a \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043c\u0430\u0441\u0441\u0438\u0432 [<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IndicatorData] <\/mark><\/code>\u0438 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init (from decoder: Decoder) <\/mark><\/code>\u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">decoder.unkeyedContainer() <\/mark><\/code>\u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Fantasque-Sans-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-Fantasque-Sans-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.5 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"struct IndicatorResponse: Decodable {\n    let metadata: IndicatorMetadata\n    let data: [IndicatorData]\n    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(IndicatorMetadata.self)\n        data = try container.decode([IndicatorData].self)\n    }\n}\n\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\n\n\/\/ Exact World Bank API response format\nstruct IndicatorMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page: Int\n    let total: Int\n}\n\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: IndicatorMetadata<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        data = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Exact World Bank API response format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"do {\n   let response = try JSONDecoder().decode(IndicatorResponse.self, from: data)\n   let indicators = response.data\n   let value = indicators.first?.value\n   DispatchQueue.main.async {\n     self?.updateCountryData(iso2Code: country.iso2Code, \n                                                     population: Int(value!))\n   }\n                \n} catch {\n     print(&quot;Population fetch error: \\(error)&quot;)\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                     <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value!))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">} <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">. . . \u0438 \u0432\u0441\u0451 \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u043e \u043d\u0435\u0442&nbsp; <strong>Claude 3.5 Sonnet <\/strong>\u043e\u043f\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u201c\u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u201d \u0441 \u2018<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Any<\/mark><\/code>\u2019, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\" do {\n    let decoder = JSONDecoder()\n    let response = try decoder.decode([Any].self, from: data)\n    if let jsonData = try? JSONSerialization.data(withJSONObject: response[1], \n                                                                options: []),\n     let indicators = try? decoder.decode([IndicatorData].self, \n                                                             from: jsonData),\n     let value = indicators.first?.value {\n      DispatchQueue.main.async {\n         self?.updateCountryData(iso2Code: country.iso2Code, \n                                                     population: Int(value))\n      }\n    }\n} catch {\n                print(&quot;Population fetch error: \\(error)&quot;)\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Any].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? JSONSerialization.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">withJSONObject<\/span><span style=\"color: #ABB2BF\">: response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">], <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                                <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: []),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                             <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                     <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">} <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><em>\u2018<code>Any<\/code>\u2019 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u2018<code>Decodable<\/code>\u2019. <br>\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0422\u0418\u041f\u044b &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>struct<\/code>, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code>enum<\/code>, \u043a\u043b\u0430\u0441\u0441\u044b <code>class<\/code> \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u2018<code>Decodable<\/code>\u2019.<\/em><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u044b\u0442\u0430\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0434\u0432\u0430\u0436\u0434\u044b \u201c\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u201d&nbsp; <strong>Claude 3.5 Sonnet,<\/strong> \u043d\u043e \u043d\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e&nbsp; Claude 3.5 Sonnet \u043f\u043b\u043e\u0445\u043e \u201c\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u201d \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435, \u043d\u043e \u043d\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 JSON \u0434\u0430\u043d\u043d\u044b\u0435.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 UI \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, <strong>Claude 3.5 Sonnet<\/strong> \u0445\u043e\u0440\u043e\u0448\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0439 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e,&nbsp; \u043d\u043e \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u0442\u043e \u043c\u044b \u043c\u043e\u0433 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u043a\u0430, \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 JSON \u0434\u0430\u043d\u043d\u044b\u0445,&nbsp; \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u0435 \u0432 \u0418\u0418 <strong>Claude 3.5 Sonnet<\/strong> .<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0418\u0418 &#8212; <strong>ChatGPT 4.0-mini<\/strong>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ChatGPT decode JSON \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d Country<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"500\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53-1024x500.png\" alt=\"\" class=\"wp-image-16370\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53-1024x500.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53-300x147.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53-768x375.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53-500x244.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-16.40.53.png 1302w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e\u0431\u044b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 JSON \u0432 Swift, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c, \u0442\u0430\u043a \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u0442\u0440\u0430\u043d\u0435. \u0414\u0430\u043d\u043d\u044b\u0435 JSON \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Metadata (page, pages, per_page, total)<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u0441\u0442\u0440\u0430\u043d\u0435<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"> Country <\/mark><\/code>\u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">region: Region<\/mark><\/code>, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0445\u043e\u0434\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">incomeLevel: IncomeLevel<\/mark><\/code> \u0438 \u0442. \u0434.).<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 JSON \u0432 Swift.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0428\u0430\u0433 1: \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u041c\u043e\u0434\u0435\u043b\u0435\u0439 \u0414\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\nstruct Metadata: Decodable {\n    let page: Int\n    let pages: Int\n    let perPage: String\n    let total: Int\n    \n    enum CodingKeys: String, CodingKey {\n        case page\n        case pages\n        case perPage = &quot;per_page&quot;\n        case total\n    }\n}\n\nstruct Region: Decodable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct AdminRegion: Decodable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct IncomeLevel: Decodable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct LendingType: Decodable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct Country: Decodable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: AdminRegion\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n}\n\nstruct Response: Decodable {\n    let metadata: Metadata\n    let countries: [Country]\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Metadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> perPage: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">page<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">pages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">perPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;per_page&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">total<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AdminRegion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: AdminRegion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Response<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: Metadata<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries: [Country]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0428\u0430\u0433 2: \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 Array<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 JSON \u0438\u043c\u0435\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u0430\u043d. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(1 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"extension Response {\n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        self.metadata = try container.decode(Metadata.self)\n        self.countries = try container.decode([Country].self)\n    }\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">extension<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Response<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">metadata<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(Metadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Country].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 3: \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c JSON<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"let jsonData = &quot;&quot;&quot;\n[\n    {&quot;page&quot;:1,&quot;pages&quot;:1,&quot;per_page&quot;:&quot;300&quot;,&quot;total&quot;:296},\n    [\n        {\n            &quot;id&quot;:&quot;ABW&quot;,\n            &quot;iso2Code&quot;:&quot;AW&quot;,\n            &quot;name&quot;:&quot;Aruba&quot;,\n            &quot;region&quot;:{&quot;id&quot;:&quot;LCN&quot;,&quot;iso2code&quot;:&quot;ZJ&quot;,&quot;value&quot;:&quot;Latin America &amp; Caribbean &quot;},\n            &quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},\n            &quot;incomeLevel&quot;:{&quot;id&quot;:&quot;HIC&quot;,&quot;iso2code&quot;:&quot;XD&quot;,&quot;value&quot;:&quot;High income&quot;},\n            &quot;lendingType&quot;:{&quot;id&quot;:&quot;LNX&quot;,&quot;iso2code&quot;:&quot;XX&quot;,&quot;value&quot;:&quot;Not classified&quot;},\n            &quot;capitalCity&quot;:&quot;Oranjestad&quot;,\n            &quot;longitude&quot;:&quot;-70.0167&quot;,\n            &quot;latitude&quot;:&quot;12.5167&quot;\n        },\n        {\n            &quot;id&quot;:&quot;AFE&quot;,\n            &quot;iso2Code&quot;:&quot;ZH&quot;,\n            &quot;name&quot;:&quot;Africa Eastern and Southern&quot;,\n            &quot;region&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},\n            &quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},\n            &quot;incomeLevel&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},\n            &quot;lendingType&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;Aggregates&quot;},\n            &quot;capitalCity&quot;:&quot;&quot;,\n            &quot;longitude&quot;:&quot;&quot;,\n            &quot;latitude&quot;:&quot;&quot;\n        }\n    ]\n]\n&quot;&quot;&quot;.data(using: .utf8)!\n\ndo {\n    let response = try JSONDecoder().decode(Response.self, from: jsonData)\n    print(&quot;Metadata:&quot;, response.metadata)\n    print(&quot;Countries:&quot;, response.countries)\n} catch {\n    print(&quot;Decoding error:&quot;, error)\n}\n\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = <\/span><span style=\"color: #98C379\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">    {&quot;page&quot;:1,&quot;pages&quot;:1,&quot;per_page&quot;:&quot;300&quot;,&quot;total&quot;:296},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">    [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;id&quot;:&quot;ABW&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;iso2Code&quot;:&quot;AW&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;name&quot;:&quot;Aruba&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;region&quot;:{&quot;id&quot;:&quot;LCN&quot;,&quot;iso2code&quot;:&quot;ZJ&quot;,&quot;value&quot;:&quot;Latin America &amp; Caribbean &quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;incomeLevel&quot;:{&quot;id&quot;:&quot;HIC&quot;,&quot;iso2code&quot;:&quot;XD&quot;,&quot;value&quot;:&quot;High income&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;lendingType&quot;:{&quot;id&quot;:&quot;LNX&quot;,&quot;iso2code&quot;:&quot;XX&quot;,&quot;value&quot;:&quot;Not classified&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;capitalCity&quot;:&quot;Oranjestad&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;longitude&quot;:&quot;-70.0167&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;latitude&quot;:&quot;12.5167&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">        },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;id&quot;:&quot;AFE&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;iso2Code&quot;:&quot;ZH&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;name&quot;:&quot;Africa Eastern and Southern&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;region&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;incomeLevel&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;lendingType&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;Aggregates&quot;},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;capitalCity&quot;:&quot;&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;longitude&quot;:&quot;&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">            &quot;latitude&quot;:&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">    ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">&quot;&quot;&quot;<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">using<\/span><span style=\"color: #ABB2BF\">: .utf8)!<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(Response.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Metadata:&quot;<\/span><span style=\"color: #ABB2BF\">, response.<\/span><span style=\"color: #E06C75\">metadata<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Countries:&quot;<\/span><span style=\"color: #ABB2BF\">, response.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">} <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Decoding error:&quot;<\/span><span style=\"color: #ABB2BF\">, error)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>Data Models<\/strong>: \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct<\/mark><\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0447\u0430\u0441\u0442\u044c JSON \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 (\u201c\u0440\u0443\u0447\u043d\u043e\u0439\u201d) \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440<\/strong>: \u0423 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Response<\/mark><\/code> \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 (\u201c\u0440\u0443\u0447\u043d\u043e\u0439\u201d) \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f&nbsp; \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">unkeyedContainer<\/mark><\/code> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Array<\/mark><\/code>) \u0432 \u043a\u043e\u0440\u043d\u0435.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>: <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">JSONDecoder().decode(Response.self, from: jsonData) <\/mark><\/code>\u043f\u0430\u0440\u0441\u0438\u0442 JSON \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Response<\/mark><\/code> \u043c\u043e\u0434\u0435\u043b\u044c.<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0434\u0430\u043d\u043d\u044b\u0445, <span style=\"font-weight: 400;\"><strong>ChatGPT 4.0-mini<\/strong><\/span> \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u0441\u0442\u0430\u0442\u0438, <strong>Gemini 2.0 Flash (\u0441\u043c\u043e\u0442\u0440\u0438 \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 1) <\/strong>\u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u0447\u0442\u043e \u0438 <strong>ChatGPT 4.0-mini<\/strong>.&nbsp;\u0410 \u0432\u043e\u0442 <strong>Gemini 1.5 Flash<\/strong> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0433\u043e, \u0438 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 <strong>Claude 3.5 Sonnet<\/strong>, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e <strong>Claude 3.5 Sonnet&nbsp;<\/strong> \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 (\u201c\u0440\u0443\u0447\u043d\u043e\u0439\u201d) \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f&nbsp; \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">unkeyedContainer <\/mark><\/code>\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Array<\/mark><\/code>) \u0432 \u043a\u043e\u0440\u043d\u0435. \u0418 \u0432 \u044d\u0442\u043e\u043c \u0435\u0451 \u043e\u0448\u0438\u0431\u043a\u0430.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 <strong>Claude 3.5 Sonnet<\/strong> \u0438 \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u0430\u0431\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 <strong>ChatGPT \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443&nbsp;<\/strong> <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Response<\/mark><\/code> \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c (\u201c\u0440\u0443\u0447\u043d\u044b\u043c\u201d) \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">unkeyedContainer<\/mark><\/code> (\u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Array<\/mark><\/code>).<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Claude 3.5 Sonnet \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435<\/strong>: \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f  \u041c\u043e\u0434\u0435\u043b\u0435\u0439<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"122\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image.png\" alt=\"\" class=\"wp-image-16373\" style=\"width:68px;height:auto\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><\/strong><strong>\u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u201c\u0440\u0443\u0447\u043d\u043e\u0433\u043e\u201d \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 Array<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fixed Countries App with Correct World Bank API Models&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Models:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    let population: Int?\n    let gdp: Double?\n    let iso2Code: String\n}\n\/\/ Exact World Bank API response format\n\/\/----- Root\nstruct WorldBankResponse: Decodable {\n    let metadata: WorldBankMetadata\n    let countries: [WorldBankCountry]\n    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(WorldBankMetadata.self)\n        countries = try container.decode([WorldBankCountry].self)\n    }\n}\n\/\/------- Meta\nstruct WorldBankMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let perPage: String\n    let total: Int\n    \n    enum CodingKeys: String, CodingKey {\n            case page\n            case pages\n            case perPage = &quot;per_page&quot;\n            case total\n        }\n}\n\/\/------- Country\nstruct WorldBankCountry: Decodable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: AdminRegion\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    \n    struct Region: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct AdminRegion: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct IncomeLevel: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct LendingType: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n}\n\/\/----- Root\nstruct IndicatorResponse: Decodable {\n    let metadata: IndicatorMetadata\n    let data: [IndicatorData]\n    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(IndicatorMetadata.self)\n        data = try container.decode([IndicatorData].self)\n    }\n}\n\/\/----- Meta\nstruct IndicatorMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page: Int\n    let total: Int\n}\n\/\/----- Indicator\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Exact World Bank API response format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Root<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: WorldBankMetadata<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries: [WorldBankCountry]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankCountry].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/------- Meta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> perPage: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">page<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">pages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">perPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;per_page&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">total<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/------- Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankCountry<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: AdminRegion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AdminRegion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: IndicatorMetadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        data = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Meta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Indicator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ViewModel:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    private var countryDataCache: [String: (population: Int?, gdp: Double?)] = [:]\n    \n    func loadCountries() {\n      isLoading = true\n      errorMessage = nil\n        \n      let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n      guard let url = URL(string: urlString) else {\n          errorMessage = &quot;Invalid URL&quot;\n          isLoading = false\n          return\n      }\n        \n      URLSession.shared.dataTask(with: url) { [weak self] data, response,\n        error in\n            DispatchQueue.main.async {\n                if let error = error {\n                    self?.errorMessage = \n                               &quot;Network error: \\(error.localizedDescription)&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                guard let data = data else {\n                    self?.errorMessage = &quot;No data received&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                do {\n                  let decoder = JSONDecoder()\n                   \/\/---------------\n                  let response = try decoder.decode(WorldBankResponse.self, \n                                                                 from: data)\n                  let countries = response.countries\n                  \/\/---------------\n\n                  \/\/ Filter out aggregate regions                      \n                  let filteredCountries = countries\n                        .filter { $0.region.value != &quot;Aggregates&quot; } \n                        .map { countryData in\n                            Country(\n                              name: countryData.name,\n                              category: countryData.region.value,\n                              flag: \n                        self?.flagEmoji(from: countryData.iso2Code) ?? &quot;\ud83c\udff3\ufe0f&quot;,\n                              population: nil,\n                              gdp: nil,\n                              iso2Code: countryData.iso2Code\n                            )\n                        }\n                        \n                        self?.countries = filteredCountries\n                        self?.fetchAdditionalData(for: filteredCountries)\n                } catch {\n                    self?.errorMessage = \n                   &quot;Failed to decode response:\\(error.localizedDescription)&quot;\n                    print(&quot;Decoding error: \\(error)&quot;)\n                }\n                self?.isLoading = false\n            }\n        }.resume()\n    }\n    \n    private func fetchAdditionalData(for countries: [Country]) {\n        for country in countries {\n            fetchPopulation(for: country)\n            fetchGDP(for: country)\n        }\n    }\n    \n    private func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, \n         error in\n            guard let data = data else { return }\n            \n            do {\n                \/\/---------------\n                let response = try \n                    JSONDecoder().decode(IndicatorResponse.self, from: data)\n                let indicators = response.data\n                let value = indicators.first?.value\n                DispatchQueue.main.async {\n                  self?.updateCountryData(iso2Code: country.iso2Code, \n                                                   population: Int(value!))\n                }\n                \/\/-------------\n            } catch {\n                print(&quot;Population fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                \/\/--------------\n                let response = try \n                     JSONDecoder().decode(IndicatorResponse.self, from: data)\n                let indicators = response.data\n                let value = indicators.first?.value\n                DispatchQueue.main.async {\n              self?.updateCountryData(iso2Code: country.iso2Code, gdp: value)\n                    }\n                \/\/--------------\n            } catch {\n                print(&quot;GDP fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    \/\/ Rest of the ViewModel implementation remains the same...\n    private func updateCountryData(iso2Code: String, population: Int? = nil, gdp: Double? = nil) {\n        var cached = countryDataCache[iso2Code] ?? \n                                      (population: nil, gdp: nil)\n        \n        if let population = population {\n            cached.population = population\n        }\n        if let gdp = gdp {\n            cached.gdp = gdp\n        }\n        \n        countryDataCache[iso2Code] = cached\n        \n        countries = countries.map { country in\n            if country.iso2Code == iso2Code {\n                return Country(\n                    name: country.name,\n                    category: country.category,\n                    flag: country.flag,\n                    population: cached.population,\n                    gdp: cached.gdp,\n                    iso2Code: country.iso2Code\n                )\n            }\n            return country\n        }\n    }\n    \n    private func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        var flag = &quot;&quot;\n        for unicode in iso2Code.uppercased().unicodeScalars {\n            if let scalar = UnicodeScalar(base + unicode.value) {\n                flag.append(String(scalar))\n            }\n        }\n        return flag\n    }\n    \n    var categories: [String] {\n        Array(Set(countries.map { $0.category })).sorted()\n    }\n    \n    func countries(in category: String) -&gt; [Country] {\n        countries.filter { $0.category == category }\n    }\n}\n\n\/\/ Views remain the same as in the previous version\n\/\/ (ContentView, CountryListView, CountryRowView, CountryDetailView, DetailRow, ErrorView)\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countryDataCache: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">: (population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?, gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?)] = [<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> error = error {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #98C379\">&quot;Network error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;No data received&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/---------------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                                                 <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = response.<\/span><span style=\"color: #E06C75\">countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/---------------<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Filter out aggregate regions                      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value != <\/span><span style=\"color: #98C379\">&quot;Aggregates&quot;<\/span><span style=\"color: #ABB2BF\"> } <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { countryData <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">) ?? <\/span><span style=\"color: #98C379\">&quot;\ud83c\udff3\ufe0f&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = filteredCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: filteredCountries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #98C379\">&quot;Failed to decode response:<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Decoding error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/---------------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                   <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value!))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/--------------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                     <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/--------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;GDP fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Rest of the ViewModel implementation remains the same...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> cached = countryDataCache[iso2Code] ?? <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                      (<\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countryDataCache[iso2Code] = cached<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries = countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> country.iso2Code == iso2Code {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> flag = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> unicode <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> scalar = <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + unicode.value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                flag.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(scalar))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> flag<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Views remain the same as in the previous version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ (ContentView, CountryListView, CountryRowView, CountryDetailView, DetailRow, ErrorView)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Countries<\/mark><\/code>, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankResponse<\/mark><\/code>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 &#8212; \u043e\u0434\u0438\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">WorldBankMetadata<\/mark><\/code> , a \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043c\u0430\u0441\u0441\u0438\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[WorldBankCountry]<\/mark><\/code>, c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init(from decoder: Decoder) throws&nbsp;<\/mark><\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u0430\u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">unkeyedContainer <\/mark><\/code>(\u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Array<\/mark><\/code>). \u0418 \u0432 \u044d\u0442\u043e\u043c \u201c\u0433\u0432\u043e\u0437\u0434\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b\u201d<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Exact World Bank API response format\n\/\/----- Root\nstruct WorldBankResponse: Decodable {\n    let metadata: WorldBankMetadata\n    let countries: [WorldBankCountry]\n\n \/\/-------------    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(WorldBankMetadata.self)\n        countries = try container.decode([WorldBankCountry].self)\n    }\n \/\/-------------\n}\n\n\/\/------- Meta\nstruct WorldBankMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let perPage: String\n    let total: Int\n    \n    enum CodingKeys: String, CodingKey {\n            case page\n            case pages\n            case perPage = &quot;per_page&quot;\n            case total\n        }\n}\n\/\/------- Country\nstruct WorldBankCountry: Decodable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: AdminRegion\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    \n    struct Region: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct AdminRegion: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct IncomeLevel: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct LendingType: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n}\n\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Exact World Bank API response format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: WorldBankMetadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries: [WorldBankCountry]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------------    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankCountry].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/------- Meta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> perPage: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">page<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">pages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">perPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;per_page&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">total<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/------- Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankCountry<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: AdminRegion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AdminRegion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code>:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(1 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"  do {\n \n      let decoder = JSONDecoder()\n      let response = try decoder.decode(WorldBankResponse.self, from: data)\n      let countries = response.countries\n\/\/. . . . . . . .\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = response.<\/span><span style=\"color: #E06C75\">countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/. . . . . . . .<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0438 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0435\u0451 \u0432\u0430\u043b\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439 \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IndicatorResponse<\/mark><\/code>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 &#8212; \u043e\u0434\u0438\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IndicatorMetadata<\/mark><\/code> , a \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043c\u0430\u0441\u0441\u0438\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[IndicatorData] <\/mark><\/code>\u0438 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init (from decoder: Decoder):<\/mark><\/code><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/----- Root\nstruct IndicatorResponse: Decodable {\n    let metadata: IndicatorMetadata\n    let data: [IndicatorData]\n    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(IndicatorMetadata.self)\n        data = try container.decode([IndicatorData].self)\n    }\n}\n\/\/----- Meta\nstruct IndicatorMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page: Int\n    let total: Int\n}\n\/\/----- Indicator\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: IndicatorMetadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        data = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Meta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Indicator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">A \u0432\u043e\u0442 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0438 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0435\u0451 \u0432\u0430\u043b\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IndicatorResponse<\/mark><\/code>:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\" private func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { [weak self] data, response, \n           error in\n            guard let data = data else { return }   \n            do {\n               \/\/---------------\n               let response = try \n                    JSONDecoder().decode(IndicatorResponse.self, from: data)\n               let indicators = response.data\n               let value = indicators.first?.value\n               DispatchQueue.main.async {\n                self?.updateCountryData(iso2Code: country.iso2Code, \n                                                   population: Int(value!))\n               }\n               \/\/-------------\n            } catch {\n                print(&quot;Population fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        URLSession.shared.dataTask(with: url) { [weak self] data, response, \n             error in\n            guard let data = data else { return }  \n            do {\n                \/\/--------------\n                let response = try \n                    JSONDecoder().decode(IndicatorResponse.self, from: data)\n                let indicators = response.data\n                let value = indicators.first?.value\n                DispatchQueue.main.async {\n               self?.updateCountryData(iso2Code: country.iso2Code, gdp: value)\n                }\n                \/\/--------------\n            } catch {\n                print(&quot;GDP fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/---------------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                   <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value!))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/--------------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/--------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;GDP fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-15.41.48.png\"><img loading=\"lazy\" decoding=\"async\" width=\"955\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-15.41.48-955x1024.png\" alt=\"\" class=\"wp-image-16383\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-15.41.48-955x1024.png 955w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-15.41.48-280x300.png 280w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-15.41.48-768x823.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-15.41.48.png 1336w\" sizes=\"auto, (max-width: 955px) 100vw, 955px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Claude 3.5 Sonnet <\/strong>: <strong>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u044d\u0448\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 population \u0438 gdp \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0432\u0435\u0449\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e <strong>Claude 3.5 Sonnet<\/strong> \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 &#8212; \u044d\u0442\u043e \u043a\u044d\u0448 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countryDataCache<\/mark><\/code> \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c (<strong>background<\/strong>) \u0440\u0435\u0436\u0438\u043c\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0438 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u0432\u0430\u043b\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c&nbsp; \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">main queue<\/mark><\/code> \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0442\u0440\u0430\u043d\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">country<\/mark><\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"> updateCountryData (iso2Code: country.iso2Code, gdp: value) <\/mark><\/code>\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">updateCountryData (iso2Code: country.iso2Code, population: Int(value!)<\/mark><\/code>):<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    private var countryDataCache: [String: (population: Int?, gdp: Double?)] = [:]\n\n\n\/\/. . . . . . . . . . . . . . . . .\n\n private func updateCountryData(iso2Code: String, population: Int? = nil, gdp: Double? = nil) {\n        var cached = countryDataCache[iso2Code] ?? (population: nil, gdp: nil)\n        \n        if let population = population {\n            cached.population = population\n        }\n        if let gdp = gdp {\n            cached.gdp = gdp\n        }\n        \n        countryDataCache[iso2Code] = cached\n        \n        countries = countries.map { country in\n            if country.iso2Code == iso2Code {\n                return Country(\n                    name: country.name,\n                    category: country.category,\n                    flag: country.flag,\n                    population: cached.population,\n                    gdp: cached.gdp,\n                    iso2Code: country.iso2Code\n                )\n            }\n            return country\n        }\n    }\n\/\/. . . . . . . . . . . . . . . . .\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countryDataCache: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">: (population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?, gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?)] = [<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/. . . . . . . . . . . . . . . . .<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountryData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> cached = countryDataCache[iso2Code] ?? (<\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = population {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = population<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = gdp {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = gdp<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        countryDataCache[iso2Code] = cached<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries = countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> country.iso2Code == iso2Code {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: cached.<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/. . . . . . . . . . . . . . . . .<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 population \u0438 gdp \u0441\u0442\u0440\u0430\u043d\u044b country \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 ChatGPT<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">func loadCountries() <\/mark><\/code>\u043d\u0430&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">main queue <\/mark><\/code>\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">DispatchQueue.main.async {. . . <\/mark><\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0442\u0440\u0430\u043d\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">country<\/mark><\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">iso2Code<\/mark><\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u043c&nbsp; <strong>ChatGPT<\/strong>, a \u0442\u043e\u0447\u043d\u0435\u0435 <strong>Swift Copilot<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438&nbsp; <strong>ChatGPT<\/strong>, (\u043e\u043d \u0434\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <span style=\"font-weight: 400;\"><strong>Claude 3.5 Sonnet<\/strong> <\/span>\u0438  <strong>Gemini 1.5 Flash)<\/strong>, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"493\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50-1024x493.png\" alt=\"\" class=\"wp-image-16375\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50-1024x493.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50-300x144.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50-768x369.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50-500x241.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-30-at-20.17.50.png 1110w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct Country<\/mark><\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[Country]<\/mark><\/code>, \u0433\u0434\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">iso2Code<\/mark><\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">iso2CodeFix<\/mark><\/code>, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 Swift. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Country<\/mark><\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct<\/mark><\/code>, \u043e\u043d\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445, \u0435\u0441\u043b\u0438 \u044f\u0432\u043d\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e (\u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">indices<\/mark><\/code> \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430).<br> \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">index<\/mark><\/code> \u0441\u0442\u0440\u0430\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">country<\/mark><\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">iso2CodeFix<\/mark><\/code>, \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    var population: Int? \/\/ `var` is required to allow mutation\n    var gdp: Double?\n    let iso2Code: String\n}\n\n var countries: [Country] = [\n    Country(name: &quot;CountryA&quot;, category: &quot;Category1&quot;, flag: &quot;\ud83c\udde6\ud83c\uddfa&quot;, \n                          population: 1000000, gdp: 1.2, iso2Code: &quot;AU&quot;),\n    Country(name: &quot;CountryB&quot;, category: &quot;Category2&quot;, flag: &quot;\ud83c\uddfa\ud83c\uddf8&quot;, \n                          population: 5000000, gdp: 20.5, iso2Code: &quot;US&quot;),\n    Country(name: &quot;CountryC&quot;, category: &quot;Category3&quot;, flag: &quot;\ud83c\uddee\ud83c\uddf3&quot;, \n                          population: 3000000, gdp: 3.1, iso2Code: &quot;IN&quot;)\n]\n\n let iso2CodeFix = &quot;US&quot;\n let newPopulation = 6000000\n\n\/\/ Update population for the country with iso2Code == iso2CodeFix\n if let index = countries.firstIndex(where: { $0.iso2Code == iso2CodeFix }) {\n    countries[index].population = newPopulation\n }\n\n print(countries)\n\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ `var` is required to allow mutation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;CountryA&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Category1&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\ud83c\udde6\ud83c\uddfa&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                          <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1000000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1.2<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;AU&quot;<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;CountryB&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Category2&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\ud83c\uddfa\ud83c\uddf8&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                          <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">5000000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">20.5<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;US&quot;<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;CountryC&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Category3&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\ud83c\uddee\ud83c\uddf3&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                          <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">3000000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">3.1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;IN&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2CodeFix = <\/span><span style=\"color: #98C379\">&quot;US&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> newPopulation = <\/span><span style=\"color: #D19A66\">6000000<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Update population for the country with iso2Code == iso2CodeFix<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == iso2CodeFix }) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    countries[index].<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = newPopulation<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(countries)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441 index<\/strong>:\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">firstIndex(where:)<\/mark><\/code> \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">index<\/mark><\/code> \u0441\u0442\u0440\u0430\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">country<\/mark><\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">iso2CodeFix<\/mark><\/code>.<\/span><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b struct<\/strong>:\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct<\/mark><\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Value<\/mark><\/code> \u0422\u0418\u041f\u0430\u043c\u0438, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries[index].<\/mark><\/code><\/span><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/strong>:\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438\u0441\u0432\u043e\u0439\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">newPopulation<\/mark><\/code> \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code>.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">var<\/mark><\/code>, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(1 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"[\n    Country(name: &quot;CountryA&quot;, category: &quot;Category1&quot;, flag: &quot;\ud83c\udde6\ud83c\uddfa&quot;, \n                             population: 1000000, gdp: 1.2, iso2Code: &quot;AU&quot;),\n    Country(name: &quot;CountryB&quot;, category: &quot;Category2&quot;, flag: &quot;\ud83c\uddfa\ud83c\uddf8&quot;,\n                             population: 6000000, gdp: 20.5, iso2Code: &quot;US&quot;),\n    Country(name: &quot;CountryC&quot;, category: &quot;Category3&quot;, flag: &quot;\ud83c\uddee\ud83c\uddf3&quot;, \n                             population: 3000000, gdp: 3.1, iso2Code: &quot;IN&quot;)\n]\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;CountryA&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Category1&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\ud83c\udde6\ud83c\uddfa&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1000000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1.2<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;AU&quot;<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;CountryB&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Category2&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\ud83c\uddfa\ud83c\uddf8&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">6000000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">20.5<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;US&quot;<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;CountryC&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Category3&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;\ud83c\uddee\ud83c\uddf3&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                             <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">3000000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">3.1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;IN&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 var, \u0443\u0431\u0435\u0440\u0435\u043c \u043a\u044d\u0448 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countryDataCache<\/mark><\/code> \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code>:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    var population: Int?\n    var gdp: Double?\n    let iso2Code: String\n}\n\n\/\/. . . . . . . . . .\n\n\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n\/\/.  . . . . . . . . . .\n\nprivate func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { \n         [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                \/\/-------\n                let response = try \n                    JSONDecoder().decode(IndicatorResponse.self, from: data)\n                let indicators = response.data\n                let value = indicators.first?.value\n                DispatchQueue.main.async {\n                  if let index = self?.countries.firstIndex(where: \n                                    { $0.iso2Code == country.iso2Code }) {\n                            self?.countries[index].population = Int(value!)\n                  }\n                }\n                \/\/--------\n            } catch {\n                print(&quot;Population fetch error: \\(error) \\(country.iso2Code)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) { \n           [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                \/\/-------\n                let response = try \n                     JSONDecoder().decode(IndicatorResponse.self, from: data)\n                let indicators = response.data\n                let value = indicators.first?.value\n                    DispatchQueue.main.async {\n                        if let index = self?.countries.firstIndex(where: \n                                    { $0.iso2Code == country.iso2Code }) {\n                            self?.countries[index].gdp = value\n                        }\n                    }\n                \/\/-------\n            } catch {\n                print(&quot;GDP fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n\/\/. . . . . . . . . .\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/. . . . . . . . . .<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/.  . . . . . . . . . .<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                    { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\">[index].<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value!)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/--------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                    { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\">[index].<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = value<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;GDP fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/. . . . . . . . . .<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">A \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f <strong>GCD<\/strong> \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Correct Countries App with Correct World Bank API Models (GCD)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Model<\/strong>s:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\n\/\/ Models\nstruct Country: Identifiable, Hashable {\n    let id = UUID()\n    let name: String\n    let category: String\n    let flag: String\n    var population: Int?\n    var gdp: Double?\n    let iso2Code: String\n}\n\/\/ Exact World Bank API response format\n\/\/----- Root\nstruct WorldBankResponse: Decodable {\n    let metadata: WorldBankMetadata\n    let countries: [WorldBankCountry]\n    \n   init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(WorldBankMetadata.self)\n        countries = try container.decode([WorldBankCountry].self)\n    }\n}\n\/\/------- Meta\nstruct WorldBankMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let perPage: String\n    let total: Int\n    \n    enum CodingKeys: String, CodingKey {\n            case page\n            case pages\n            case perPage = &quot;per_page&quot;\n            case total\n        }\n}\n\/\/------- Country\nstruct WorldBankCountry: Decodable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: AdminRegion\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n    \n    struct Region: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct AdminRegion: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct IncomeLevel: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n    \n    struct LendingType: Decodable {\n        let id: String\n        let iso2code: String\n        let value: String\n    }\n}\n\/\/----- Root\nstruct IndicatorResponse: Decodable {\n    let metadata: IndicatorMetadata\n    let data: [IndicatorData]\n    \n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        metadata = try container.decode(IndicatorMetadata.self)\n        data = try container.decode([IndicatorData].self)\n    }\n}\n\/\/----- Meta\nstruct IndicatorMetadata: Decodable {\n    let page: Int\n    let pages: Int\n    let per_page: Int\n    let total: Int\n}\n\/\/----- Indicator\nstruct IndicatorData: Decodable {\n    let value: Double?\n    let date: String\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Models<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> category: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flag: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Exact World Bank API response format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: WorldBankMetadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries: [WorldBankCountry]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([WorldBankCountry].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/------- Meta<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> perPage: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">page<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">pages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">perPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;per_page&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">total<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/------- Country<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">WorldBankCountry<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: AdminRegion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">AdminRegion<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Root<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorResponse<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata: IndicatorMetadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data: [IndicatorData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorMetadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        data = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([IndicatorData].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Meta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorMetadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/----- Indicator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IndicatorData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Decodable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> date: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>ViewModel:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ View Model\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    \n    func loadCountries() {\n        isLoading = true\n        errorMessage = nil\n        \n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n            errorMessage = &quot;Invalid URL&quot;\n            isLoading = false\n            return\n        }\n        \n        URLSession.shared.dataTask(with: url) { \n         [weak self] data, response, error in\n            DispatchQueue.main.async {\n                if let error = error {\n                    self?.errorMessage = \n                            &quot;Network error: \\(error.localizedDescription)&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                guard let data = data else {\n                    self?.errorMessage = &quot;No data received&quot;\n                    self?.isLoading = false\n                    return\n                }\n                \n                do {\n                    let decoder = JSONDecoder()\n                    let response = \n                      try decoder.decode(WorldBankResponse.self, from: data)\n                    let countries = response.countries\n                        \n                        let filteredCountries = countries\n                            .filter { $0.region.value != &quot;Aggregates&quot; } \n                            .map { countryData in\n                                Country(\n                                    name: countryData.name,\n                                    category: countryData.region.value,\n                                    flag: \n                          self?.flagEmoji(from: countryData.iso2Code) ?? &quot;\ud83c\udff3\ufe0f&quot;,\n                                    population: nil,\n                                    gdp: nil,\n                                    iso2Code: countryData.iso2Code\n                                )\n                            }\n                   \n                        self?.countries = filteredCountries\n                        self?.fetchAdditionalData(for: filteredCountries)\n                } catch {\n                    self?.errorMessage = \n                  &quot;Failed to decode response: \\(error.localizedDescription)&quot;\n                    print(&quot;Decoding error: \\(error)&quot;)\n                }\n                self?.isLoading = false\n            }\n        }.resume()\n    }\n    \n    private func fetchAdditionalData(for countries: [Country]) {\n        for country in countries {\n            fetchPopulation(for: country)\n            fetchGDP(for: country)\n        }\n    }\n    \n    private func fetchPopulation(for country: Country) {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) {\n           [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                \/\/-------\n                let response = try \n                    JSONDecoder().decode(IndicatorResponse.self, from: data)\n              \n                   let indicators = response.data\n                   let value = indicators.first?.value\n                    DispatchQueue.main.async {\n                      if let index = self?.countries.firstIndex(where: \n                                  { $0.iso2Code == country.iso2Code }) {\n                            self?.countries[index].population = Int(value!)\n                        }\n                    }\n                \/\/--------\n            } catch {\n                print(&quot;Population fetch error: \\(error) \\(country.iso2Code)&quot;)\n            }\n        }.resume()\n    }\n    \n    private func fetchGDP(for country: Country) {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else { return }\n        \n        URLSession.shared.dataTask(with: url) {\n          [weak self] data, response, error in\n            guard let data = data else { return }\n            \n            do {\n                \/\/-------\n                let response = try \n                    JSONDecoder().decode(IndicatorResponse.self, from: data)\n                let indicators = response.data\n                let value = indicators.first?.value\n                DispatchQueue.main.async {\n                    if let index = self?.countries.firstIndex(where: \n                                    { $0.iso2Code == country.iso2Code }) {\n                            self?.countries[index].gdp = value\n                        }\n                    }\n                \/\/-------\n            } catch {\n                print(&quot;GDP fetch error: \\(error)&quot;)\n            }\n        }.resume()\n    }\n    \n    \/\/ Rest of the ViewModel implementation remains the same...\n    \n    private func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        var flag = &quot;&quot;\n        for unicode in iso2Code.uppercased().unicodeScalars {\n            if let scalar = UnicodeScalar(base + unicode.value) {\n                flag.append(String(scalar))\n            }\n        }\n        return flag\n    }\n    \n    var categories: [String] {\n        Array(Set(countries.map { $0.category })).sorted()\n    }\n    \n    func countries(in category: String) -&gt; [Country] {\n        countries.filter { $0.category == category }\n    }\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ View Model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) { <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">         [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> error = error {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #98C379\">&quot;Network error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;No data received&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                      <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = response.<\/span><span style=\"color: #E06C75\">countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value != <\/span><span style=\"color: #98C379\">&quot;Aggregates&quot;<\/span><span style=\"color: #ABB2BF\"> } <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { countryData <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                          <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">) ?? <\/span><span style=\"color: #98C379\">&quot;\ud83c\udff3\ufe0f&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = filteredCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: filteredCountries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #98C379\">&quot;Failed to decode response: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Decoding error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">isLoading<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">           [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                  { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\">[index].<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(value!)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/--------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Population fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dataTask<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: url) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">          [<\/span><span style=\"color: #C678DD\">weak<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">] data, response, error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> data = data <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicators = response.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value = indicators.first?.value<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                DispatchQueue.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">?.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\">[index].<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/-------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;GDP fetch error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #61AFEF\">resume<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Rest of the ViewModel implementation remains the same...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> flag = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> unicode <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> scalar = <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + unicode.value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                flag.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(scalar))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> flag<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Views:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Views remain the same as in the previous version\nstruct ContentView: View {\n    @StateObject private var viewModel = CountriesViewModel()\n    \n    var body: some View {\n        NavigationView {\n            Group {\n                if viewModel.isLoading {\n                    ProgressView(&quot;Loading countries...&quot;)\n                } else if let errorMessage = viewModel.errorMessage {\n                    ErrorView(message: errorMessage, retryAction: {\n                        viewModel.loadCountries()\n                    })\n                } else {\n                    CountryListView(viewModel: viewModel)\n                }\n            }\n            .navigationTitle(&quot;World Countries&quot;)\n        }\n        .onAppear {\n            viewModel.loadCountries()\n        }\n    }\n}\n\/\/ Rest of the view code remains the same...\nstruct CountryListView: View {\n    @ObservedObject var viewModel: CountriesViewModel\n    \n    var body: some View {\n        List {\n            ForEach(viewModel.categories, id: \\.self) { category in\n                Section(header: Text(category)) {\n                    ForEach(viewModel.countries(in: category)) { \n                    country in\n                        NavigationLink(destination: \n                           CountryDetailView(country: country)) {\n                               CountryRowView(country: country)\n                        }\n                    }\n                }\n            }\n        }\n        .refreshable {\n            viewModel.loadCountries()\n        }\n    }\n}\nstruct CountryRowView: View {\n    let country: Country\n    \n    var body: some View {\n        HStack {\n            Text(country.flag)\n                .font(.title2)\n            Text(country.name)\n                .font(.body)\n        }\n        .padding(.vertical, 4)\n    }\n}\nstruct CountryDetailView: View {\n    let country: Country\n    \n    var body: some View {\n        ScrollView {\n            VStack(spacing: 20) {\n                Text(country.flag)\n                    .font(.system(size: 100))\n                \n                Text(country.name)\n                    .font(.title)\n                    .fontWeight(.bold)\n                \n                VStack(alignment: .leading, spacing: 15) {\n                    DetailRow(title: &quot;Region&quot;, value: country.category)\n                    \n                    if let population = country.population {\n                        DetailRow(\n                            title: &quot;Population&quot;,\n                            value: formatNumber(population)\n                        )\n                    }\n                    \n                    if let gdp = country.gdp {\n                        DetailRow(\n                            title: &quot;GDP (USD)&quot;,\n                            value: formatCurrency(gdp)\n                        )\n                    }\n                }\n                .padding()\n                \n                Spacer()\n            }\n        }\n        .navigationBarTitleDisplayMode(.inline)\n        .padding()\n    }\n    \n    private func formatNumber(_ number: Int) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .decimal\n        return \n          formatter.string(from: NSNumber(value: number)) ?? String(number)\n    }\n    \n    private func formatCurrency(_ number: Double) -&gt; String {\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .currency\n        formatter.currencyCode = &quot;USD&quot;\n        formatter.maximumFractionDigits = 0\n        return \n          formatter.string(from: NSNumber(value: number)) ?? String(number)\n    }\n}\nstruct DetailRow: View {\n    let title: String\n    let value: String\n    \n    var body: some View {\n        HStack {\n            Text(title)\n                .fontWeight(.medium)\n                .foregroundColor(.gray)\n            Spacer()\n            Text(value)\n                .fontWeight(.medium)\n        }\n    }\n}\nstruct ErrorView: View {\n    let message: String\n    let retryAction: () -&gt; Void\n    \n    var body: some View {\n        VStack(spacing: 16) {\n            Text(&quot;Error&quot;)\n                .font(.title)\n                .foregroundColor(.red)\n            Text(message)\n                .multilineTextAlignment(.center)\n            Button(&quot;Retry&quot;, action: retryAction)\n                .buttonStyle(.bordered)\n        }\n        .padding()\n    }\n}\n#Preview {\n    ContentView()\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Views remain the same as in the previous version<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ContentView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@StateObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel = <\/span><span style=\"color: #61AFEF\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Group<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Loading countries...&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> errorMessage = viewModel.errorMessage {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ErrorView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: errorMessage, <\/span><span style=\"color: #61AFEF\">retryAction<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                        viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">CountryListView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">viewModel<\/span><span style=\"color: #ABB2BF\">: viewModel)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;World Countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onAppear<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Rest of the view code remains the same...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryListView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel: CountriesViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">List<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">categories<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: \\.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { category <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Section<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">header<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(category)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: category)) { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">NavigationLink<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">destination<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                           <\/span><span style=\"color: #61AFEF\">CountryDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #61AFEF\">CountryRowView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">country<\/span><span style=\"color: #ABB2BF\">: country)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">refreshable<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryRowView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> country: Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title2<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">body<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">vertical<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryDetailView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> country: Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">20<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">flag<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">system<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">size<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">100<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bold<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Region&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: country.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = country.population {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Population&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">formatNumber<\/span><span style=\"color: #ABB2BF\">(population)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = country.gdp {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">DetailRow<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;GDP (USD)&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">formatCurrency<\/span><span style=\"color: #ABB2BF\">(gdp)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">navigationBarTitleDisplayMode<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">inline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">decimal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: number)) ?? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(number)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">formatCurrency<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">number<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> formatter = <\/span><span style=\"color: #61AFEF\">NumberFormatter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">numberStyle<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #E06C75\">currency<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">currencyCode<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;USD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        formatter.<\/span><span style=\"color: #E06C75\">maximumFractionDigits<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          formatter.<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">NSNumber<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: number)) ?? <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(number)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">DetailRow<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> title: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(title)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">fontWeight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ErrorView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> message: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> retryAction: () -&gt; <\/span><span style=\"color: #E5C07B\">Void<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(message)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">multilineTextAlignment<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">center<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Retry&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: retryAction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">buttonStyle<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">bordered<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">ContentView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u042d\u0442\u0430 GCD \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"943\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image-1-943x1024.png\" alt=\"\" class=\"wp-image-16377\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image-1-943x1024.png 943w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image-1-276x300.png 276w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image-1-768x834.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/image-1.png 1304w\" sizes=\"auto, (max-width: 943px) 100vw, 943px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">URLSession.shared.dataTask (with: url)<\/mark><\/code>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">main queue <\/mark><\/code>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &nbsp;<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">DispatchQueue.main.async <\/mark><\/code>\u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f UI.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async \/ await<\/mark><\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u044d\u0442\u0443 \u0432\u0435\u0440\u0441\u0438\u044e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>&nbsp;ChatGPT: \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 CountriesViewModel \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e async await<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"695\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30-1024x695.png\" alt=\"\" class=\"wp-image-16379\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30-1024x695.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30-300x204.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30-768x521.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30-442x300.png 442w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2024-12-31-at-16.33.30.png 1464w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async\/await <\/mark><\/code>Swift \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0438 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 CountriesViewModel()<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async<\/mark><\/code>, \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">await<\/mark><\/code> \u043f\u0440\u0438 \u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0435.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"> URLSession <\/mark><\/code>\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">URLSession.shared.data(from:)&nbsp;<\/mark><\/code> \u0438 \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">try await<\/mark><\/code>,&nbsp;<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0412\u044b\u0437\u043e\u0432\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">DispatchQueue.main.async<\/mark><\/code> \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor async <\/mark><\/code>\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async<\/mark><\/code> \u0431\u043b\u043e\u043a\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f UI \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 (<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">main thread<\/mark><\/code>).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">withTaskGroup<\/mark><\/code> \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0438 \u0412\u0412\u041f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d countries.<\/span><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CountriesViewModel with async await<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\n@MainActor\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    \n    \/\/ MARK: - Load Countries\n    func loadCountries() async {\n        isLoading = true\n        errorMessage = nil\n        \n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n            errorMessage = &quot;Invalid URL&quot;\n            isLoading = false\n            return\n        }\n        \n        do {\n            let (data, _) = try await URLSession.shared.data(from: url)\n            let response = \n                try JSONDecoder().decode(WorldBankResponse.self, from: data)\n            let fetchedCountries = response.countries\n            \n            \/\/ Filter and map countries\n            let filteredCountries = fetchedCountries\n                .filter { $0.region.value != &quot;Aggregates&quot; }\n                .map { countryData in\n                    Country(\n                        name: countryData.name,\n                        category: countryData.region.value,\n                        flag: self.flagEmoji(from: countryData.iso2Code),\n                        population: nil,\n                        gdp: nil,\n                        iso2Code: countryData.iso2Code\n                    )\n                }\n            \n            countries = filteredCountries\n             isLoading = false\n            \n            \/\/ Fetch additional data concurrently\n            await fetchAdditionalData(for: filteredCountries)\n        } catch {\n            errorMessage = \n                  &quot;Failed to load countries: \\(error.localizedDescription)&quot;\n            print(&quot;Error: \\(error)&quot;)\n        }\n        \n        isLoading = false\n    }\n    \n    \/\/ MARK: - Fetch Additional Data\n    private func fetchAdditionalData(for countries: [Country]) async {\n        await withTaskGroup(of: Void.self) { group in\n            for country in countries {\n                group.addTask { await self.fetchPopulation(for: country) }\n                group.addTask { await self.fetchGDP(for: country) }\n            }\n        }\n    }\n    \n    \/\/ MARK: - Fetch Population\n    private func fetchPopulation(for country: Country) async {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        guard let url = URL(string: urlString) else { return }\n        \n        do {\n            let (data, _) = try await URLSession.shared.data(from: url)\n            let response = \n                try JSONDecoder().decode(IndicatorResponse.self, from: data)\n            let population = response.data.first?.value.flatMap { Int($0) }\n            \n            \/\/ Update population in the main thread\n            if let index = countries.firstIndex(\n                                where:{ $0.iso2Code == country.iso2Code }) {\n                countries[index].population = population\n            }\n        } catch {\n            print(\n            &quot;Failed to fetch population for \\(country.iso2Code): \\(error)&quot;)\n        }\n    }\n    \n    \/\/ MARK: - Fetch GDP\n    private func fetchGDP(for country: Country) async {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(country.iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        guard let url = URL(string: urlString) else { return }\n        \n        do {\n            let (data, _) = try await URLSession.shared.data(from: url)\n            let response = \n                try JSONDecoder().decode(IndicatorResponse.self, from: data)\n            let gdp = response.data.first?.value\n            \n            \/\/ Update GDP in the main thread\n            if let index = countries.firstIndex(\n                         where:{ $0.iso2Code == country.iso2Code }) {\n                countries[index].gdp = gdp\n            }\n        } catch {\n            print(&quot;Failed to fetch GDP for \\(country.iso2Code): \\(error)&quot;)\n        }\n    }    \n\n    \/\/ MARK: - Flag Emoji\n    private func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        return iso2Code.uppercased().unicodeScalars.compactMap {\n            UnicodeScalar(base + $0.value).map(String.init)\n        }.joined()\n    }\n    \n    \/\/ MARK: - Categories\n    var categories: [String] {\n        Array(Set(countries.map { $0.category })).sorted()\n    }\n    \n    func countries(in category: String) -&gt; [Country] {\n        countries.filter { $0.category == category }\n    }\n}\n\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">@MainActor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Load Countries<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> fetchedCountries = response.<\/span><span style=\"color: #E06C75\">countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Filter and map countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = fetchedCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value != <\/span><span style=\"color: #98C379\">&quot;Aggregates&quot;<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { countryData <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            countries = filteredCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">             isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Fetch additional data concurrently<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: filteredCountries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                  <\/span><span style=\"color: #98C379\">&quot;Failed to load countries: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Fetch Additional Data<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">withTaskGroup<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Void<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { group <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                group.<\/span><span style=\"color: #61AFEF\">addTask<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country) }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                group.<\/span><span style=\"color: #61AFEF\">addTask<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: country) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Fetch Population<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population = response.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">.first?.value.<\/span><span style=\"color: #56B6C2\">flatMap<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Update population in the main thread<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">:{ <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                countries[index].<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #98C379\">&quot;Failed to fetch population for <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Fetch GDP<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp = response.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Update GDP in the main thread<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = countries.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">:{ <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                countries[index].<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Failed to fetch GDP for <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }    <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Flag Emoji<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars.<\/span><span style=\"color: #61AFEF\">compactMap<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.value).<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }.<\/span><span style=\"color: #56B6C2\">joined<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Categories<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countries.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        countries.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 ContentView<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">.onAppear <\/mark><\/code>\u0437\u0430\u043c\u0435\u043d\u0435\u043d \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">.task {} <\/mark><\/code>\u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 async \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 SwiftUI, \u0447\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code> \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u044b <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code> \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">View<\/mark><\/code>.<\/span><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>ContentView with async await<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\nstruct ContentView: View {\n    @StateObject private var viewModel = CountriesViewModel()\n    \n    var body: some View {\n        NavigationView {\n            Group {\n                if viewModel.isLoading {\n                    ProgressView(&quot;Loading countries...&quot;)\n                } else if let errorMessage = viewModel.errorMessage {\n                    ErrorView(message: errorMessage, retryAction: {\n                        viewModel.loadCountries()\n                    })\n                } else {\n                    CountryListView(viewModel: viewModel)\n                }\n            }\n            .navigationTitle(&quot;World Countries&quot;)\n        }\n        .task {\n            await viewModel.loadCountries()\n        }\n    }\n}\n\/\/ Rest of the view code remains the same...\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ContentView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@StateObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel = <\/span><span style=\"color: #61AFEF\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Group<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Loading countries...&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> errorMessage = viewModel.errorMessage {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">ErrorView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: errorMessage, <\/span><span style=\"color: #61AFEF\">retryAction<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    })<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">CountryListView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">viewModel<\/span><span style=\"color: #ABB2BF\">: viewModel)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;World Countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Rest of the view code remains the same...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>:\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Async\/await<\/mark><\/code> \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u0445 \u0438 \u044f\u0432\u043d\u043e\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/span><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c<\/strong>:\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0427\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">population<\/mark><\/code> \u0438 \u0412\u0412\u041f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">gdp<\/mark><\/code> \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e (\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e) \u0441 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/span><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Type Safety<\/strong>:\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async\/await&nbsp;<\/mark><\/code> \u0438&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">try<\/mark><\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0427\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 <\/strong><strong>@MainActor?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">@MainActor <\/mark><\/code>\u043a\u043b\u0430\u0441\u0441\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">class&nbsp; CountriesViewModel: ObservableObject <\/mark><\/code>\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443: \u043a\u043e \u0432\u0441\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"@MainActor\nclass CountriesViewModel: ObservableObject {\n    @Published var countries: [Country] = []\n    @Published var isLoading = false\n    @Published var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    \n    \/\/ MARK: - Load Countries\n    func loadCountries() async {. . .}\n               \n    \/\/ MARK: - Fetch Additional Data\n    private func fetchAdditionalData(for countries: [Country]) async {. . .}       \n    \n    \/\/ MARK: - Fetch Population\n    private func fetchPopulation(for country: Country) async {. . .}    \n    \n    \/\/ MARK: - Fetch GDP\n    private func fetchGDP(for country: Country) async {. . .}\n     \n    \/\/ MARK: - Flag Emoji\n    private func flagEmoji(from iso2Code: String) -&gt; String { . . .} \n    \n    \/\/ MARK: - Categories\n    var categories: [String] {. . .}           \n    func countries(in category: String) -&gt; [Country] {. . . }\n }\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">@MainActor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Load Countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Fetch Additional Data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchAdditionalData<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {. . .}       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Fetch Population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {. . .}    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Fetch GDP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">country<\/span><span style=\"color: #ABB2BF\">: Country) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Flag Emoji<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> { . . .} <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Categories<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {. . .}           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {. . . }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 <span style=\"font-weight: 400;\"> (<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">main thread<\/mark><\/code>)<\/span>. \u0418 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442.<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\" func loadCountries() async {\n  \/\/.  .  .  .  . \n \n \/\/ MainActor here\n let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n            errorMessage = &quot;Invalid URL&quot;\n            isLoading = false\n            return\n        }\n    \n\/\/ this call might switch to something else, that's up to URLSession\n    let (data, _) = try await URLSession.shared.data(from: url)\n   \n  \/\/ back on the MainActor now\n\n    let response = \n           try JSONDecoder().decode(WorldBankResponse.self, from: data)\n    let fetchedCountries = response.countries\n\n   \/\/.  .  .  .  .   \" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/.  .  .  .  . <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MainActor here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ this call might switch to something else, that&#39;s up to URLSession<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ back on the MainActor now<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> fetchedCountries = response.<\/span><span style=\"color: #E06C75\">countries<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/.  .  .  .  .   <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0438\u0434\u0438\u0442\u0435 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <strong>await<\/strong>?&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e <strong>\u0432\u0430\u0436\u043d\u043e<\/strong>. \u041f\u0440\u044f\u043c\u043e \u0437\u0434\u0435\u0441\u044c \u043e\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">URLSession.data(for:)<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">isolation<\/mark><\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code> \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u0442\u0432\u0435\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">response<\/mark><\/code> \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 <span style=\"font-weight: 400;\">\u0441\u043d\u043e\u0432\u0430 <\/span>\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>nonisolated<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code> \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">background<\/mark><\/code>. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0437\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f f<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">unc load\u0421ountries<\/mark><\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code>. \u041d\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0447\u0435\u0433\u043e-\u0442\u043e, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">nonisolated<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">nonisolated<\/mark><\/code>, \u0442\u0430\u043a \u044d\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0432\u044b\u0432\u043e\u0434 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 (inference) \u0434\u043b\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">actor<\/mark><\/code> \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">isolation<\/mark><\/code>. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">isolation<\/mark><\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code>, \u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a (<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">background<\/mark><\/code>).&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Claude 3.5 Sonnet Swift 6 strict concurrency<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u0441\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">fetch<\/mark><\/code> \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0445 &nbsp;<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">nonisolated<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"217\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1-1024x217.png\" alt=\"\" class=\"wp-image-16385\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1-1024x217.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1-300x64.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1-768x163.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1-500x106.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.22-1.png 1056w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.57.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1014\" height=\"210\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.57.png\" alt=\"\" class=\"wp-image-16386\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.57.png 1014w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.57-300x62.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.57-768x159.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.07.57-500x104.png 500w\" sizes=\"auto, (max-width: 1014px) 100vw, 1014px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f Swift 6 concurrency:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">ObservableObject<\/mark><\/code> \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">@Observable<\/mark><\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">fetchCountries() <\/mark><\/code>\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">private<\/mark><\/code> \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">loadCountries()<\/mark><\/code> \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0438 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0430&nbsp; \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">isLoading<\/mark><\/code> \u0438 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">errorMessage<\/mark><\/code><\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">nonisolated<\/mark><\/code> , \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">actor-isolated<\/mark><\/code> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e.<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041a\u043e \u0432\u0441\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">nonisolated<\/mark><\/code>, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u0435 \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c UI.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">fetchCountryDetails<\/mark><\/code> \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">updateCountries<\/mark><\/code> \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code><\/span><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CountriesViewModel c Swift 6 Concurrency<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\n\n@MainActor\n@Observable\nclass CountriesViewModel {\n    var countriesApp: [Country] = []\n    var isLoading = false\n    var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    \n    private struct CountryDetail {\n           let iso2Code: String\n           let population: Int?\n           let gdp: Double?\n    }\n    \n    \/\/ Main load function marked as async\n   func loadCountries() async {\n        isLoading = true\n        errorMessage = nil\n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n                errorMessage = &quot;Invalid URL&quot;\n                isLoading = false\n                return\n        }\n       \n       let filteredCountries = await fetchCountries(url: url)\n       \/\/ Update UI on main actor\n       if let countries = filteredCountries {\n           self.countriesApp = countries\n           isLoading = false\n           \n           \/\/ Fetch and update with details\n            let details = await fetchCountryDetails(for: countries)\n            updateCountries(with: details)\n       } else {\n           print(&quot;Error: Failed to load countries&quot;)\n           errorMessage = &quot;Failed to load countries&quot;\n           isLoading = false\n       }\n    }\n    \n    \/\/ Helper method for fetching countries\n    private nonisolated func fetchCountries(url: URL) async -&gt;  [Country]? {\n        do {\n            \/\/ Use structured concurrency with async\/await\n            let (data, _) = try await URLSession.shared.data(from: url)\n            \n            let decoder = JSONDecoder()\n            let response = \n                   try decoder.decode(WorldBankResponse.self, from: data)\n            \n            let filteredCountries = response.countries\n                .filter { $0.region.value != &quot;Aggregates&quot; }\n                .map { countryData in\n                    Country(\n                        name: countryData.name,\n                        category: countryData.region.value,\n                        flag: flagEmoji(from: countryData.iso2Code),\n                        population: nil,\n                        gdp: nil,\n                        iso2Code: countryData.iso2Code\n                    )\n                }\n            return filteredCountries\n        } catch {\n            print(&quot;Error: \\(error.localizedDescription)&quot;)\n            return nil\n        }\n    }\n    \n    \/\/ Helper method for fetching additional data\n    \/\/ Now returns collected data instead of updating state directly\n    private nonisolated func fetchCountryDetails(for countries: [Country]) async -&gt; [CountryDetail] {\n           await withTaskGroup(of: CountryDetail?.self) { group in\n               for country in countries {\n                   let iso2Code = country.iso2Code\n                    group.addTask {\n                       let (population, gdp ) = \n                       await (self.fetchPopulation(for: iso2Code), \n                               self.fetchGDP(for: iso2Code))\n                       return CountryDetail(\n                               iso2Code: iso2Code,\n                               population: population,\n                               gdp: gdp\n                              )\n                   }\n               }\n               \n               \/\/ Collect results\n               var details: [CountryDetail] = []\n               for await detail in group {\n                   if let detail = detail {\n                       details.append(detail)\n                   }\n               }\n               return details\n           }\n       }\n \n       private func updateCountries(with details: [CountryDetail]) {\n           for detail in details {\n               if let index = countriesApp.firstIndex(\n                          where: { $0.iso2Code == detail.iso2Code }) {\n                   countriesApp[index].population = detail.population\n                   countriesApp[index].gdp = detail.gdp\n               }\n           }\n       }\n   \n    \/\/ Updated to return population as an optional integer\n    private nonisolated func fetchPopulation(for  iso2Code: String) async -&gt; Int? {\n        let indicator = &quot;SP.POP.TOTL&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2023&quot;\n       \n        guard let url = URL(string: urlString) else {\n            print(&quot;Invalid URL for population data&quot;)\n            return  nil\n        }\n        \n        do {\n            let (data, _) = try await URLSession.shared.data(from: url)\n            let response = \n                try JSONDecoder().decode(IndicatorResponse.self, from: data)\n           let fetchPopulation = response.data.first?.value.flatMap { Int($0) }\n           return fetchPopulation\n        } catch {\n            print(&quot;Failed to fetch population for \\(iso2Code): \\(error)&quot;)\n            return nil\n        }\n    }\n    \n    \/\/ Updated to return GDP as an optional double\n    private nonisolated func fetchGDP(for  iso2Code: String) async -&gt; Double? {\n        let indicator = &quot;NY.GDP.MKTP.CD&quot;\n        let urlString = &quot;\\(baseURL)\/country\/\\(iso2Code)\/indicator\/\\(indicator)?format=json&amp;per_page=1&amp;date=2022&quot;\n        \n        guard let url = URL(string: urlString) else {\n            print(&quot;Invalid URL for GDP data&quot;)\n            return nil\n        }\n        \n        do {\n            let (data, _) = try await URLSession.shared.data(from: url)\n            let response = \n               try JSONDecoder().decode(IndicatorResponse.self, from: data)\n            \n         \/\/   return response.data.first?.value\n            let fetchedGDP = response.data.first?.value\n            return fetchedGDP\n        } catch {\n            print(&quot;Failed to fetch GDP for \\(iso2Code): \\(error)&quot;)\n            return nil\n        }\n    }\n    \n    private nonisolated func flagEmoji(from iso2Code: String) -&gt; String {\n        let base: UInt32 = 127397\n        var flag = &quot;&quot;\n        for scalar in iso2Code.uppercased().unicodeScalars {\n            if let flagScalar = UnicodeScalar(base + scalar.value) {\n                flag.append(String(flagScalar))\n            }\n        }\n        return flag.isEmpty ? &quot;\ud83c\udff3\ufe0f&quot; : flag\n    }\n    \n    var categories: [String] {\n        Array(Set(countriesApp.map { $0.category })).sorted()\n     }\n     \n     func countries(in category: String) -&gt; [Country] {\n         countriesApp.filter { $0.category == category }\n     }\n}\n\n\/\/ Views and NModels are the same\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">@MainActor<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">@Observable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countriesApp: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryDetail<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Main load function marked as async<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Update UI on main actor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = filteredCountries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">countriesApp<\/span><span style=\"color: #ABB2BF\"> = countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Fetch and update with details<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> details = <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountryDetails<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: countries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">updateCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: details)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error: Failed to load countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           errorMessage = <\/span><span style=\"color: #98C379\">&quot;Failed to load countries&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper method for fetching countries<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">url<\/span><span style=\"color: #ABB2BF\">: URL) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt;  [Country]? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use structured concurrency with async\/await<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(WorldBankResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = response.<\/span><span style=\"color: #E06C75\">countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value != <\/span><span style=\"color: #98C379\">&quot;Aggregates&quot;<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { countryData <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Country<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">category<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">flag<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: countryData.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> filteredCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper method for fetching additional data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Now returns collected data instead of updating state directly<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountryDetails<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt; [CountryDetail] {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">withTaskGroup<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: CountryDetail?.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) { group <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> country <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> countries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code = country.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    group.<\/span><span style=\"color: #61AFEF\">addTask<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                       <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (population, gdp ) = <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                       <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: iso2Code), <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: iso2Code))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                       <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">CountryDetail<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #61AFEF\">iso2Code<\/span><span style=\"color: #ABB2BF\">: iso2Code,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #61AFEF\">population<\/span><span style=\"color: #ABB2BF\">: population,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #61AFEF\">gdp<\/span><span style=\"color: #ABB2BF\">: gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                              )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Collect results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> details: [CountryDetail] = []<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> detail <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> group {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> detail = detail {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                       details.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(detail)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> details<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">details<\/span><span style=\"color: #ABB2BF\">: [CountryDetail]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> detail <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> details {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> index = countriesApp.<\/span><span style=\"color: #61AFEF\">firstIndex<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                          <\/span><span style=\"color: #61AFEF\">where<\/span><span style=\"color: #ABB2BF\">: { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> == detail.<\/span><span style=\"color: #E06C75\">iso2Code<\/span><span style=\"color: #ABB2BF\"> }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   countriesApp[index].<\/span><span style=\"color: #E06C75\">population<\/span><span style=\"color: #ABB2BF\"> = detail.<\/span><span style=\"color: #E06C75\">population<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   countriesApp[index].<\/span><span style=\"color: #E06C75\">gdp<\/span><span style=\"color: #ABB2BF\"> = detail.<\/span><span style=\"color: #E06C75\">gdp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Updated to return population as an optional integer<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt; <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;SP.POP.TOTL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2023&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Invalid URL for population data&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> fetchPopulation = response.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">.first?.value.<\/span><span style=\"color: #56B6C2\">flatMap<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> fetchPopulation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Failed to fetch population for <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Updated to return GDP as an optional double<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt; <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> indicator = <\/span><span style=\"color: #98C379\">&quot;NY.GDP.MKTP.CD&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/indicator\/<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">indicator<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">?format=json&amp;per_page=1&amp;date=2022&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Invalid URL for GDP data&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(IndicatorResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/   return response.data.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> fetchedGDP = response.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">.first?.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> fetchedGDP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Failed to fetch GDP for <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">iso2Code<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> base: <\/span><span style=\"color: #E5C07B\">UInt32<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">127397<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> flag = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> scalar <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> iso2Code.<\/span><span style=\"color: #56B6C2\">uppercased<\/span><span style=\"color: #ABB2BF\">().unicodeScalars {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> flagScalar = <\/span><span style=\"color: #E5C07B\">UnicodeScalar<\/span><span style=\"color: #ABB2BF\">(base + scalar.value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                flag.<\/span><span style=\"color: #56B6C2\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">(flagScalar))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> flag.isEmpty ? <\/span><span style=\"color: #98C379\">&quot;\ud83c\udff3\ufe0f&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> flag<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countriesApp.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         countriesApp.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Views and NModels are the same<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0432 Swift 6:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfNZT2igYGkyLqOM1sDaFWit5HWcI1kaaig1hToUsDOpWXa4egIvaqxvXKGrn_5Jss1r2Ijyiw8RCMCDU1ckSRG9Hvn95VMMUOj01CNrUxoPESagqUa9GFwzD_VfHyUPSRJr4md?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">A \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e&nbsp; \u0440\u0435\u0436\u0438\u043c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 (Swift Concurrency Checking) \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a <code>Complete<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c <code>strict concurrency<\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcvEOh0xHXpBpdu75kCpDB7tloXXJOzz4Sm_lHofkbt2BqjOkGfIef5aZG3Ni4r8RVxkmqK1QBb5H12V5eIGorvtaiFwjFpQmIozwrXmvlQyIbghNmjD_b9kSQA82oNBt23E0cuhA?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043b\u0430\u0441\u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">class CountriesViewModel <\/mark><\/code>\u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\n@MainActor\n@Observable\nclass CountriesViewModel {\n    var countriesApp: [Country] = []\n    var isLoading = false\n    var errorMessage: String?\n    \n    private let baseURL = &quot;https:\/\/api.worldbank.org\/v2&quot;\n    \n    private struct CountryDetail {\n           let iso2Code: String\n           let population: Int?\n           let gdp: Double?\n    }\n    \n    \/\/ Main load function marked as async\n   func loadCountries() async {\n        isLoading = true\n        errorMessage = nil\n        let urlString = &quot;\\(baseURL)\/country?format=json&amp;per_page=300&quot;\n        guard let url = URL(string: urlString) else {\n                errorMessage = &quot;Invalid URL&quot;\n                isLoading = false\n                return\n        }\n       \n       let filteredCountries = await fetchCountries(url: url)\n       \/\/ Update UI on main actor\n       if let countries = filteredCountries {\n           countriesApp = countries\n           isLoading = false\n           \n           \/\/ Fetch and update with details\n            let details = await fetchCountryDetails(for: countries)\n            updateCountries(with: details)\n       } else {\n           print(&quot;Error: Failed to load countries&quot;)\n           errorMessage = &quot;Failed to load countries&quot;\n           isLoading = false\n       }\n    }\n    \n    \/\/ Helper method for fetching countries\n    private nonisolated func fetchCountries(url: URL) async -&gt;  [Country]? {. . .}\n           \n    \/\/ Helper method for fetching additional data\n    \/\/ Now returns collected data instead of updating state directly\n    private nonisolated func fetchCountryDetails(for countries: [Country]) async -&gt;  \n                                                             [CountryDetail] {. . .}\n        \n    \/\/ Updated to return population as an optional integer\n    private nonisolated func fetchPopulation(for  iso2Code: String) async -&gt; Int? {. . .}\n        \n    \/\/ Updated to return GDP as an optional double\n    private nonisolated func fetchGDP(for  iso2Code: String) async -&gt; Double? {. . .}\n       \n    private nonisolated func flagEmoji(from iso2Code: String) -&gt; String {. . .}\n\n    private func updateCountries(with details: [CountryDetail]) {. . .}\n\n    var categories: [String] {\n        Array(Set(countriesApp.map { $0.category })).sorted()\n     }\n     \n     func countries(in category: String) -&gt; [Country] {\n         countriesApp.filter { $0.category == category }\n     }\n}\n\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">@MainActor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">@Observable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountriesViewModel<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countriesApp: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> baseURL = <\/span><span style=\"color: #98C379\">&quot;https:\/\/api.worldbank.org\/v2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryDetail<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> population: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> gdp: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Main load function marked as async<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">loadCountries<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> urlString = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">baseURL<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">\/country?format=json&amp;per_page=300&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: urlString) <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                errorMessage = <\/span><span style=\"color: #98C379\">&quot;Invalid URL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> filteredCountries = <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Update UI on main actor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = filteredCountries {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           countriesApp = countries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Fetch and update with details<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> details = <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountryDetails<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: countries)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">updateCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: details)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error: Failed to load countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           errorMessage = <\/span><span style=\"color: #98C379\">&quot;Failed to load countries&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper method for fetching countries<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">url<\/span><span style=\"color: #ABB2BF\">: URL) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt;  [Country]? {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper method for fetching additional data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Now returns collected data instead of updating state directly<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchCountryDetails<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">countries<\/span><span style=\"color: #ABB2BF\">: [Country]) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                             [CountryDetail] {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Updated to return population as an optional integer<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPopulation<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt; <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">? {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Updated to return GDP as an optional double<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchGDP<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> -&gt; <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">? {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">nonisolated<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">flagEmoji<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">iso2Code<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> {. . .}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">updateCountries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">details<\/span><span style=\"color: #ABB2BF\">: [CountryDetail]) {. . .}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> categories: [<\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">Array<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">Set<\/span><span style=\"color: #ABB2BF\">(countriesApp.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> })).<\/span><span style=\"color: #56B6C2\">sorted<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">category<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) -&gt; [Country] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         countriesApp.<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">category<\/span><span style=\"color: #ABB2BF\"> == category }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">@MainActor @Observable class <\/mark><\/code>c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">private nonisolated <\/mark><\/code>\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u043d\u0430 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 (<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">background<\/mark><\/code>). \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u0430\u043a \u0438 UI, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">MainActor<\/mark><\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 l<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">oadCountries() <\/mark><\/code>\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">updateCountries<\/mark><\/code>. \u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u201c\u0433\u043e\u043d\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u201d (data races) \u0432 Swift 6.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">CountryClaude &#8212; <a href=\"https:\/\/github.com\/BestKora\/CountriesClaude\" title=\"\">GCD <\/a><br>CountryClaudeAsync &#8212; <a href=\"https:\/\/github.com\/BestKora\/CountriesClaudeAsync\" title=\"\">async await <\/a><br>CountryClaudeSwift6Concurrency &#8212; <a href=\"https:\/\/github.com\/BestKora\/CountriesClaudeSwift6StrictConcurrency\" title=\"\">Swift 6 strict concurrency (no data race).<\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcDlWuWtVMblWHZFfQHSqid4HFiB1Aaytyk8ecPwZVS7KLDGmcPx5HFYzABQe1lumR3ylh7eYy5kuoV-sLdLkxmSR6k69Avkl6GQFY-J3bKfy-VCAehHfJwpfPiXa5lRNw5R14B?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Claude 3.5 Sonnet <\/strong>\u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u041c\u043e\u0434\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CountriesViewModel<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u041c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Views<\/mark><\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041c\u044b \u043d\u0435 \u0437\u0430\u0434\u0430\u043b\u0438 \u043d\u0435 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u044b \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430, \u043d\u0438 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0435\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0411\u0430\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438. \u0418 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u201c\u0443\u0433\u043e\u0432\u043e\u0440\u044b\u201d&nbsp;<strong> Claude 3.5 Sonnet<\/strong>, a \u0442\u0430\u043a\u0436\u0435 <strong>Gemini 1.5 Flash <\/strong>\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0430\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u043e\u043b\u044c\u043a\u043e <strong>ChatGPT 4.o1-mini <\/strong>\u0438 <span style=\"font-weight: 400;\">&nbsp;<strong>Gemini 2.0 Flash<\/strong><\/span><\/span> <span style=\"font-weight: 400;\">\u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441 \u044d\u0442\u043e\u0439 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043b\u0435\u0433\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0435\u0451 \u043e\u0442\u0432\u0435\u0442 \u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 <strong>Claude 3.5 Sonnet<\/strong>. \u041d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <strong>ChatGPT 4.o1-Preview<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0434\u0430\u043b \u0432\u043e\u043e\u0431\u0449\u0435 \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0440\u044f\u0434 \u043b\u0438 <span style=\"font-weight: 400;\">\u043f\u043e\u043b\u0443\u0447\u0438\u043b <\/span>\u0431\u044b \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u0443\u043f\u0435\u0440 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043d \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 <strong>ChatGPT 4.o1-mini<\/strong>, \u043d\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 2 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438:&nbsp; <strong>Claude 3.5 Sonnet<\/strong>, &nbsp;<strong>Gemini 2.0 Flash<\/strong>, <strong>ChatGPT 4.o1-mini,<\/strong> <strong>ChatGPT 4.o1-Preview <\/strong>\u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0441 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CGD<\/mark><\/code> \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">async await <\/mark><\/code>\u0438 \u0434\u0430\u043b\u0435\u0435 \u043d\u0430 <strong>Swift 6 <\/strong><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">strict concurrency<\/mark><\/code>.&nbsp;&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 1. &nbsp;Gemini 2.0 Flash decode JSON \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d Country<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"955\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39-1024x955.png\" alt=\"\" class=\"wp-image-16387\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39-1024x955.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39-300x280.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39-768x717.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39-322x300.png 322w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-01-at-17.41.39.png 1134w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\nstruct Pagination: Codable {\n    let page: Int\n    let pages: Int\n    let per_page: String\n    let total: Int\n}\n\nstruct Region: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct IncomeLevel: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct LendingType: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct Country: Codable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: Region \/\/ Even if values are empty strings, it's still a Region\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n}\n\n\/\/ Example usage (decoding the JSON):\nlet jsonString = &quot;&quot;&quot;\n[{&quot;page&quot;:1,&quot;pages&quot;:1,&quot;per_page&quot;:&quot;300&quot;,&quot;total&quot;:296},[{&quot;id&quot;:&quot;ABW&quot;,&quot;iso2Code&quot;:&quot;AW&quot;,&quot;name&quot;:&quot;Aruba&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;LCN&quot;,&quot;iso2code&quot;:&quot;ZJ&quot;,&quot;value&quot;:&quot;Latin America &amp; Caribbean &quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;HIC&quot;,&quot;iso2code&quot;:&quot;XD&quot;,&quot;value&quot;:&quot;High income&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;LNX&quot;,&quot;iso2code&quot;:&quot;XX&quot;,&quot;value&quot;:&quot;Not classified&quot;},&quot;capitalCity&quot;:&quot;Oranjestad&quot;,&quot;longitude&quot;:&quot;-70.0167&quot;,&quot;latitude&quot;:&quot;12.5167&quot;},{&quot;id&quot;:&quot;AFE&quot;,&quot;iso2Code&quot;:&quot;ZH&quot;,&quot;name&quot;:&quot;Africa Eastern and Southern&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;capitalCity&quot;:&quot;&quot;,&quot;longitude&quot;:&quot;&quot;,&quot;latitude&quot;:&quot;&quot;}]]\n&quot;&quot;&quot;\n\nlet jsonData = jsonString.data(using: .utf8)!\n\ndo {\n    let decoder = JSONDecoder()\n    \/\/ Decode the pagination data\n    let pagination = try decoder.decode(Pagination.self, from: jsonData)\n    print(&quot;Pagination: \\(pagination)&quot;)\n    \n    \/\/ Decode the country data (it's in an array within the main array)\n    let outerArray = try JSONSerialization.jsonObject(with: jsonData, \n                                                      options: []) as! [Any]\n    let countryArrayData = try JSONSerialization.data(withJSONObject: \n                                                              outerArray[1])\n    let countries = try decoder.decode([Country].self, from: countryArrayData)\n\n    print(&quot;Countries: \\(countries)&quot;)\n\n} catch {\n    print(&quot;Error decoding JSON: \\(error)&quot;)\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Pagination<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: Region <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Even if values are empty strings, it&#39;s still a Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Example usage (decoding the JSON):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonString = <\/span><span style=\"color: #98C379\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">[{&quot;page&quot;:1,&quot;pages&quot;:1,&quot;per_page&quot;:&quot;300&quot;,&quot;total&quot;:296},[{&quot;id&quot;:&quot;ABW&quot;,&quot;iso2Code&quot;:&quot;AW&quot;,&quot;name&quot;:&quot;Aruba&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;LCN&quot;,&quot;iso2code&quot;:&quot;ZJ&quot;,&quot;value&quot;:&quot;Latin America &amp; Caribbean &quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;HIC&quot;,&quot;iso2code&quot;:&quot;XD&quot;,&quot;value&quot;:&quot;High income&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;LNX&quot;,&quot;iso2code&quot;:&quot;XX&quot;,&quot;value&quot;:&quot;Not classified&quot;},&quot;capitalCity&quot;:&quot;Oranjestad&quot;,&quot;longitude&quot;:&quot;-70.0167&quot;,&quot;latitude&quot;:&quot;12.5167&quot;},{&quot;id&quot;:&quot;AFE&quot;,&quot;iso2Code&quot;:&quot;ZH&quot;,&quot;name&quot;:&quot;Africa Eastern and Southern&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;capitalCity&quot;:&quot;&quot;,&quot;longitude&quot;:&quot;&quot;,&quot;latitude&quot;:&quot;&quot;}]]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = jsonString.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">using<\/span><span style=\"color: #ABB2BF\">: .utf8)!<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Decode the pagination data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pagination = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(Pagination.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Pagination: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">pagination<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Decode the country data (it&#39;s in an array within the main array)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> outerArray = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> JSONSerialization.<\/span><span style=\"color: #61AFEF\">jsonObject<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: jsonData, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                      <\/span><span style=\"color: #61AFEF\">options<\/span><span style=\"color: #ABB2BF\">: []) as! [Any]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countryArrayData = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> JSONSerialization.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">withJSONObject<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                              outerArray[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Country].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: countryArrayData)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Countries: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">countries<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">} <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error decoding JSON: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 Codable:<\/strong> <span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Codable<\/mark><\/code>, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/span><\/li>\n\n\n\n<li><strong>\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/strong> <span style=\"font-weight: 400;\">\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b JSON&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Region<\/mark><\/code>, <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">IncomeLevel<\/mark><\/code> \u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LendingType<\/mark><\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">do-catch<\/mark><\/code> \u0434\u043b\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON.<\/span><\/li>\n\n\n\n<li><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/strong> <span style=\"font-weight: 400;\">\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Swift, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430..<\/span><\/li>\n\n\n\n<li><strong>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430:<\/strong> <span style=\"font-weight: 400;\">\u041a\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 JSON, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">JSONSerialization<\/mark><\/code> \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 (<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">pagination<\/mark><\/code> \u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries<\/mark><\/code>) \u043f\u0435\u0440\u0435\u0434 \u0438\u0445 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443: &#171;&#187;Expected to decode Dictionary&lt;String, Any&gt; but found an array instead&#187;. <br>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u043c \u043e\u0431 \u044d\u0442\u043e\u043c Gemini 2.0 Flash:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"109\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18-1024x109.png\" alt=\"\" class=\"wp-image-16397\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18-1024x109.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18-300x32.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18-768x82.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18-500x53.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/12\/Screenshot-2025-01-03-at-17.28.18.png 1404w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"mport Foundation\n\nstruct Pagination: Codable {\n    let page: Int\n    let pages: Int\n    let per_page: String\n    let total: Int\n}\n\nstruct Region: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct IncomeLevel: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct LendingType: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\n}\n\nstruct Country: Codable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: Region\n    let incomeLevel: IncomeLevel\n    let lendingType: LendingType\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n}\n\nstruct Response: Codable {\n    let pagination: Pagination\n    let countries: [Country]\n\n    init(from decoder: Decoder) throws {\n        var container = try decoder.unkeyedContainer()\n        self.pagination = try container.decode(Pagination.self)\n        self.countries = try container.decode([Country].self)\n    }\n}\n\nlet jsonString = &quot;&quot;&quot;\n[{&quot;page&quot;:1,&quot;pages&quot;:1,&quot;per_page&quot;:&quot;300&quot;,&quot;total&quot;:296},[{&quot;id&quot;:&quot;ABW&quot;,&quot;iso2Code&quot;:&quot;AW&quot;,&quot;name&quot;:&quot;Aruba&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;LCN&quot;,&quot;iso2code&quot;:&quot;ZJ&quot;,&quot;value&quot;:&quot;Latin America &amp; Caribbean &quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;HIC&quot;,&quot;iso2code&quot;:&quot;XD&quot;,&quot;value&quot;:&quot;High income&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;LNX&quot;,&quot;iso2code&quot;:&quot;XX&quot;,&quot;value&quot;:&quot;Not classified&quot;},&quot;capitalCity&quot;:&quot;Oranjestad&quot;,&quot;longitude&quot;:&quot;-70.0167&quot;,&quot;latitude&quot;:&quot;12.5167&quot;},{&quot;id&quot;:&quot;AFE&quot;,&quot;iso2Code&quot;:&quot;ZH&quot;,&quot;name&quot;:&quot;Africa Eastern and Southern&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;capitalCity&quot;:&quot;&quot;,&quot;longitude&quot;:&quot;&quot;,&quot;latitude&quot;:&quot;&quot;}]]\n&quot;&quot;&quot;\n\nlet jsonData = jsonString.data(using: .utf8)!\n\ndo {\n    let decoder = JSONDecoder()\n    let response = try decoder.decode(Response.self, from: jsonData)\n\n    print(&quot;Pagination: \\(response.pagination)&quot;)\n    print(&quot;Countries: \\(response.countries)&quot;)\n\n} catch {\n    print(&quot;Error decoding JSON: \\(error)&quot;)\n}\n\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">mport Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Pagination<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> per_page: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">IncomeLevel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LendingType<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: IncomeLevel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: LendingType<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Response<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pagination: Pagination<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries: [Country]<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">unkeyedContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">pagination<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(Pagination.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Country].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonString = <\/span><span style=\"color: #98C379\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">[{&quot;page&quot;:1,&quot;pages&quot;:1,&quot;per_page&quot;:&quot;300&quot;,&quot;total&quot;:296},[{&quot;id&quot;:&quot;ABW&quot;,&quot;iso2Code&quot;:&quot;AW&quot;,&quot;name&quot;:&quot;Aruba&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;LCN&quot;,&quot;iso2code&quot;:&quot;ZJ&quot;,&quot;value&quot;:&quot;Latin America &amp; Caribbean &quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;HIC&quot;,&quot;iso2code&quot;:&quot;XD&quot;,&quot;value&quot;:&quot;High income&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;LNX&quot;,&quot;iso2code&quot;:&quot;XX&quot;,&quot;value&quot;:&quot;Not classified&quot;},&quot;capitalCity&quot;:&quot;Oranjestad&quot;,&quot;longitude&quot;:&quot;-70.0167&quot;,&quot;latitude&quot;:&quot;12.5167&quot;},{&quot;id&quot;:&quot;AFE&quot;,&quot;iso2Code&quot;:&quot;ZH&quot;,&quot;name&quot;:&quot;Africa Eastern and Southern&quot;,&quot;region&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;adminregion&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;},&quot;incomeLevel&quot;:{&quot;id&quot;:&quot;NA&quot;,&quot;iso2code&quot;:&quot;NA&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;lendingType&quot;:{&quot;id&quot;:&quot;&quot;,&quot;iso2code&quot;:&quot;&quot;,&quot;value&quot;:&quot;Aggregates&quot;},&quot;capitalCity&quot;:&quot;&quot;,&quot;longitude&quot;:&quot;&quot;,&quot;latitude&quot;:&quot;&quot;}]]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #98C379\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> jsonData = jsonString.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">using<\/span><span style=\"color: #ABB2BF\">: .utf8)!<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> decoder = <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(Response.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: jsonData)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Pagination: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">response.<\/span><span style=\"color: #E06C75\">pagination<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Countries: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">response.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">} <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error decoding JSON: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Response:<\/strong> <span style=\"font-weight: 400;\">\u0412\u0432\u0435\u0434\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct Response<\/mark><\/code> \u0434\u043b\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 \u043a\u0430\u043a <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Pagination<\/mark><\/code>, \u0442\u0430\u043a \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[Country].<\/mark><\/code> \u042d\u0442\u043e \u043a\u043b\u044e\u0447 \u043a \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<br><\/span><\/li>\n\n\n\n<li><strong>init(from decoder:):<\/strong> <span style=\"font-weight: 400;\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>struct Response \u0442<\/code>\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init(from decoder:).<\/mark><\/code> \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Response<\/mark><\/code>.<br><\/span><\/li>\n\n\n\n<li><strong>unkeyedContainer():<\/strong> <span style=\"font-weight: 400;\">\u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">init(from decoder:) <\/mark><\/code>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">decoder.unkeyedContainer().<\/mark><\/code> \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c JSON \u2014 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 (\u043d\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044c), \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">UnkeyedDecodingContainer<\/mark><\/code>. \u042d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435<br><\/span><\/li>\n\n\n\n<li><strong>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443:<\/strong> <span style=\"font-weight: 400;\">\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">container.decode(Type.self) <\/mark><\/code>\u0434\u0432\u0430\u0436\u0434\u044b \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Pagination<\/mark><\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[Country]. UnkeyedDecodingContainer<\/mark><\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 JSON.<br><\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0447\u0438\u0449\u0435 \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u0435\u0435. \u041d\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">JSONSerialization<\/mark><\/code> \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Codable<\/mark><\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u043d\u0430\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e init. \u042d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b JSON \u0432 Swift.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 <span style=\"font-weight: 400;\"><strong>Gemini 2.0 Flash<\/strong><\/span> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 <strong>ChatGPT 4.o1-mini<\/strong>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <strong>Gemini 1.5 Flash<\/strong>, \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 <strong>Claude 3.5 Sonnet<\/strong>, <strong>\u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f<\/strong> \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430 \u0438 \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 2. <\/strong><strong>&nbsp;ChatGPT O1-preview inside AlexSideBar&nbsp; decode JSON \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d Country. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u0430\u043f <a href=\"https:\/\/alexsidebar.app\"><strong>AlexSideBar<\/strong><\/a> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <strong><a href=\"https:\/\/www.cursor.com\" title=\"\">Cursor AI <\/a><\/strong>\u0434\u043b\u044f <strong>Xcode<\/strong>, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0443\u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044f <strong>2.0 <\/strong>\u0438 \u044d\u0442\u043e \u0431\u0435\u0442\u0430-\u0432\u0435\u0440\u0441\u0438\u044f, \u043e\u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430. \u0412 \u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0418\u0418 (AI), \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 <strong>ChatGPT O1-preview:<\/strong><\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc-YtAor5RyBWywnsLlCigSzzSFVxpHukwNgri0SG1mbx3poO4tdBQJxPGO0CIcGSDeeylDjeJKoV9kKQVbEr-BAan0QklZt1l8Xdf1ARCNtrChXxDA2-p2vIP9x2ZAWOrrveae5g?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 <strong>ChatGPT O1-preview <\/strong>\u0438 \u0437\u0430\u0434\u0430\u043b\u0430 \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 JSON \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[Country] <\/mark><\/code>\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXenjVGsJy7F2uykhXsrYLhujTG6AgK8HZMfec4vP4VY2csHcV6oKlxVTZxLoQk2svrP1BDcP3rrSuaQ2iTML1EtNTg1sG0AA2yCL-QHqBVObW-GDY9PRCNOGwKovCqfLgBBM_ddPw?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import Foundation\n\/\/ MARK: - Top Level Array\ntypealias CountryResponse = [CountryData]\n\/\/ MARK: - First element (metadata)\nstruct Metadata: Codable {\n    let page: Int\n    let pages: Int\n    let perPage: String\n    let total: Int\n    \n    enum CodingKeys: String, CodingKey {\n        case page, pages\n        case perPage = &quot;per_page&quot;\n        case total\n    }\n}\n\/\/ MARK: - Response Data Types\nenum CountryData: Codable {\n    case metadata(Metadata)\n    case countries([Country])\n    \n    init(from decoder: Decoder) throws {\n        let container = try decoder.singleValueContainer()\n        if let metadata = try? container.decode(Metadata.self) {\n            self = .metadata(metadata)\n        } else if let countries = try? container.decode([Country].self) {\n            self = .countries(countries)\n        } else {\n            throw DecodingError.dataCorruptedError(\n                in: container,\n                debugDescription: &quot;Data doesn't match any expected type&quot;)\n        }\n    }\n}\n\/\/ MARK: - Country\nstruct Country: Codable, Identifiable {\n    let id: String\n    let iso2Code: String\n    let name: String\n    let region: Region\n    let adminregion: Region\n    let incomeLevel: Region\n    let lendingType: Region\n    let capitalCity: String\n    let longitude: String\n    let latitude: String\n}\n\/\/ MARK: - Region\nstruct Region: Codable {\n    let id: String\n    let iso2code: String\n    let value: String\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Foundation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Top Level Array<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C678DD\">typealias<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryResponse<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> [CountryData]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - First element (metadata)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Metadata<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> page: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> pages: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> perPage: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> total: <\/span><span style=\"color: #E5C07B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CodingKeys<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">CodingKey <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">page<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E06C75\">pages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">perPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;per_page&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">total<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Response Data Types<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">enum<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CountryData<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">metadata<\/span><span style=\"color: #ABB2BF\">(Metadata)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\">([Country])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">decoder<\/span><span style=\"color: #ABB2BF\">: Decoder) <\/span><span style=\"color: #C678DD\">throws<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> container = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> decoder.<\/span><span style=\"color: #61AFEF\">singleValueContainer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> metadata = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(Metadata.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #61AFEF\">metadata<\/span><span style=\"color: #ABB2BF\">(metadata)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> countries = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\">? container.<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">([Country].<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\"> = .<\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(countries)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">throw<\/span><span style=\"color: #ABB2BF\"> DecodingError.<\/span><span style=\"color: #61AFEF\">dataCorruptedError<\/span><span style=\"color: #ABB2BF\">(<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: container,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">debugDescription<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Data doesn&#39;t match any expected type&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Country<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Country<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Identifiable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2Code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> region: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> adminregion: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> incomeLevel: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> lendingType: Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> capitalCity: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> longitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> latitude: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Region<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Codable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> iso2code: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> value: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0410 \u044d\u0442\u043e ContentView.swift:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import SwiftUI\nstruct ContentView: View {\n    @State private var countries: [Country] = []\n    @State private var errorMessage: String? = nil\n    \n    var body: some View {\n        NavigationView {\n            Group {\n                if let error = errorMessage {\n                    Text(error)\n                        .foregroundColor(.red)\n                } else {\n                    List(countries) { country in\n                        VStack(alignment: .leading) {\n                            Text(country.name)\n                                .font(.headline)\n                            Text(country.region.value)\n                                .font(.subheadline)\n                            if !country.capitalCity.isEmpty {\n                                Text(&quot;Capital: \\(country.capitalCity)&quot;)\n                                    .font(.caption)\n                            }\n                        }\n                    }\n                }\n            }\n            .navigationTitle(&quot;Countries&quot;)\n            .task {\n                do {\n                let url = URL(string: \n           &quot;http:\/\/api.worldbank.org\/v2\/country?format=json&amp;per_page=300&quot;)!\n                let (data, _) = try await URLSession.shared.data(from: url)\n                let response = try \n                 JSONDecoder().decode(CountryResponse.self, from: data)\n                    \n                    \/\/ Extract countries from the response\n                    if case .countries(let fetchedCountries) = response[1] {\n                        self.countries = fetchedCountries\n                    }\n                } catch {\n                    print(&quot;Debug error: \\(error)&quot;)\n                    self.errorMessage = error.localizedDescription\n                }\n            }\n        }\n    }\n}\n#Preview {\n    ContentView()\n}\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">ContentView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> countries: [Country] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> errorMessage: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">? = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">NavigationView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Group<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> error = errorMessage {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(error)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">List<\/span><span style=\"color: #ABB2BF\">(countries) { country <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">headline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(country.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\">.value)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">subheadline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !country.capitalCity.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Capital: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">country.<\/span><span style=\"color: #E06C75\">capitalCity<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">caption<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Countries&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> url = <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #98C379\">&quot;http:\/\/api.worldbank.org\/v2\/country?format=json&amp;per_page=300&quot;<\/span><span style=\"color: #ABB2BF\">)!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (data, _) = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> URLSession.<\/span><span style=\"color: #E06C75\">shared<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">data<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: url)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                 <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(CountryResponse.<\/span><span style=\"color: #C678DD\">self<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">from<\/span><span style=\"color: #ABB2BF\">: data)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Extract countries from the response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">case<\/span><span style=\"color: #ABB2BF\"> .<\/span><span style=\"color: #61AFEF\">countries<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> fetchedCountries) = response[<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">] {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">countries<\/span><span style=\"color: #ABB2BF\"> = fetchedCountries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Debug error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #61AFEF\">ContentView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"61\" height=\"65\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfI4DkVUI9Z-ua5QM4byrQQq3yPual7V7Ks8vU8PJKy2B4JR6b2JeC5yYRlgNzh7Mr9V7iNrPxfjLHxPkDOjRaFgFY1kNw7D7oGBkgTWw0AqY7om5gnbJakhWaCdTnqbZhUvsCX?key=oGdUB4gRuOHNC6EUkQ8RkW1T\"><span style=\"font-weight: 400;\">\u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 API \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0421\u043e\u0437\u0434\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b <strong>CountryModels.swift <\/strong>\u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f JSON \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">[Country].<\/mark><\/code><\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u043d\u0438\u0445 \u044f \u0441\u043e\u0437\u0434\u0430\u043b:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">&#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"><strong>struct Metadata<\/strong><\/mark><\/code>: \u0434\u043b\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 <br>&#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <strong><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct Country<\/mark><\/code>:<\/strong>&nbsp; \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Identifiable<\/mark><\/code> \u0441 \u0446\u0435\u043b\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 SwiftUI \u0441\u043f\u0438\u0441\u043a\u0430\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">List<\/mark><\/code><br>&#8212; \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"><strong>enum CountryData<\/strong> <\/mark><\/code>\u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0422\u0418\u041f\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435: \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">metadata (MetaData)<\/mark><\/code> \u0438 \u0441\u0442\u0440\u0430\u043d <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">countries([Country])<\/mark><\/code><br>&#8212; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\"><strong>typealias CountryResponse = [CountryData] <\/strong><\/mark><\/code>\u043a\u0430\u043a \u0442\u043e\u043f\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 JSON &nbsp; \u0434\u0430\u043d\u043d\u044b\u0445.<br>&#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">struct Region:<\/mark><\/code> \u043c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u043e\u043d\u0430, \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043e\u0445\u043e\u0434\u0430 \u0438 \u0442\u0438\u043f\u0430 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432\u0430\u043d\u0438\u044f<\/span><\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u043d\u043e\u0432\u0438\u043b \u0444\u0430\u0439\u043b <strong>ContentView.swift<\/strong> \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b:<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">&#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">List<\/mark><\/code><br>&#8212; \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <strong>Swift concurrency<\/strong>&#8212; \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438<br>&#8212; \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0442\u0440\u0430\u043d\u0435<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 JSON, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u0430\u043d (\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">CodingKeys)<\/mark>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u043d\u043a\u0430 \u043f\u043e \u0441\u0442\u0440\u0430\u043d\u0430\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 SwiftUI.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXel3sYbFegFnLjRXLc_rKBIci6vsjGAAq7C2j7V7hQZeew2PqVQHKEKgnkt1M7rUrOJFpr9jKCNAQqYF2z2WEt26c0MWBEaozJVNN_XgBCeXc0MYdHDe2jrg74YHE8EzoSET3MRfw?key=oGdUB4gRuOHNC6EUkQ8RkW1T\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u043e\u0440\u043e\u0442\u043b\u0438\u0432\u0430\u044f \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 JSON \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">enum<\/mark><\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0411\u0440\u0430\u0432\u043e!!!<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c <a href=\"https:\/\/nilcoalescing.com\/blog\/CodableConformanceForSwiftEnums\/?utm_campaign=This%2BWeek%2Bin%2BSwift&amp;utm_medium=email&amp;utm_source=This_Week_in_Swift_196\" title=\"\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0421\u0441\u044b\u043b\u043a\u0438:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><a href=\"https:\/\/www.massicotte.org\/step-by-step-network-request\" title=\"\">Concurrency Step-by-Step: A Network Request<\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\n<a href=\"https:\/\/bestkora.com\/IosDeveloper\/\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c-\u043f\u043e-\u0448\u0430\u0433\u0430\u043c-\u0441\u0435\u0442\u0435\u0432\u043e\u0439-\u0437\u0430\/\" title=\"\">\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0448\u0430\u0433\u0430\u043c:&nbsp; \u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. (\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438).<\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><a href=\"https:\/\/nilcoalescing.com\/blog\/CodableConformanceForSwiftEnums\/?utm_campaign=This%2BWeek%2Bin%2BSwift&amp;utm_medium=email&amp;utm_source=This_Week_in_Swift_196\" title=\"\">Codable conformance for Swift enums<\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f, \u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430 \u0438 \u0442.\u0434.) \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0435\u0451 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0444\u043b\u0430\u0433. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u0443, \u0442\u043e \u043e \u043d\u0435\u0439 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f population \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0412\u0412\u041f (\u0432\u0430\u043b\u043e\u0432\u043e\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430) gdp. \u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418 Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview, Gemini 2.0 Flash<br \/>\n <a href=\"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/\">\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[119,107,118,117,108],"tags":[121,122,120,123],"class_list":["post-16340","post","type-post","status-publish","format-standard","hentry","category-alex-sidebar","category-chatgpt","category-clause-3-5-sonnet","category-gemini-2-0","category-108","tag--chatgpt-4-o1-mini","tag--chatgpt-4o1-preview","tag--claude-3-5-sonnet","tag--gemini-2-0-flash"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"tatiana.kornilova@gmail.com\"\/>\n\t<meta name=\"keywords\" content=\"claude 3.5 sonnet,chatgpt 4.o1-mini,chatgpt 4.o1-preview,ios app countries,world bank\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"ru_RU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2024-12-28T14:56:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-01-15T07:23:43+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#article\",\"name\":\"\\u041e\\u043f\\u044b\\u0442 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f Countries \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \\u0438 Gemini 2.0 Flash | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"headline\":\"\\u041e\\u043f\\u044b\\u0442 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f Countries\\u00a0 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \\u0438 Gemini 2.0 Flash\",\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/lh7-rt.googleusercontent.com\\\/docsz\\\/AD_4nXclINX6cpI77H6JWX_i5BoWjUozd9YqRJR-vKpJzEGVNtPZD-69s8wq6qQiO-J41iz2mOv0OLcvA3y_DKqqoUiOoHaUOiRp4cIUYQGWzK_6h6trGT4tYRuUZcrE5nxq6_qiRVJQog?key=oGdUB4gRuOHNC6EUkQ8RkW1T\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#articleImage\"},\"datePublished\":\"2024-12-28T14:56:09+00:00\",\"dateModified\":\"2025-01-15T07:23:43+00:00\",\"inLanguage\":\"ru-RU\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#webpage\"},\"articleSection\":\"Alex Sidebar, ChatGPT, Clause 3.5 Sonnet, Gemini 2.0, \\u0418\\u0418 \\u0430\\u043b\\u0433\\u043e\\u0440\\u0438\\u0442\\u043c\\u044b, \\u0418\\u0418 ChatGPT 4.o1-mini, \\u0418\\u0418 ChatGPT 4o1-preview, \\u0418\\u0418 Claude 3.5 Sonnet, \\u0418\\u0418 Gemini 2.0 Flash\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/chatgpt\\\/#listItem\",\"name\":\"ChatGPT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/chatgpt\\\/#listItem\",\"position\":2,\"name\":\"ChatGPT\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/chatgpt\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#listItem\",\"name\":\"\\u041e\\u043f\\u044b\\u0442 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f Countries\\u00a0 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \\u0438 Gemini 2.0 Flash\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#listItem\",\"position\":3,\"name\":\"\\u041e\\u043f\\u044b\\u0442 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f Countries\\u00a0 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \\u0438 Gemini 2.0 Flash\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/chatgpt\\\/#listItem\",\"name\":\"ChatGPT\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#webpage\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/\",\"name\":\"\\u041e\\u043f\\u044b\\u0442 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f Countries \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \\u0438 Gemini 2.0 Flash | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u042f \\u0437\\u0430\\u043d\\u0438\\u043c\\u0430\\u044e\\u0441\\u044c \\u0438\\u0441\\u0441\\u043b\\u0435\\u0434\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435\\u043c \\u0442\\u043e\\u0433\\u043e, \\u043a\\u0430\\u043a \\u043c\\u043e\\u0436\\u043d\\u043e \\u044d\\u0444\\u0444\\u0435\\u043a\\u0442\\u0438\\u0432\\u043d\\u043e \\u0441\\u043e\\u0437\\u0434\\u0430\\u0432\\u0430\\u0442\\u044c iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e \\u0418\\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \\u0430 \\u0442\\u0430\\u043a\\u0436\\u0435 \\u0441 \\u043f\\u043e\\u043c\\u043e\\u0449\\u044c\\u044e \\u0441\\u0440\\u0435\\u0434 \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0438 (IDE) \\u0442\\u0438\\u043f\\u0430 Cursor AI \\u0438 Alex Sidebar. \\u0414\\u043b\\u044f \\u044d\\u0442\\u0438\\u0445 \\u0446\\u0435\\u043b\\u0435\\u0439 \\u044f \\u0440\\u0435\\u0448\\u0438\\u043b\\u0430 \\u0441\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c \\u0434\\u043e\\u0432\\u043e\\u043b\\u044c\\u043d\\u043e \\u043f\\u0440\\u043e\\u0441\\u0442\\u043e\\u0435 \\u0442\\u0435\\u0441\\u0442\\u043e\\u0432\\u043e\\u0435 iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 Countries, \\u043a\\u043e\\u0442\\u043e\\u0440\\u043e\\u0435 \\u043f\\u043e\\u043a\\u0430\\u0437\\u044b\\u0432\\u0430\\u0435\\u0442 \\u0432\\u0441\\u0435 \\u0441\\u0442\\u0440\\u0430\\u043d\\u044b \\u041c\\u0438\\u0440\\u0430 \\u043f\\u043e \\u0440\\u0435\\u0433\\u0438\\u043e\\u043d\\u0430\\u043c (\\u0415\\u0432\\u0440\\u043e\\u043f\\u0430, \\u0410\\u0437\\u0438\\u044f,\",\"inLanguage\":\"ru-RU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"datePublished\":\"2024-12-28T14:56:09+00:00\",\"dateModified\":\"2025-01-15T07:23:43+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/\",\"name\":\"\\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \\u043d\\u0435\\u0430\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0441\\u043f\\u0435\\u043a\\u0442 \\u043b\\u0435\\u043a\\u0446\\u0438\\u0439 \\u0421\\u0442\\u044d\\u043d\\u0444\\u043e\\u0440\\u0434\\u0441\\u043a\\u043e\\u0433\\u043e \\u0443\\u043d\\u0438\\u0432\\u0435\\u0440\\u0441\\u0438\\u0442\\u0435\\u0442\\u0430 \\\" \\u0420\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430 iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439\\\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \\u0438 2026 \\u0433\\u0433., \\u0441\\u043e\\u043f\\u0440\\u043e\\u0432\\u043e\\u0436\\u0434\\u0430\\u0435\\u043c\\u044b\\u0439 \\u0440\\u0435\\u0448\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438 \\u0437\\u0430\\u0434\\u0430\\u043d\\u0438\\u0439 \\u0438 \\u0434\\u043e\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438, \\u0441\\u0432\\u044f\\u0437\\u0430\\u043d\\u043d\\u044b\\u043c\\u0438 \\u0441 \\u0430\\u0434\\u0430\\u043f\\u0442\\u0430\\u0446\\u0438\\u0435\\u0439 \\u043a\\u0443\\u0440\\u0441\\u043e\\u0432 \\u043a \\u043d\\u043e\\u0432\\u044b\\u043c \\u0432\\u0435\\u0440\\u0441\\u0438\\u044f\\u043c Swift, Objective-C \\u0438 iOS.\",\"inLanguage\":\"ru-RU\",\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,","canonical_url":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"claude 3.5 sonnet,chatgpt 4.o1-mini,chatgpt 4.o1-preview,ios app countries,world bank","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#article","name":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","headline":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash","author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXclINX6cpI77H6JWX_i5BoWjUozd9YqRJR-vKpJzEGVNtPZD-69s8wq6qQiO-J41iz2mOv0OLcvA3y_DKqqoUiOoHaUOiRp4cIUYQGWzK_6h6trGT4tYRuUZcrE5nxq6_qiRVJQog?key=oGdUB4gRuOHNC6EUkQ8RkW1T","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#articleImage"},"datePublished":"2024-12-28T14:56:09+00:00","dateModified":"2025-01-15T07:23:43+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#webpage"},"isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#webpage"},"articleSection":"Alex Sidebar, ChatGPT, Clause 3.5 Sonnet, Gemini 2.0, \u0418\u0418 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0418\u0418 ChatGPT 4.o1-mini, \u0418\u0418 ChatGPT 4o1-preview, \u0418\u0418 Claude 3.5 Sonnet, \u0418\u0418 Gemini 2.0 Flash"},{"@type":"BreadcrumbList","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","position":1,"name":"Home","item":"https:\/\/bestkora.com\/IosDeveloper","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/chatgpt\/#listItem","name":"ChatGPT"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/chatgpt\/#listItem","position":2,"name":"ChatGPT","item":"https:\/\/bestkora.com\/IosDeveloper\/category\/chatgpt\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#listItem","name":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#listItem","position":3,"name":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash","previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/chatgpt\/#listItem","name":"ChatGPT"}}]},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/#person","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author","url":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"WebPage","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#webpage","url":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/","name":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#website"},"breadcrumb":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/#breadcrumblist"},"author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"creator":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"datePublished":"2024-12-28T14:56:09+00:00","dateModified":"2025-01-15T07:23:43+00:00"},{"@type":"WebSite","@id":"https:\/\/bestkora.com\/IosDeveloper\/#website","url":"https:\/\/bestkora.com\/IosDeveloper\/","name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \" \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"}}]},"og:locale":"ru_RU","og:site_name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","og:type":"article","og:title":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","og:description":"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,","og:url":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/","article:published_time":"2024-12-28T14:56:09+00:00","article:modified_time":"2025-01-15T07:23:43+00:00","twitter:card":"summary","twitter:title":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","twitter:description":"\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418: ChatGPT 4.o1, Claude 3.5 Sonnet, Gemini 2.0 Flash, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 Cursor AI \u0438 Alex Sidebar. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Countries, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u041c\u0438\u0440\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c (\u0415\u0432\u0440\u043e\u043f\u0430, \u0410\u0437\u0438\u044f,"},"aioseo_meta_data":{"post_id":"16340","title":null,"description":null,"keywords":[{"label":"Claude 3.5 Sonnet","value":"Claude 3.5 Sonnet"},{"label":"ChatGPT 4.o1-mini","value":"ChatGPT 4.o1-mini"},{"label":"ChatGPT 4.o1-preview","value":"ChatGPT 4.o1-preview"},{"label":"iOS App Countries","value":"iOS App Countries"},{"label":"World Bank","value":"World Bank"}],"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2024-12-28 14:55:36","updated":"2026-02-22 19:42:43","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\/category\/chatgpt\/\" title=\"ChatGPT\">ChatGPT<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries  \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/bestkora.com\/IosDeveloper"},{"label":"ChatGPT","link":"https:\/\/bestkora.com\/IosDeveloper\/category\/chatgpt\/"},{"label":"\u041e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Countries\u00a0 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Claude 3.5 Sonnet, ChatGPT 4.o1-mini, ChatGPT 4.o1-preview \u0438 Gemini 2.0 Flash","link":"https:\/\/bestkora.com\/IosDeveloper\/%d0%be%d0%bf%d1%8b%d1%82-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-countries-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c\/"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16340","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/comments?post=16340"}],"version-history":[{"count":4,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16340\/revisions"}],"predecessor-version":[{"id":16485,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16340\/revisions\/16485"}],"wp:attachment":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/media?parent=16340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/categories?post=16340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/tags?post=16340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}