{"id":16222,"date":"2024-11-28T18:06:03","date_gmt":"2024-11-28T18:06:03","guid":{"rendered":"https:\/\/bestkora.com\/IosDeveloper\/?p=16222"},"modified":"2024-12-03T08:37:15","modified_gmt":"2024-12-03T08:37:15","slug":"cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com","status":"publish","type":"post","link":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/","title":{"rendered":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u0424\u043e\u0442\u043e \u0441 Flickr.com&#187;. \u0427\u0430\u0441\u0442\u044c 1."},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"395\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31-1024x395.png\" alt=\"\" class=\"wp-image-16223\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31-1024x395.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31-300x116.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31-768x296.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31-1536x592.png 1536w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31-500x193.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31.png 1712w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 <strong>Cursor AI<\/strong> \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c <a href=\"https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1\">\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com.<\/a><\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0417\u0430\u0434\u0430\u0447\u0430<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 <code>Grid<\/code> \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdkAEb8xrRu4skLITkXUJJSkXlzKPVlxFIkJhVB_qyh-M3bhm05sfIxssQ-64ptGDmeG_o5CMlkyTU-mUI5Z8iv1oIKmTCxQPO_YdiHP1hCbTm7RbpnjkYx04sKl22W6zKpm-iGyA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u0442\u0435\u0433\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u0430. \u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u201crose\u201d) \u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 \u0441\u043b\u043e\u0432\u0430(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u201cforest bird\u201d (\u043b\u0435\u0441 \u043f\u0442\u0438\u0446\u0430)).<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>API \u0438\u0437 Flickr \u0442\u0438\u043f\u0430<\/strong>: <a href=\"https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1&amp;tags=porcupine\">https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1&amp;tags=porcupine<\/a> (\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0441\u043b\u043e\u0432\u043e &#171;porcupine&#187; \u043d\u0430 \u0442\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0432\u0435\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0445\u043e\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f UI.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">View<\/mark><\/code> \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<\/span><\/li>\n<\/ul>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438:<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">Swift<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">SwiftUI<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">Async\/Await<\/span><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430: Mac, Xcode \u0438 Cursor AI<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0430\u043c \u043d\u0443\u0436\u0435\u043d <strong>Mac<\/strong> &#8212; \u043b\u044e\u0431\u043e\u0439: Mac Studio, MacBook, iMac.<br>\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c <strong>Xcode<\/strong> \u0438\u0437 Apple <strong>App Store<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc3NJMrzP0oWv7Nl8UHycHlkYa9--ft7fA1w5ZURztihWRxxfQ6AAMwtqFq05kK799ca1hJhlmS7k5QzEXWqfhJrS7oDvVWf594oFLBkzGiYjsf3c9iKx2ewhece5k_R2tbSY1uaQ?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Apple, \u0438 \u043e\u043d\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. \u041d\u043e \u0432\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0438 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430, <strong>Cursor AI<\/strong> \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0437\u0430 \u0432\u0430\u0441, \u043d\u043e \u043e\u043d \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 <code>Preview<\/code>. <br>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 <a href=\"https:\/\/www.cursor.com\/\">Cursor AI<\/a>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe18fiBXZf_jMUYik-fvZHS9LVJyHUVOF7d9bSNwt2VPmL0WGIs-dQOUVziGnb23e4j6c1qFjWXC5emYrCsDYZFONKIVLvwXF1Ua__rSlFZWM2IArM5lSBE5GO0NwmgWvP5iGVC6g?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <strong>Xcode<\/strong> \u0438 <strong>Cursor AI <\/strong>\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe0llZT3dutDSyqmlCF6rxK8OI5b6drJgcXmmuF9zyTszY5S89k_XsgxArNBjByy-mLIFjdgh8gyg7L2YTcYNXNXNY0UdNS5UaK842A6-Uh7sCUHHJac2z3xLotpjQZ8Sr8TzkACQ?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, &#8212; \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 <strong>Xcode<\/strong>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfNK9Pqz23aeDHVnGCIAQLiTJsLfDW-UAOzVxhL2sbrir5Jzzo5dGWWssIFL5-_or3bcEL72kfrSWS4boo63SciG0SkMFZ67vmyCIPWZQq2r-uwNGVhNeMEvXnrAFTRPOel_MWThA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435<strong> iOS<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeL_igki0BP6XgK5Pd4UW_wfXTegQnNZB1mBfONVFK8S8KvNzUeVuzOGyF09LL2gmRjpWWCARTuoW-KmvOn2rfMqX9q00GDhb3IDBlbjc5vFxfCuNItLjWIaB1nTaOCOFT8xXIPsQ?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2026 \u0438 \u043d\u0430\u0437\u043e\u0432\u0438\u0442\u0435 \u0435\u0433\u043e <strong>PhotomaniaCursor<\/strong>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfzeo6ZCyA2yH_4t250jfIE8Vxs_L2981SuOuZf7bvhMP1FKieKgpdveKswy4uuRe7G3AajMGnyjcskRdmo4MffAKAXcHHGIx9BkgMlpFhYkaRi6alp7VSWhFwxb0Jx7OCRTnA9Ug?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u043c\u0438\u0442\u0435 <strong>Next<\/strong> (\u201c\u0414\u0430\u043b\u0435\u0435\u201d), \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f? \u042f \u0432\u044b\u0431\u0435\u0440\u0443 \u0441\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b <strong>desktop<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc_J05e-pCRZKohcyJ8fOeaea239WCAMVDSgMQcxzxqyD2pw05RgK1oALISFyVILmJSvTHTyWvel9sIaTJuprmnHZo0clwy98WmSsdpUid1M267SaY8tZO2yvXL6GMuhJkDfBuY0w?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043d\u0430\u0436\u043c\u0443 <strong>Create<\/strong> (\u201c\u0421\u043e\u0437\u0434\u0430\u0442\u044c\u201d), \u0438 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043f\u0430\u043f\u043a\u0430 <strong>PhotomaniaCursor.<\/strong><\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd2G4L08I7k325QcbfI8x-m3glTFy5cmtP7DXw23Hm3Sfu5HI76JoZQN4VUnCgVYCJi6J-CajSIoIzzVtF03T9JmY8ANFhLw2zBfRQOYzb-MZhaT3Tqv8BnLYHuoDSc-wdks6w2?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Xcode<\/strong>&nbsp;\u0441\u043e\u0437\u0434\u0430\u043b \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 <code>Preview<\/code> \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 <strong>Hello World! <\/strong> \u0414\u0430, \u0432\u0435\u0440\u043d\u043e, \u043e\u043d \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 <strong>Hello World! <\/strong>\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 <strong>iPhone<\/strong>, \u0447\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u0442\u043e.<br>\u042d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u043c\u044b \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. <br>\u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>Cursor AI,<\/strong> \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e.<br>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <strong>Cursor AI<\/strong>, \u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437, \u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c <strong>Xcode<\/strong> \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c.&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcmn-tdvYRTsB-6CRsvPgIyB4QdJNeQQ_byvuhXAtj0piFrqW12wqpMYYOp2uRimuF60-z7m00PT6yt91iJ_8ttV4LxUM2HWm8E59KQ0agfFckvmnxH6epCqXdeFqc7SJLYyt5AUQ?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u044f \u0437\u0430\u0439\u0434\u0443 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b <strong>desktop<\/strong>, \u0442\u043e \u0442\u0430\u043c \u043d\u0430\u0439\u0434\u0443 \u043f\u0430\u043f\u043a\u0443 <strong>PhotomaniaCursor<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfDrM0Mxg_pC_08muNJyVGlIG4BCcKyCoti3himHh1vennHWsclcpV1qt6KDryOEmG1BYpCnR35IWgmjOXxoWZjAPIyhtlX4VqczeHltsKsQSVX1wmdySzp9Zs3CWWid191p87s?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 <strong>Open<\/strong> (\u201c\u041e\u0442\u043a\u0440\u044b\u0442\u044c\u201d) \u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u043a <strong>Cursor AI.<\/strong>&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcziVXlM0SexI5HLyy0XiVgmICDVWDkoRGrPtV8DYXYPLH1Jjtes2zst43ZAhhH-HPzR3BoOstsXbsDMhTaf6nmcedFEvYpLPX6gMtNvnRMoIWQQ4xpsaOB2OKoxF1FqZSe_cjq?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u044f \u0438\u0445 \u043e\u0442\u043a\u0440\u043e\u044e, \u0442\u043e \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u043b \u0432 <strong>Xcode<\/strong>. \u0412\u0441\u0451 \u044d\u0442\u043e&nbsp;\u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a <strong>Cursor AI<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcAFuzJbeN6oa1ylrOoa6pCISl0hf1Oz5xE_ZuprzfkkAJ7zPOoTRTVUfKSMWVeXUOFoGNhBVHdbBTllmbtm0Xlu7Bt2UvHUpZPGXm9gQ7_1J2gHiC0FpLg7aM44YjMb7Ii7ECQUA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c <strong>Composer<\/strong> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Shift + Cmd + I. <\/strong>\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435&nbsp; <strong>Untitled<\/strong> <strong>Composer<\/strong>.&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeJw96V1J3VeTqOKV1Qd4quz9GDR7hpBP9uJEGpjCJ_xugAN1_aAQ0dEpodvYy0AJ9hUaWnXyfhgpq0U-pG5FcUC_Gc-7zCe2-CWCq_Y3y8v6ZbQkVMQ-RsNsDxfHjtI_yaTgotvg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434.&nbsp;<br>\u041d\u043e, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u044f \u0445\u043e\u0447\u0443 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e <span style=\"font-weight: 400;\">\u043b\u0443\u0447\u0448\u0438\u043c <\/span>\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c Apple \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043c\u043e\u0435\u0433\u043e iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0443\u0447\u0438\u0442\u044c <strong>Cursor AI<\/strong> \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c Apple, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c. <br>\u041a\u0430\u043a \u0432\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0435?<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u0438\u043c\u0432\u043e\u043b <strong>@<\/strong>&nbsp; \u0432<strong> Cursor &nbsp;Composer<\/strong>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc251mnttQjPqyxFp-6Y_6x6WsQzEBPhkTVQUIVzVFX2JUdATICEs3nvb36ruBhjWIjOoHwPbbrR0qMdWPHQ38g4j2Zhy2KJAZMu8pazjUtMxGApeDsWnGWI4ByryX777jZQZmhaA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2026 \u0438 \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u044c @Docs:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXexfdId4s56kN3LXMuiEcGauaNtW035gJt99U8V5y0-V8BQKqteHA71ZeYnJ1iI3Kccr2Q0LLYcE1Xafs4sz_XcSMzTS482QVdmbAi--52oGqLOV2t5aCkLpanrIBFoNJ4cJsSGSA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435&nbsp; <strong>@Docs<\/strong> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeYWJ4V6HM6KNiAk9nqdtwVuPObrk8SUvfWfYjxJSe8qw2DWSpUH3yONZCN0gaTfLScfBE3R2WwSe_mq6KfiCZlyBX2BQXLt8MD_QRYbpaEf20W-B4glQGZ05uuV7QOU9Fw_gHg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u044f \u0443\u0436\u0435 \u043e\u0431\u0443\u0447\u0430\u043b\u0430&nbsp; <strong>Cursor AI<\/strong> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c, \u043d\u043e \u044f \u043c\u043e\u0433\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0437\u0434\u0435\u0441\u044c:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeyrl3rExndDcZUoStEdhkStJ1wHYbFaZ4nAX9yn6bz7dSRwFuUdEwSV2lbPficIEL1EE8PtaqzSv36NghL9zteVo6vKA2vVy5Pk_VDrJ-3WzTFP8zeIqdfwvimBc0XufTj1CO-vA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043c\u043e\u0433\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0423 \u043c\u0435\u043d\u044f \u043d\u0430 <strong>Chrome<\/strong> \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432.<br> \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f <strong>Swift<\/strong> <a href=\"https:\/\/developer.apple.com\/documentation\/swift\/\">https:\/\/developer.apple.com\/documentation\/swift\/<\/a><\/span>&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfbaq_IgAuPT1ZmWTF1CL2y9z2t1itdFPnugQSf9_WHtDsKWi0P5pyRBmwCGZKUk8rZGBI4k3Mcl1PYiytzbUqzk9haLj1rLEtUi8EHrv5gtUdzvsc5oYaSs8fn1AARb4Wt5hULbA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418\u0442\u0430\u043a, \u044f \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u044e URL-\u0430\u0434\u0440\u0435\u0441 <strong>Apple Swift<\/strong>, \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044e \u0435\u0433\u043e \u0441\u044e\u0434\u0430:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd9i_b4L_5wt1b-cjwTWLzP3wkJo8_7OJ10RHWXkTEPuKx1Z92nABGWxvprJP5GBJPB3n2ZSnO439KtuTTgQ7gX9V_8YRvFi-AQGytNvLBI0OFn6M0XrdlpgI4zwM1_nIPVFp5_tQ?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0434\u0438\u043c \u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443 \u0438\u043c\u044f <strong>Apple Swift<\/strong> \u0438 \u043a\u043b\u0438\u043a\u043d\u0435\u043c \u201cConfirm\u201d (\u201c\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c\u201d):<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXefJ761qX_0Mgzi3ORm7s0IJV4mQ7hXlH43N9OoCsQbC5HJTRgjUKt9bcckVBGaYcK1k1vNQ5Jjltk-psw_LvsCwYrixMCugX0GQkZ42H807NVKbNudMnJJJ9XmQHgTQNwuxnpWkw?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418 \u043e\u043d \u043d\u0430\u0447\u043d\u0435\u0442 \u043e\u0431\u0443\u0447\u0430\u0442\u044c<strong> Cursor AI <\/strong>\u044f\u0437\u044b\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<strong> Swift<\/strong>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0445\u043e\u0447\u0443 \u043e\u0431\u0443\u0447\u0438\u0442\u044c<strong> Cursor AI<\/strong> \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u201cUI design Do&#8217;s and Don&#8217;ts\u201d (\u201c\u0421\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u201d) \u043e\u0442&nbsp; Apple <a href=\"https:\/\/developer.apple.com\/design\/tips\/\">https:\/\/developer.apple.com\/design\/tips\/<\/a> :<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe3EQCGKWLJPri8xdwo_1L_NMt-ALZP-4re0MANKVUSylUaboofkhX9pir5Sct3cNun134oLXzC-WOmzDTDtOqJtPJF-5dplaO__3a3PnRLlgIXOimBbSpRjwrc8IBOVpWH-DFjQA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e\u0431\u044b <strong>Cursor \u0410I<\/strong> \u0442\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b \u044d\u0442\u0438\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u043e\u0431\u0443\u0447\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <strong>@Apple Swift<\/strong>. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441  \u201cUI design Do&#8217;s and Don&#8217;ts\u201d&nbsp; (\u201c\u0421\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Apple\u201d) , \u0442\u043e \u0435\u0441\u0442\u044c <strong>@Apple UI Design Tips:<\/strong><\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd7AMI_r32X0G0D9jjyLgoF2U1_Z_h1eSMGZIFDV8Gd3W6GoJb79HlEVxJK6IXBTrvDSI-HLCt39OqrkMF56_qBRfFAHd_oODFf7Hbjk2YgNUndwzcH3UpDbeoT809JReCEs03C?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Cursor \u0410I <\/strong>\u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430. <br>\u0418\u0442\u0430\u043a, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e. \u041c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Apple. <br>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0435\u0433 <strong>@ <\/strong>\u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <br>\u0418 \u044d\u0442\u043e <strong>@Codebase<\/strong>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdgRz90nRYg3HOh03aXVecA93-01ZpNjDrLwpgZ71vxylGjorj9l2ZM6libj8dAUH65LiilBWjFYCSNHdwoq4EmN-lQV1sD5K0EkIKKBv1z1ZBxWTG4LLAXabVpCtc2BvHtlEHBww?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong>Codebase<\/strong> \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 <strong>Xcode<\/strong>, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b <strong>Composer<\/strong> \u0432\u0438\u0434\u0435\u043b \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0445, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeZsswLhAWgOllNls8FJsiq3L3jJpvr4qcipAZg2Gwgj_3qsa__y0qZHFKjQ5-5qFL6kXQpaXkDZpxOEI-jpIwTDJaiD8ZGNAGHjRsxkJPEHQQDkvb4B6xiYlTVt4srGjUFCk4cHA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f Cursor AI<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u044f \u043c\u043e\u0433\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u0441\u0442\u0430\u0442\u0438, <strong>Cursor AI <\/strong>\u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeiLeePssVb_m3zhWUP2_TJorV8IlMJLbNL5bFIWRxXtm00zgCI0rLZpdzHLThKQc3Ca9yWy-Q-urmSee1r-fhx7-jq84r-MhrodM1taJpRLbOQ2sOYOdYyRvBy1izSsU3euAk7?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\">\u042f \u0445\u043e\u0442\u0435\u043b\u0430 \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <strong>Flickr Photos<\/strong> \u0434\u043b\u044f <strong>iOS<\/strong>. <br>\u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435.<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li class=\"has-light-gray-background-color has-background\"><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0412\u0437\u044f\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <code>Photos<\/code> c <span style=\"font-weight: 400;\"><a href=\"https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1&amp;tags=porcupine\">https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1<\/a><\/span><\/mark><\/span><\/li>\n\n\n\n<li class=\"has-light-gray-background-color has-background\"><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <code>Photos<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>LazyVGrid<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>.searchable <\/code>\u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439.<\/mark><\/span><\/li>\n\n\n\n<li class=\"has-light-gray-background-color has-background\"><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>PhotoDetailView<\/code> \u0434\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438.&nbsp;<\/mark><\/span><\/li>\n\n\n\n<li class=\"has-light-gray-background-color has-background\"><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>NavigationStack<\/code>.<\/mark><\/span><\/li>\n<\/ol>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f iOS. <br>\u042f \u043d\u0430\u0436\u0438\u043c\u0430\u044e Enter, \u0438 <strong>Cursor Compose<\/strong>r \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043a \u0440\u0430\u0431\u043e\u0442\u0435. <br>\u0412\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u043e\u043d \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430\u0445. \u042f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043b\u0443\u0447\u0448\u0438\u043c\u0438 <strong>Apple<\/strong> \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c\u0438 \u0434\u0438\u0437\u0430\u0439\u043d\u0430 UI  <strong>@Apple UI Design Tips<\/strong>. <br>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u043b\u0438\u043a\u043d\u0435\u043c <strong>Accept All<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 <strong>Cursor AI <\/strong>\u043a\u043e\u0434:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcWH-RdR5z1_fZhiza7X2kRN7JJA_t54IUYzhAPmdLALREhGNXSlLrt9JXjVKufGXPD8AJd1Wy80CrR5qvwb0uIjz1PLLP4gOvJKus_7lh9FkPgki5X-o4QFGnyyhWdTwjq_Sji_w?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412<strong> Xcode<\/strong> \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 <strong>Cursor AI <\/strong>\u0444\u0430\u0439\u043b\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 <code>Preview<\/code> \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcuxivE_NGixIJqtWE1GvWlpX9LS0UcqXyZPd8Hyk4wtupqC0jQreULaQUu82XQKCb4w-_jc4ilPSgdOQRkGYI6st5p0a-ENcr3qae8x03nWiB1VkYchxdWgOGIttL4MBAmmLkTGw?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e <strong>Cursor AI<\/strong> \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b <strong>\u043f\u0440\u044f\u043c\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xcode<\/strong>: <code>FlickrPhoto<\/code>, <code>FlickrViewModel<\/code>, <code>PhotoDetailView<\/code> \u0438 <code>PhotoGridItem<\/code>. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, <strong>Composer Cursor AI <\/strong>\u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0418 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430, \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b c <span style=\"font-weight: 400;\"><a href=\"https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1\">Flickr.com<\/a><\/span>  \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u044b \u0432 \u0441\u0435\u0442\u043a\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGid<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f  \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430 \u0438 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435, \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 UI. \u041d\u043e \u0435\u0441\u043b\u0438 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c:<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 1.<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfXYreOOS4lMymtUrUpUE5LU-rCvQ2AYR6b_7-0k7XnwrUtLflrmYsN5o91bdBCRrXngr85UFzybSVMiXoktjuR5DoKizgEBkMqlWMwLMo7pCMSDHjevEk5vB8GWvp8OeCV8eDfvg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:354px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438\u0434\u0435\u0442 \u043d\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 <strong>Flickr.com<\/strong>, a \u0438\u0437 \u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 tags \u0434\u043b\u044f URL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u0440\u043e\u0448\u0443 <strong>Cursor AI<\/strong>&nbsp; \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">searchText<\/mark><\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a&nbsp; <strong>Flickr.com <\/strong>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code>. \u0412\u043e\u0442 \u043c\u043e\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430  (Prompt):<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfLj6fnrjyFSzq29pu7llVkBVGdYd2S3zEdynI3TQ6kMiBTwRYgPw33aiqylRUSJjJMGS2mS_KYsRTUB3aTpAGEPoQkQMOXxYavpXTUXofTVLCxcLNzKorOhrf0grJwmCO5AG5bmg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0443 \u044d\u0442\u0443 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 (Prompt) \u0438 \u043e\u0442\u0432\u0435\u0442 <strong>Cursor AI <\/strong>\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u0435\u0442\u044b <strong>Cursor AI<\/strong> \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435.<\/span><\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439&nbsp; <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">searchText<\/mark><\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code> \u0432 URL \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435:&nbsp;<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#24292eff;--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:#ffffff\"><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=\" if !searchText.isEmpty {\n\u00a0 \u00a0 \u00a0 \/\/ Convert search text to comma-separated tags and properly encode for URL\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let tags = searchText\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .components(separatedBy: &quot; &quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .filter { !$0.isEmpty }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .joined(separator: &quot;,&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if let encodedTags = tags.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 urlString += &quot;&amp;tags=\\(encodedTags)&quot;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\" style=\"color:#24292eff;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 min-light\" style=\"background-color: #ffffff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #24292EFF\"> <\/span><span style=\"color: #D32F2F\">if<\/span><span style=\"color: #24292EFF\"> <\/span><span style=\"color: #D32F2F\">!<\/span><span style=\"color: #24292EFF\">searchText.<\/span><span style=\"color: #1976D2\">isEmpty<\/span><span style=\"color: #24292EFF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C2C3C5\">\/\/ Convert search text to comma-separated tags and properly encode for URL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #D32F2F\">let<\/span><span style=\"color: #24292EFF\"> tags <\/span><span style=\"color: #D32F2F\">=<\/span><span style=\"color: #24292EFF\"> searchText<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #6F42C1\">components<\/span><span style=\"color: #212121\">(<\/span><span style=\"color: #6F42C1\">separatedBy<\/span><span style=\"color: #212121\">:<\/span><span style=\"color: #6F42C1\"> <\/span><span style=\"color: #22863A\">&quot; &quot;<\/span><span style=\"color: #212121\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #6F42C1\">filter<\/span><span style=\"color: #24292EFF\"> { <\/span><span style=\"color: #D32F2F\">!<\/span><span style=\"color: #24292EFF\">$0.<\/span><span style=\"color: #1976D2\">isEmpty<\/span><span style=\"color: #24292EFF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #6F42C1\">joined<\/span><span style=\"color: #212121\">(<\/span><span style=\"color: #6F42C1\">separator<\/span><span style=\"color: #212121\">:<\/span><span style=\"color: #6F42C1\"> <\/span><span style=\"color: #22863A\">&quot;,&quot;<\/span><span style=\"color: #212121\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #D32F2F\">if<\/span><span style=\"color: #24292EFF\"> <\/span><span style=\"color: #D32F2F\">let<\/span><span style=\"color: #24292EFF\"> encodedTags <\/span><span style=\"color: #D32F2F\">=<\/span><span style=\"color: #24292EFF\"> tags.<\/span><span style=\"color: #6F42C1\">addingPercentEncoding<\/span><span style=\"color: #212121\">(<\/span><span style=\"color: #6F42C1\">withAllowedCharacters<\/span><span style=\"color: #212121\">:<\/span><span style=\"color: #6F42C1\"> .urlQueryAllowed<\/span><span style=\"color: #212121\">)<\/span><span style=\"color: #24292EFF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 urlString <\/span><span style=\"color: #D32F2F\">+=<\/span><span style=\"color: #24292EFF\"> <\/span><span style=\"color: #22863A\">&quot;&amp;tags=<\/span><span style=\"color: #22863A\">\\(encodedTags)<\/span><span style=\"color: #22863A\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #24292EFF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u0432\u0430\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">FlickrViewModel<\/mark><\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u0433\u043e\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code> \u0432 URL API. \u0412\u043e\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">FlickrViewModel<\/mark><\/code>:<\/span> <img loading=\"lazy\" decoding=\"async\" width=\"250\" height=\"42\" class=\"wp-image-16238\" style=\"width: 250px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.20.png\" alt=\"\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.20.png 644w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.20-300x50.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.20-500x84.png 500w\" sizes=\"auto, (max-width: 250px) 100vw, 250px\" \/><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418 \u043d\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">ContentView<\/mark><\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">searchText<\/mark><\/code>:<\/span> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" width=\"250\" height=\"43\" class=\"wp-image-16239\" style=\"width: 250px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.28.png\" alt=\"\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.28.png 642w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.28-300x51.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-17.52.28-500x86.png 500w\" sizes=\"auto, (max-width: 250px) 100vw, 250px\" \/><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\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<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u0434\u0430\u043b\u0435\u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0432 <code>filteredPhotos<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c API \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u0433\u043e\u0432 <code>tags<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>URL<\/code><\/mark><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <code>.onChange<\/code> \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 <code>searchText<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0412\u044b\u0434\u0435\u043b\u0435\u043d \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL <code>baseURL <\/code>\u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/mark><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 URL \u0434\u043b\u044f \u0442\u0435\u0433\u043e\u0432 t<code>ags<\/code>.<\/mark><\/span><\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u0433\u043e\u0432 <strong>Flickr<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430, \u0447\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/span><\/p>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfZRWemnauCsmqpuB5R8O5tVCXB27wl9YTU7878IPOAEO6fqlMyFqFD6qcsmDUmQ0kIPW-ccHt_zXG_GSXX4AcMSZL_qlopX0yPNkVW_3xCo_vbVBMYCaiRCG9x9y27TOdPiPZy8Q?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:454px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 <strong>Xcode<\/strong>. \u0418 \u043e\u043f\u044f\u0442\u044c, \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0444\u0430\u0439\u043b\u044b \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, <strong>Cursor AI<\/strong> \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Preview<\/mark><\/code> \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d. \u041f\u043e\u0438\u0441\u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043f\u043e \u0442\u0435\u0433\u0430\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code>, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">searchText<\/mark><\/code>&nbsp; \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 2.<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdgiMeRo39Ip8bnPuJO8KKRG6hQJUMSaleFUHrXdaPnYnys0yiH4EbxNtRcD--deUE1qTt1TCr-PHSZ_grdzFiXHPEFIiWKZ20Q2FBjK-ykrwXl74NMi5bIBaqBrqAlK4LvKGnqnw?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0435\u0442\u043a\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Grid<\/mark><\/code> \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0444\u043e\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">description<\/mark><\/code>. <\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 isLoading<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0431\u0435\u0440\u0435\u043c \u0438\u0437 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">PhotoDetailView<\/mark><\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <span style=\"font-weight: 400;\"><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">description<\/mark><\/code><\/span><\/span> <span style=\"font-weight: 400;\">\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">isLoading<\/mark><\/code> \u0438\u0437 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">FlickrViewModel<\/mark><\/code> \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">ContentView<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdfbVxoRvDXr6NQDXxj7LwPRQdSP-44pvcA8LQGor8Pk9MmODzhTHFle5Z_z_tK-t8-SyGdfZuMIzytMMlU7-CvTAFTrNrOo0lsC8T8uJ7GVtDvfIAEVCst8BCbrkeeEdRyefYS?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\">\u0423\u0431\u0435\u0440\u0438 &nbsp;<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Text(photo.description)<\/mark><\/code> \u0438\u0437 <code>PhotoDetailView<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 <code>isLoading<\/code> \u0438\u0437 <code>FlickrViewModel<\/code> \u0432 <code>ContentView<\/code><\/span><\/p>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u0432\u0430\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u0430 <code>View<\/code>. <br>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043c <code>PhotoDetailView<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u043e\u0442\u043e <code>description<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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 PhotoDetailView: View {\n\u00a0 \u00a0 let photo: FlickrPhoto\n\u00a0 \u00a0\n\u00a0 \u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 \u00a0 ScrollView {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0VStack(alignment: .leading, spacing: 16) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 AsyncImage(url: URL(string: photo.media.originalURL)) { image in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .resizable()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .aspectRatio(contentMode: .fit)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } placeholder: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(maxWidth: .infinity)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 VStack(alignment: .leading, spacing: 8) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(photo.title)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.title2)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .bold()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(&quot;By \\(photo.author)&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.subheadline)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .foregroundColor(.secondary)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(&quot;Taken on \\(photo.dateTaken)&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.subheadline)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .foregroundColor(.secondary)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 .navigationBarTitleDisplayMode(.inline)\n\u00a0 \u00a0 }\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: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PhotoDetailView<\/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\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> photo: FlickrPhoto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/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\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">AsyncImage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: photo.<\/span><span style=\"color: #E06C75\">media<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">originalURL<\/span><span style=\"color: #ABB2BF\">)) { image <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">aspectRatio<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">contentMode<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">fit<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(photo.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">bold<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;By <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">photo.<\/span><span style=\"color: #E06C75\">author<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Taken on <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">photo.<\/span><span style=\"color: #E06C75\">dateTaken<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043c <code>ContentView<\/code>, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439:<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"struct ContentView: View {\n\u00a0 @StateObject private var viewModel = FlickrViewModel()\n\u00a0\n\u00a0 let columns = [\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 150), spacing: 20)\n\u00a0 ]\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 NavigationStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ZStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ScrollView {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 LazyVGrid(columns: columns, spacing: 20) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ForEach(viewModel.filteredPhotos) { photo in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NavigationLink(destination: \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0            PhotoDetailView(photo: photo)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PhotoGridItem(photo: photo)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if viewModel.isLoading {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .scaleEffect(1.5)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(maxWidth: .infinity, \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0        maxHeight: .infinity)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.black.opacity(0.1))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .navigationTitle(&quot;Flickr Photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .searchable(text: $viewModel.searchText, \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                                 prompt: &quot;Search photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0.onChange(of: viewModel.searchText) { oldValue, newValue in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .alert(&quot;Error&quot;, isPresented: \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                .constant(viewModel.errorMessage != nil)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Button(&quot;OK&quot;) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.errorMessage = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } message: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(viewModel.errorMessage ?? &quot;&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 }\n\u00a0 }\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\">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\">\u00a0 <\/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\">FlickrViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> columns = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">150<\/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\">\u00a0 ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">NavigationStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ZStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">LazyVGrid<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">columns<\/span><span style=\"color: #ABB2BF\">: columns, <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">filteredPhotos<\/span><span style=\"color: #ABB2BF\">) { photo <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0            <\/span><span style=\"color: #61AFEF\">PhotoDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">PhotoGridItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">scaleEffect<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1.5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0        <\/span><span style=\"color: #61AFEF\">maxHeight<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Flickr Photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">searchable<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                                 <\/span><span style=\"color: #61AFEF\">prompt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Search photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0.<\/span><span style=\"color: #61AFEF\">onChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">) { oldValue, newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">alert<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                .<\/span><span style=\"color: #61AFEF\">constant<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;OK&quot;<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\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\"><span style=\"font-weight: 400;\">\u0423\u0434\u0430\u043b\u0435\u043d <code>Text<\/code> \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c <code>photo.description<\/code> \u0438\u0437 <code>PhotoDetailView <\/code><br>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 <code>ContentView<\/code> \u0437\u0430 \u0441\u0447\u0435\u0442:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 <code>ZStack<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0433\u043e \u0444\u043e\u043d\u0430<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0411\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>scaleEffect<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0432 <code>View<\/code><\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043b\u0443\u0447\u0448\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439.<\/span><\/p>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfZRWemnauCsmqpuB5R8O5tVCXB27wl9YTU7878IPOAEO6fqlMyFqFD6qcsmDUmQ0kIPW-ccHt_zXG_GSXX4AcMSZL_qlopX0yPNkVW_3xCo_vbVBMYCaiRCG9x9y27TOdPiPZy8Q?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:498px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412<strong> Xcode<\/strong> \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Preview<\/mark><\/code> \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d:<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 3.<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeqOpOcgEJ8coZg199h4jl-Kr-5ZjLTNOdMdSvDd3ak66BjALGsMcJWMMN_gV6e0RIm8j3vKp-vWA_7v5RwOLAmELA9PDkE_jiaj5eQ_IHSuSQnmGTlC_pN5Dky7xoL9PudpVdymA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u0438\u0441\u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043f\u043e \u0442\u0435\u0433\u0430\u043c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code>, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">searchText<\/mark><\/code>&nbsp; \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0432\u0438\u0434\u0435\u043d \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438 \u0438\u0441\u0447\u0435\u0437\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color has-black-color\">description<\/mark><\/code> \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">PhotoDetailView<\/mark><\/code>. <br>\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0435\u0442\u043a\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Grid<\/mark><\/code> \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0451 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u043a\u0438 LazyVGrid<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 <strong>Cursor AI<\/strong>. \u042f \u043f\u0440\u043e\u0448\u0443 \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c UI \u0438 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e screenshot \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f,<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXf_Gy8fpP3Ns4zgElYgSoBIjjGuA6TM4uJ4puC8zG8jKGBjvhtMUtnqT3DqIYsvHg_XR4GbdiJ32bHerVmszAgn7gduZ8mn-ctIBf71QZiZTv9sNA9rhBDleXtpPu4Hrw991dvL?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\"><code>LazyVGrid<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e. \u0421\u043e\u0437\u0434\u0430\u0439 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 UI <\/span><\/p>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043c\u0430\u043a\u0435\u0442 <code>LazyVGrid<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0412\u043e\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 <code>ContentView<\/code> \u0441 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c \u0441\u0435\u0442\u043a\u0438:<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"struct ContentView: View {\n\u00a0 @StateObject private var viewModel = FlickrViewModel()\n\u00a0\n\u00a0 \/\/ Using 2 columns with fixed size for better proportions\n\u00a0 let columns = [\n\u00a0 \u00a0 \u00a0 GridItem(.flexible(), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.flexible(), spacing: 1)\n\u00a0 ]\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 NavigationStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ZStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Color.black.opacity(0.1) \/\/ Background color for grid\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ScrollView {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 LazyVGrid(columns: columns, spacing: 1) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ForEach(viewModel.filteredPhotos) { photo in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NavigationLink(destination:  \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0   PhotoDetailView(photo: photo)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PhotoGridItem(photo: photo)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0.aspectRatio(1, contentMode: .fill) \/\/ Square aspect ratio\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if viewModel.isLoading {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .scaleEffect(1.5)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(maxWidth: .infinity, maxHeight: .infinity)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.black.opacity(0.1))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .navigationTitle(&quot;Flickr Photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .searchable(text: $viewModel.searchText, \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0             prompt: &quot;Search photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .onChange(of: viewModel.searchText) { oldValue, newValue in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .alert(&quot;Error&quot;, isPresented: \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                   .constant(viewModel.errorMessage != nil)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Button(&quot;OK&quot;) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.errorMessage = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } message: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(viewModel.errorMessage ?? &quot;&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 }\n\u00a0 }\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\">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\">\u00a0 <\/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\">FlickrViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Using 2 columns with fixed size for better proportions<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> columns = [<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">flexible<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">flexible<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">NavigationStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ZStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Background color for grid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">LazyVGrid<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">columns<\/span><span style=\"color: #ABB2BF\">: columns, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">filteredPhotos<\/span><span style=\"color: #ABB2BF\">) { photo <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0   <\/span><span style=\"color: #61AFEF\">PhotoDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">PhotoGridItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0.<\/span><span style=\"color: #61AFEF\">aspectRatio<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">contentMode<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">fill<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Square aspect ratio<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">scaleEffect<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1.5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">maxHeight<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Flickr Photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">searchable<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0             <\/span><span style=\"color: #61AFEF\">prompt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Search photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">onChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">) { oldValue, newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">alert<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                   .<\/span><span style=\"color: #61AFEF\">constant<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;OK&quot;<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/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 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043c <code>PhotoGridItem<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u0442\u0438\u043b\u044e \u0441\u0435\u0442\u043a\u0438:<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"import SwiftUI\n\nstruct PhotoGridItem: View {\n\u00a0 let photo: FlickrPhoto\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 AsyncImage(url: URL(string: photo.media.m)) { image in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .resizable()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .aspectRatio(contentMode: .fill)\n\u00a0 \u00a0 \u00a0 } placeholder: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(minHeight: 100)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.gray.opacity(0.1))\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .clipped()\n\u00a0 \u00a0 \u00a0 .contentShape(Rectangle())\n\u00a0 }\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: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PhotoGridItem<\/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\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> photo: FlickrPhoto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">AsyncImage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: photo.<\/span><span style=\"color: #E06C75\">media<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">m<\/span><span style=\"color: #ABB2BF\">)) { image <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">aspectRatio<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">contentMode<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">fill<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minHeight<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">clipped<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">contentShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Rectangle<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/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>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d \u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443 \u0438\u0437 2 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0435\u0442\u043a\u0438<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043e 1 point&nbsp; \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423\u043f\u0440\u043e\u0449\u0435\u043d PhotoGridItem \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0435\u0442\u043a\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423\u043b\u0443\u0447\u0448\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 Instagram \u043c\u0430\u043a\u0435\u0442 \u0441\u0435\u0442\u043a\u0438, \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439. \u0424\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0438\u0434.<\/span><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfZRWemnauCsmqpuB5R8O5tVCXB27wl9YTU7878IPOAEO6fqlMyFqFD6qcsmDUmQ0kIPW-ccHt_zXG_GSXX4AcMSZL_qlopX0yPNkVW_3xCo_vbVBMYCaiRCG9x9y27TOdPiPZy8Q?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:518px;height:auto\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 4.<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcoUQOI2QyPNzElXGB1_tIWPmVcYtxVt1f_GMn41jibM6UsRZqy-De1BDeeT4Zv8gnIGlWCThkCiQVPqoslYjm4cMpP8JxGBXuf3Q8FhXdgbO75IrxkAsadQ67BqUCVZ5FvmLQd?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 \u0441\u0435\u0442\u043a\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Grid<\/mark><\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u201c\u043d\u0430\u0435\u0437\u0436\u0430\u044e\u0442\u201d \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">.aspectRatio(contentMode: .fill),<\/mark><\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u0441\u0435\u0442\u043a\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGrid<\/mark><\/code> \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. <\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c .scaledToFill()<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0435\u0451 \u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">.scaledToFill()<\/mark><\/code>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdl1auZRmZ8_mm45Em8zH4gLZpe_9Bsl6TFC7fIitOuav5mwJdOebc6ay-Lae0ZqHINj1tbOspVmcNazZDJzqMksPW4BaXtsIRG8SHB0eS1RPt48t_-uCPY-mAkM7KJhjnIxwPl?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\">\u0412 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGri<\/mark><\/code>d \u0438\u043f\u043e\u043b\u044c\u0437\u0443\u0439 <code>.scaledToFill()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>.aspectRatio<\/code><\/span><\/p>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043e\u0431\u043d\u043e\u0432\u043b\u044e \u043e\u0431\u0430 \u0444\u0430\u0439\u043b\u0430 <code>PhotoGridItem<\/code> \u0438 &nbsp;<code>ContentView<\/code> , \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c .<code>scaledToFill() <\/code>\u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439:<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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 PhotoGridItem: View {\n\u00a0 let photo: FlickrPhoto\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 AsyncImage(url: URL(string: photo.media.m)) { image in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .resizable()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .scaledToFill()\n\u00a0 \u00a0 \u00a0 } placeholder: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(minHeight: 100)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.gray.opacity(0.1))\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .clipped()\n\u00a0 \u00a0 \u00a0 .contentShape(Rectangle())\n\u00a0 }\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: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PhotoGridItem<\/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\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> photo: FlickrPhoto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">AsyncImage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: photo.<\/span><span style=\"color: #E06C75\">media<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">m<\/span><span style=\"color: #ABB2BF\">)) { image <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">scaledToFill<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minHeight<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">clipped<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">contentShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Rectangle<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"struct ContentView: View {\n\u00a0 @StateObject private var viewModel = FlickrViewModel()\n\u00a0\n\u00a0 let columns = [\n\u00a0 \u00a0 \u00a0 GridItem(.flexible(), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.flexible(), spacing: 1)\n\u00a0 ]\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 NavigationStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ZStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Color.black.opacity(0.1)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ScrollView {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0LazyVGrid(columns: columns, spacing: 1) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ForEach(viewModel.filteredPhotos) { photo in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NavigationLink(destination:  \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0        PhotoDetailView(photo: photo)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PhotoGridItem(photo: photo)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(height: UIScreen.main.bounds.width \/ 2) \/\/ Make height equal to half screen width\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .clipped()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if viewModel.isLoading {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .scaleEffect(1.5)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(maxWidth: .infinity, maxHeight: .infinity)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.black.opacity(0.1))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .navigationTitle(&quot;Flickr Photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .searchable(text: $viewModel.searchText, prompt: &quot;Search photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .onChange(of: viewModel.searchText) { oldValue, newValue in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .alert(&quot;Error&quot;, isPresented: .constant(viewModel.errorMessage != nil)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Button(&quot;OK&quot;) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.errorMessage = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } message: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(viewModel.errorMessage ?? &quot;&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 }\n\u00a0 }\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\">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\">\u00a0 <\/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\">FlickrViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> columns = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">flexible<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">flexible<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">NavigationStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ZStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><span style=\"color: #61AFEF\">LazyVGrid<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">columns<\/span><span style=\"color: #ABB2BF\">: columns, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">filteredPhotos<\/span><span style=\"color: #ABB2BF\">) { photo <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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 cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0        <\/span><span style=\"color: #61AFEF\">PhotoDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">PhotoGridItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: UIScreen.<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">bounds<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">width<\/span><span style=\"color: #ABB2BF\"> \/ <\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Make height equal to half screen width<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">clipped<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">scaleEffect<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1.5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">maxHeight<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Flickr Photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">searchable<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">prompt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Search photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">onChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">) { oldValue, newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">alert<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #61AFEF\">constant<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;OK&quot;<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/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>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0417\u0430\u043c\u0435\u043d\u0435\u043d\u043e <code>.aspectRatio<\/code> \u043d\u0430 <code>.scaledToFill()<\/code> \u0432 <code>PhotoGridItem<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u200b\u200b\u044f\u0432\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 <code>height<\/code> \u0432 <code>frame<\/code> \u0432 <code>ContentView<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0448\u0438\u0440\u0438\u043d\u044b \u044d\u043a\u0440\u0430\u043d\u0430 <code>screenWidth<\/code> \u0434\u043b\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e <code>.clipped()<\/code>, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423\u0434\u0430\u043b\u0435\u043d\u043e <code>.aspectRatio(1, contentMode: .fit) <\/code>\u0438\u0437 <code>NavigationLink<\/code><\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0435\u0442\u043a\u0443, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 Instagram, \u0433\u0434\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d, \u0430 \u043b\u044e\u0431\u044b\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f.<\/span><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXduhoVdXbus2ynGEyU1_u7EmUyexVZhN7X2LF54MCT6O4WwYMyGYFkoc2SNpnwLNACbfi_1VXJByI8GKT7B4xqfSkAIrbqR88VngpM-uwx0Xs-FDwdSCnBSc33SrKC-8Coky_AzOg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:427px;height:auto\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 5.<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe115L62fuYCDzoh6w1m0orXYLNgqrzKda4tE61HqNk8r52tJ984BKTqd6vpaSlRymCfrHL0Cu-7G-9HtGt8-ZcQCV0i_uRygGQ6U2m66SektTG4iTTPq0ZErP0qJzzefwr1SV3Dg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0438\u043a\u0442\u043e \u043d\u0438 \u043d\u0430 \u043a\u043e\u0433\u043e \u043d\u0435 \u043d\u0430\u0435\u0437\u0436\u0430\u0435\u0442, \u043d\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b &#8212; \u043e\u0434\u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435. \u042f \u0445\u043e\u0442\u0435\u043b\u0430 \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0432\u0441\u0435 \u0431\u044b\u043b\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <strong>108 \u0445 108<\/strong> \u0438 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGrid<\/mark><\/code>, a \u043d\u0435 \u0434\u0432\u0430.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c 3 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432 LazyVGrid<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0441\u0438\u043c \u043e\u0431 \u044d\u0442\u043e\u043c <strong>Cursor AI<\/strong>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXemXyxp1TWE-nT_T6lX8jGQ-0_6DiC3csIxwnOB_UTmW9MVgL2-w8bdmebfztp4xIK5pRKbGfRG9gowol1qXYAuM2okeyiPl0VKigokJ5e5fG0YAlW8E31tkbLU-leMf91kdp-HdQ?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 3 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432  \u00a0<code style=\"font-weight: 400;\"><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGrid<\/mark><\/code> \u0438 <code>frame(width: 108, height : 108)<\/code> \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 <code style=\"font-weight: 400;\">PhotoGridView<\/code><\/p>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043e\u0431\u043d\u043e\u0432\u043b\u044e \u043e\u0431\u0430 \u0444\u0430\u0439\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 3 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <strong>108&#215;108<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"struct ContentView: View {\n\u00a0 @StateObject private var viewModel = FlickrViewModel()\n\u00a0\n\u00a0 let columns = [\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 108), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 108), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 108), spacing: 1)\n\u00a0 ]\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 NavigationStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ZStack {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Color.black.opacity(0.1)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ScrollView {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 LazyVGrid(columns: columns, spacing: 1) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ForEach(viewModel.filteredPhotos) { photo in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 NavigationLink(destination:   \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0          PhotoDetailView(photo: photo)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PhotoGridItem(photo: photo)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if viewModel.isLoading {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .scaleEffect(1.5)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(maxWidth: .infinity,\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0        maxHeight: .infinity)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.black.opacity(0.1))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .navigationTitle(&quot;Flickr Photos&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .searchable(text: $viewModel.searchText, \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                               prompt: &quot;Search photos&quot;)\n\u00a0 \u00a0 \u00a0 .onChange(of: viewModel.searchText) { oldValue, newValue in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .alert(&quot;Error&quot;, isPresented: \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                 .constant(viewModel.errorMessage != nil)) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Button(&quot;OK&quot;) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.errorMessage = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } message: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(viewModel.errorMessage ?? &quot;&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .task {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 await viewModel.fetchPhotos()\n\u00a0 \u00a0 \u00a0 }\n\u00a0 }\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\">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\">\u00a0 <\/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\">FlickrViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> columns = [<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">NavigationStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ZStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">LazyVGrid<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">columns<\/span><span style=\"color: #ABB2BF\">: columns, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">filteredPhotos<\/span><span style=\"color: #ABB2BF\">) { photo <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0          <\/span><span style=\"color: #61AFEF\">PhotoDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">PhotoGridItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isLoading {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">scaleEffect<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1.5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0        <\/span><span style=\"color: #61AFEF\">maxHeight<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Flickr Photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">searchable<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                               <\/span><span style=\"color: #61AFEF\">prompt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Search photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">onChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">) { oldValue, newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">alert<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0                 .<\/span><span style=\"color: #61AFEF\">constant<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;OK&quot;<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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 PhotoGridItem: View {\n\u00a0 let photo: FlickrPhoto\n\u00a0\n\u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 AsyncImage(url: URL(string: photo.media.m)) { image in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .resizable()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .scaledToFill()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(width: 108, height: 108)\n\u00a0 \u00a0 \u00a0 } placeholder: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(width: 108, height: 108)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(Color.gray.opacity(0.1))\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 .clipped()\n\u00a0 \u00a0 \u00a0 .contentShape(Rectangle())\n\u00a0 }\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: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PhotoGridItem<\/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\">\u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> photo: FlickrPhoto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">AsyncImage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: photo.<\/span><span style=\"color: #E06C75\">media<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">m<\/span><span style=\"color: #ABB2BF\">)) { image <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">scaledToFill<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">gray<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">clipped<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">contentShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Rectangle<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/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>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0430\u043c\u043a\u0438 <code>PhotoGridItem<\/code> \u0434\u043e <strong>108&#215;108<\/strong><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0430 \u0441\u0435\u0442\u043a\u0430 <code>LazyVGrid<\/code>, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 3 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 <code>.adaptive(minimum: 108)<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0442\u0440\u0435\u0442\u0438\u0439 <code>GridItem<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 <code>columns<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 1 point \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443 \u0441 3 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438 <code>columns<\/code> \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 \u043c\u0430\u043a\u0435\u0442 \u0441\u0435\u0442\u043a\u0438 Instagram.<\/span><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXduhoVdXbus2ynGEyU1_u7EmUyexVZhN7X2LF54MCT6O4WwYMyGYFkoc2SNpnwLNACbfi_1VXJByI8GKT7B4xqfSkAIrbqR88VngpM-uwx0Xs-FDwdSCnBSc33SrKC-8Coky_AzOg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:450px;height:auto\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 6<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXePUoLEFKOtrN-_a7E4nxclHp4TKhKhDcn3fmvh4lvPgAZ2cDiypVeZgXtESnFhbRGWBRw8oaZ0w1cEoYjIwV30Ji4MwZi9FNOFncOmwvFkgJTVD2qGL4X7V0jyzgXJGm0b1p6ryw?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0443, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u043e\u0442 \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">columns<\/mark><\/code> \u0441\u0435\u0442\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGrid<\/mark><\/code> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0411\u044b\u043b\u043e<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"let columns = [\n\u00a0 \u00a0 \u00a0 GridItem(.flexible(), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.flexible(), spacing: 1)\n\u00a0 ]\" 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\"> columns = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">flexible<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">flexible<\/span><span style=\"color: #ABB2BF\">(), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 ]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0421\u0442\u0430\u043b\u043e<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"let columns = [\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 108), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 108), spacing: 1),\n\u00a0 \u00a0 \u00a0 GridItem(.adaptive(minimum: 108), spacing: 1)\n\u00a0 ]\" 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\"> columns = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 ]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u044d\u0433\u0438 tags \u0432 PhotoDetailView<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u044d\u0433\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">tags<\/mark><\/code> \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">PhotoDetailView<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXew62a-14Xi_VwjhDPiXgGtTwZ3aIPxQMOOcr2odQ5QdR_h1TwVgAAKD5sD4geCRDcmIFwaJB3Vmk1JxLAJ_1bk5PyH9xO1dYaDhw_zdboLiGyTA3--JI74S4PeSe9reS-2YzAKMg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u044c \u00a0<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">Text(\"Tags: \\(photo.tags)\")<\/mark><\/code> \u0432 <code>PhotoDetailView<\/code> <\/span><\/p>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">PhotoDetailView<\/mark><\/code>, \u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u0433\u0430\u0445:<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"import SwiftUI\n\nstruct PhotoDetailView: View {\n\u00a0 \u00a0 let photo: FlickrPhoto\n\u00a0 \u00a0\n\u00a0 \u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 \u00a0ScrollView {\n\u00a0 \u00a0 \u00a0 \u00a0 VStack(alignment: .leading, spacing: 16) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0AsyncImage(url: URL(string: photo.media.originalURL)) { image in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .resizable()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .aspectRatio(contentMode: .fit)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } placeholder: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ProgressView()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(maxWidth: .infinity)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 VStack(alignment: .leading, spacing: 8) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(photo.title)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.title2)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .bold()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(&quot;By \\(photo.author)&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.subheadline)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .foregroundColor(.secondary)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(&quot;Taken on \\(photo.dateTaken)&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.subheadline)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .foregroundColor(.secondary)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if !photo.tags.isEmpty {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(&quot;Tags: \\(photo.tags)&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.subheadline)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .foregroundColor(.secondary)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 .navigationBarTitleDisplayMode(.inline)\n\u00a0 \u00a0 }\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: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PhotoDetailView<\/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\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> photo: FlickrPhoto<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><span style=\"color: #61AFEF\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/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\">16<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><span style=\"color: #61AFEF\">AsyncImage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">url<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">URL<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">string<\/span><span style=\"color: #ABB2BF\">: photo.<\/span><span style=\"color: #E06C75\">media<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">originalURL<\/span><span style=\"color: #ABB2BF\">)) { image <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 image<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">aspectRatio<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">contentMode<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">fit<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">placeholder<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ProgressView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">8<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(photo.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">bold<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;By <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">photo.<\/span><span style=\"color: #E06C75\">author<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Taken on <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">photo.<\/span><span style=\"color: #E06C75\">dateTaken<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !photo.tags.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Tags: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">photo.<\/span><span style=\"color: #E06C75\">tags<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/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\">\u00a0 \u00a0 }<\/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>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 <code>Text<\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u0433\u043e\u0432 <code>photo.tags<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0442\u043e\u0442 \u0436\u0435 \u0441\u0442\u0438\u043b\u044c, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (\u0448\u0440\u0438\u0444\u0442 <code>.subheadline <\/code>\u0438&nbsp; \u0446\u0432\u0435\u0442<code> .secondary<\/code>)<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u0433\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 <code>photo.tags <\/code>\u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438 \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">PhotoDetailView<\/mark><\/code>, \u0434\u043b\u044f <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">image<\/mark><\/code> \u0432\u043d\u0443\u0442\u0440\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">AsyncImage<\/mark><\/code> \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0438\u043c &nbsp;<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">.aspectRatio(contentMode: .fit) <\/mark><\/code>\u043d\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">.aspectRatio(contentMode: .fill)<\/mark><\/code>, \u0432\u0435\u0434\u044c Cursor AI &#8212; \u044d\u0442\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u0442\u0430\u043c.<\/span><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXduhoVdXbus2ynGEyU1_u7EmUyexVZhN7X2LF54MCT6O4WwYMyGYFkoc2SNpnwLNACbfi_1VXJByI8GKT7B4xqfSkAIrbqR88VngpM-uwx0Xs-FDwdSCnBSc33SrKC-8Coky_AzOg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:422px;height:auto\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f 7<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdRgrymun--ODr-2k5vXPv7UTio4OjYRswW2F3xQQilDMq4UrU8l0q8-BbvXKmxibfxzWF24gFtz50ivWs-4Z_8-4D7Zpurj0aBqHrWzKDJABjKepXBBz7mKY8nDHuyg9PUqeI2?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043f\u0440\u0438 \u0431\u043e\u043b\u0435\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">ContentView<\/mark><\/code>, \u043c\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">LazyVGrid<\/mark><\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">filteredPhotos<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfrRPbstxL6_IEju7MinQfUPZBbEl0MyrCkIMz3JDOgqht1muTT_SuCGzukVvr36M3na69uxUrb3R20AYDok0FVk4OeLPLMNPM_jtYJ3PW1uTByUwrzRpLSj5fr9rsH2sB9QmIn?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2026&nbsp; \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">FlickrViewModel<\/mark><\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe4YZ2T3AonU1idfLhUuz2vF7Pre6pktVtaoqT35cj7Ea7O1Yi9xHqZyl9kWEFzvx53ZHnGjvK76zYL_IZG2tzakEaR_tOgoPw713hqupcrTmEmDrtgOVBF5lwvGRs-3CaZK3VfWA?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 filteredPhotos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 &#8212; \u201c\u043f\u0430\u0440\u0430\u0437\u0438\u0442\u201d <span style=\"font-weight: 400;\"><code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">filteredPhotos<\/mark><\/code><\/span><\/span> <span style=\"font-weight: 400;\">\u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0412\u0435\u0440\u0441\u0438\u0438 1, \u043a\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 <strong>Flickr.com<\/strong> \u043c\u0430\u0441\u0441\u0438\u0432 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">searchText<\/mark><\/code>. \u041c\u044b \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0432 API \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0430\u043b\u0430, \u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">filteredPhotos<\/mark><\/code> \u043e\u0441\u0442\u0430\u043b\u0441\u044f. \u041e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043c\u044b \u043e\u0442 \u043d\u0435\u0433\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f, \u043d\u043e \u043d\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e , a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Composer Cursor AI<\/strong>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd8h1SheG-88EvGtaUqTk1GNIIzeSmI23XNUxqm4yDZxdqpixAVyLMETfYygB3XDjEOl5lQy6oIjvV-L_OVQ_HtkjSlw-lETxoPn7nZwdC33PfLF3oyd1bo0wH3tFYmPk4Bp-dv1A?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\"><span style=\"font-weight: 400;\"><strong><em> <\/em><\/strong><\/span><img loading=\"lazy\" decoding=\"async\" width=\"41\" height=\"39\" class=\"wp-image-16237\" style=\"width: 41px;\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-30-at-16.54.50-1.png\" alt=\"\"><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u00a0<code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">viewModel.photos<\/mark><\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>filteredPhotos<\/code>  \u0432 <code>LazyVGrid<\/code> \u0438 \u0443\u0431\u0435\u0440\u0438  <code>filteredPhotos<\/code>  \u0438\u0437 <code>ViewModel<\/code><\/span><\/p>\n\n\n\n<div class=\"wp-block-group has-light-gray-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u0432\u0430\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0430 \u0444\u0430\u0439\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">filteredPhotos<\/mark><\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">photos<\/mark><\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:<\/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-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"@MainActor\nclass FlickrViewModel: ObservableObject {\n\u00a0 @Published var photos: [FlickrPhoto] = []\n\u00a0 @Published var searchText = &quot;&quot;\n\u00a0 @Published var isLoading = false\n\u00a0 @Published var errorMessage: String?\n\u00a0\n\u00a0 private let baseURL = &quot;https:\/\/api.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1&quot;\n\u00a0\n\u00a0 func fetchPhotos() async {\n\u00a0 \u00a0 \u00a0 isLoading = true\n\u00a0 \u00a0 \u00a0 errorMessage = nil\n\u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 do {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var urlString = baseURL\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if !searchText.isEmpty {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let tags = searchText\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .components(separatedBy: &quot; &quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .filter { !$0.isEmpty }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .joined(separator: &quot;,&quot;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if let encodedTags = tags.addingPercentEncoding(\u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0withAllowedCharacters: .urlQueryAllowed) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 urlString += &quot;&amp;tags=\\(encodedTags)&quot;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 guard let url = URL(string: urlString) else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 throw URLError(.badURL)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let (data, _) = try await URLSession.shared.data(from: url)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let result = try \n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0        JSONDecoder().decode(FlickrFeedResult.self, from: data)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 photos = result.items\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isLoading = false\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } catch {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 errorMessage = error.localizedDescription\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isLoading = false\n\u00a0 \u00a0 \u00a0 }\n\u00a0 }\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\">FlickrViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> photos: [FlickrPhoto] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> searchText = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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\">\u00a0 <\/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\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/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.flickr.com\/services\/feeds\/photos_public.gne?format=json&amp;nojsoncallback=1&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchPhotos<\/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\">\u00a0 \u00a0 \u00a0 isLoading = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 errorMessage = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">do<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> urlString = baseURL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !searchText.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> tags = searchText<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">components<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">separatedBy<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #56B6C2\">filter<\/span><span style=\"color: #ABB2BF\"> { !<\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\">.isEmpty }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #56B6C2\">joined<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">separator<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> encodedTags = tags.<\/span><span style=\"color: #61AFEF\">addingPercentEncoding<\/span><span style=\"color: #ABB2BF\">(\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"color: #61AFEF\">withAllowedCharacters<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">urlQueryAllowed<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 urlString += <\/span><span style=\"color: #98C379\">&quot;&amp;tags=<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">encodedTags<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">throw<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">URLError<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">badURL<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> result = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0        <\/span><span style=\"color: #61AFEF\">JSONDecoder<\/span><span style=\"color: #ABB2BF\">().<\/span><span style=\"color: #56B6C2\">decode<\/span><span style=\"color: #ABB2BF\">(FlickrFeedResult.<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 photos = result.<\/span><span style=\"color: #E06C75\">items<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 errorMessage = error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isLoading = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-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=\"struct ContentView: View {\n   @StateObject private var viewModel = FlickrViewModel()\n  \n   let columns = [\n       GridItem(.adaptive(minimum: 108), spacing: 1),\n       GridItem(.adaptive(minimum: 108), spacing: 1),\n       GridItem(.adaptive(minimum: 108), spacing: 1)\n   ]\n  \n   var body: some View {\n       NavigationStack {\n           ZStack {\n               Color.black.opacity(0.1)\n              \n               ScrollView {\n                   LazyVGrid(columns: columns, spacing: 1) {\n                       ForEach(viewModel.photos) { photo in\n                           NavigationLink(destination: \n                                 PhotoDetailView(photo: photo)) {\n                               PhotoGridItem(photo: photo)\n                           }\n                       }\n                   }\n               }\n              \n               if viewModel.isLoading {\n                   ProgressView()\n                       .scaleEffect(1.5)\n                       .frame(maxWidth: .infinity, maxHeight: .infinity)\n                       .background(Color.black.opacity(0.1))\n               }\n           }\n           .navigationTitle(&quot;Flickr Photos&quot;)\n           .searchable(text: $viewModel.searchText, prompt: &quot;Search photos&quot;)\n      .onChange(of: viewModel.searchText) { oldValue, newValue in\n               Task {\n                   await viewModel.fetchPhotos()\n               }\n           }\n           .alert(&quot;Error&quot;, isPresented: .constant(viewModel.errorMessage != nil)) {\n               Button(&quot;OK&quot;) {\n                   viewModel.errorMessage = nil\n               }\n           } message: {\n               Text(viewModel.errorMessage ?? &quot;&quot;)\n           }\n       }\n       .task {\n           await viewModel.fetchPhotos()\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\">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\">FlickrViewModel<\/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\"> columns = [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #61AFEF\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/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\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/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\">GridItem<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">adaptive<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">minimum<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">108<\/span><span style=\"color: #ABB2BF\">), <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/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\">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\">NavigationStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #61AFEF\">ZStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/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\">ScrollView<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   <\/span><span style=\"color: #61AFEF\">LazyVGrid<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">columns<\/span><span style=\"color: #ABB2BF\">: columns, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                       <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">photos<\/span><span style=\"color: #ABB2BF\">) { photo <\/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\">PhotoDetailView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                               <\/span><span style=\"color: #61AFEF\">PhotoGridItem<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">photo<\/span><span style=\"color: #ABB2BF\">: photo)<\/span><\/span>\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: #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>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                       .<\/span><span style=\"color: #61AFEF\">scaleEffect<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">1.5<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                       .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">maxWidth<\/span><span style=\"color: #ABB2BF\">: .infinity, <\/span><span style=\"color: #61AFEF\">maxHeight<\/span><span style=\"color: #ABB2BF\">: .infinity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                       .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">opacity<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">0.1<\/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\">navigationTitle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Flickr Photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           .<\/span><span style=\"color: #61AFEF\">searchable<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">prompt<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Search photos&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      .<\/span><span style=\"color: #61AFEF\">onChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">of<\/span><span style=\"color: #ABB2BF\">: viewModel.<\/span><span style=\"color: #E06C75\">searchText<\/span><span style=\"color: #ABB2BF\">) { oldValue, newValue <\/span><span style=\"color: #C678DD\">in<\/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\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/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\">alert<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #61AFEF\">constant<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;OK&quot;<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                   viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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: #61AFEF\">message<\/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\">(viewModel.<\/span><span style=\"color: #E06C75\">errorMessage<\/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>\n<span class=\"line\"><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\">await<\/span><span style=\"color: #ABB2BF\"> viewModel.<\/span><span style=\"color: #61AFEF\">fetchPhotos<\/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><\/code><\/pre><\/div>\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<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u0434\u0430\u043b\u0435\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">filteredPhotos<\/mark><\/code> \u0438\u0437 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">ViewModel<\/mark><\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f API<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d <code>ForEach(viewModel.filteredPhotos) <\/code>\u043d\u0430 <code>ForEach(viewModel.photos)<\/code> \u0432 <code>ContentView<\/code><\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0435\u0436\u043d\u0438\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u0433\u043e\u0432<\/span><\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442, \u043e\u043f\u044f\u0442\u044c \u043a\u043b\u0438\u043a\u0430\u0435\u043c <strong>Accept All<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXduhoVdXbus2ynGEyU1_u7EmUyexVZhN7X2LF54MCT6O4WwYMyGYFkoc2SNpnwLNACbfi_1VXJByI8GKT7B4xqfSkAIrbqR88VngpM-uwx0Xs-FDwdSCnBSc33SrKC-8Coky_AzOg?key=edBqZqn7yehD8oQ2p_qxy-Ie\" alt=\"\" style=\"width:401px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0435\u0440\u0441\u0438\u044f 8 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u0438 \u0432\u0435\u0440\u0441\u0438\u044f 7. <br>\u041d\u043e \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0432\u043e\u0436\u0438\u0442 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u201cRose\u201d, \u201cSunrise\u201d, \u201cOcean\u201d \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 <code>searchText<\/code> \u043f\u0435\u0447\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 (\u0431\u0443\u043a\u0432\u044b) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 <strong>Flickr.com<\/strong>, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u043c\u0443 \u043c\u0435\u043b\u044c\u043a\u0430\u043d\u0438\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 iPhone. <br>\u0421 \u044d\u0442\u0438\u043c \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <strong>PhotomaniaCursor<\/strong> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>Cursor AI <\/strong>\u0441\u043c\u043e\u0442\u0440\u0438 \u0432 \u043f\u043e\u0441\u0442\u0435 <a href=\"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-\u0432-ios-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u0444\u043e\u0442\u043e-\u0441-flickr-com-\u0447\/\" title=\"\">&#171;Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u0424\u043e\u0442\u043e \u0441 Flickr.com&#187;. \u0427\u0430\u0441\u0442\u044c 2.&#187;<\/a>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <strong>PhotomaniaCursor<\/strong> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/BestKora\/PhotomaniaCursor\" title=\"\">Github.com<\/a>. <\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS &hellip; <a href=\"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/\">\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":[60,114,14,54,108],"tags":[115,31,56,116],"class_list":["post-16222","post","type-post","status-publish","format-standard","hentry","category-combine","category-cursor-ai","category-swift","category-swiftui","category-108","tag-cursor-ai","tag-swift","tag-swiftui","tag-116"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:\" \/>\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=\"xcode,cursor ai + xcode,ios application,swift,\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439,flickr photos\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/\" \/>\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=\"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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=\"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2024-11-28T18:06:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2024-12-03T08:37:15+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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=\"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:\" \/>\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\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#article\",\"name\":\"Cursor AI \\u0432 iOS \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435. \\u041f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u00ab\\u0424\\u043e\\u0442\\u043e \\u0441 Flickr.com\\u00bb. \\u0427\\u0430\\u0441\\u0442\\u044c 1. | \\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\":\"Cursor AI \\u0432 iOS \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435. \\u041f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 &#171;\\u0424\\u043e\\u0442\\u043e \\u0441 Flickr.com&#187;. \\u0427\\u0430\\u0441\\u0442\\u044c 1.\",\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Screenshot-2024-11-28-at-20.31.31.png\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#articleImage\",\"width\":1712,\"height\":660},\"datePublished\":\"2024-11-28T18:06:03+00:00\",\"dateModified\":\"2024-12-03T08:37:15+00:00\",\"inLanguage\":\"ru-RU\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#webpage\"},\"articleSection\":\"Combine, Cursor AI, Swift, SwiftUI, \\u0418\\u0418 \\u0430\\u043b\\u0433\\u043e\\u0440\\u0438\\u0442\\u043c\\u044b, Cursor AI, Swift, SwiftUI, \\u0418\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439 \\u0438\\u043d\\u0442\\u0435\\u043b\\u043b\\u0435\\u043a\\u0442\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#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\\\/swift\\\/#listItem\",\"name\":\"Swift\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"position\":2,\"name\":\"Swift\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#listItem\",\"name\":\"Cursor AI \\u0432 iOS \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435. \\u041f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 &#171;\\u0424\\u043e\\u0442\\u043e \\u0441 Flickr.com&#187;. \\u0427\\u0430\\u0441\\u0442\\u044c 1.\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#listItem\",\"position\":3,\"name\":\"Cursor AI \\u0432 iOS \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435. \\u041f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 &#171;\\u0424\\u043e\\u0442\\u043e \\u0441 Flickr.com&#187;. \\u0427\\u0430\\u0441\\u0442\\u044c 1.\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"name\":\"Swift\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#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\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#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\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#webpage\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/\",\"name\":\"Cursor AI \\u0432 iOS \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435. \\u041f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u00ab\\u0424\\u043e\\u0442\\u043e \\u0441 Flickr.com\\u00bb. \\u0427\\u0430\\u0441\\u0442\\u044c 1. | \\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\":\"\\u041c\\u043d\\u0435 \\u0445\\u043e\\u0442\\u0435\\u043b\\u043e\\u0441\\u044c \\u043f\\u043e\\u0441\\u043c\\u043e\\u0442\\u0440\\u0435\\u0442\\u044c, \\u043a\\u0430\\u043a \\u0440\\u0430\\u0431\\u043e\\u0442\\u0430\\u0435\\u0442 \\u0418\\u0418 \\u0420\\u0435\\u0434\\u0430\\u043a\\u0442\\u043e\\u0440 \\u043a\\u043e\\u0434\\u0430 Cursor AI \\u043d\\u0430 \\u043f\\u0440\\u0438\\u043c\\u0435\\u0440\\u0435 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u044f iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u0441 \\u0432\\u044b\\u0431\\u043e\\u0440\\u043a\\u043e\\u0439 \\u0434\\u0430\\u043d\\u043d\\u044b\\u0445 \\u0441 \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u0430, \\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0439 \\u043d\\u0435 \\u0442\\u0440\\u0435\\u0431\\u0443\\u0435\\u0442 API key \\u0438 \\u043f\\u043b\\u0430\\u0442\\u043d\\u043e\\u0439 \\u043f\\u043e\\u0434\\u043f\\u0438\\u0441\\u043a\\u0438. \\u0418 \\u044d\\u0442\\u0438\\u043c \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043e\\u043c \\u043e\\u043a\\u0430\\u0437\\u0430\\u043b\\u0438\\u0441\\u044c \\u043f\\u0443\\u0431\\u043b\\u0438\\u0447\\u043d\\u044b\\u0435 \\u0444\\u043e\\u0442\\u043e\\u0433\\u0440\\u0430\\u0444\\u0438\\u0438 \\u0441 Flickr.com. \\u0417\\u0430\\u0434\\u0430\\u0447\\u0430 \\u0421\\u043e\\u0437\\u0434\\u0430\\u0442\\u044c UI iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u0441\\u043e \\u0441\\u0442\\u0440\\u043e\\u043a\\u043e\\u0439 \\u043f\\u043e\\u0438\\u0441\\u043a\\u0430 \\u0432\\u0432\\u0435\\u0440\\u0445\\u0443 \\u0438 \\u0441\\u0435\\u0442\\u043a\\u043e\\u0439 Grid \\u043f\\u043e\\u0434 \\u043d\\u0435\\u0439 \\u0434\\u043b\\u044f \\u043e\\u0442\\u043e\\u0431\\u0440\\u0430\\u0436\\u0435\\u043d\\u0438\\u044f \\u043c\\u0438\\u043d\\u0438\\u0430\\u0442\\u044e\\u0440 \\u0444\\u043e\\u0442\\u043e\\u0433\\u0440\\u0430\\u0444\\u0438\\u0439 \\u043d\\u0430\\u043f\\u043e\\u0434\\u043e\\u0431\\u0438\\u0435:\",\"inLanguage\":\"ru-RU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\\\/#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-11-28T18:06:03+00:00\",\"dateModified\":\"2024-12-03T08:37:15+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":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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":"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:","canonical_url":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"xcode,cursor ai + xcode,ios application,swift,\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439,flickr photos","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#article","name":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u0424\u043e\u0442\u043e \u0441 Flickr.com&#187;. \u0427\u0430\u0441\u0442\u044c 1.","author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/11\/Screenshot-2024-11-28-at-20.31.31.png","@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#articleImage","width":1712,"height":660},"datePublished":"2024-11-28T18:06:03+00:00","dateModified":"2024-12-03T08:37:15+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#webpage"},"isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#webpage"},"articleSection":"Combine, Cursor AI, Swift, SwiftUI, \u0418\u0418 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, Cursor AI, Swift, SwiftUI, \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442"},{"@type":"BreadcrumbList","@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#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\/swift\/#listItem","name":"Swift"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","position":2,"name":"Swift","item":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#listItem","name":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u0424\u043e\u0442\u043e \u0441 Flickr.com&#187;. \u0427\u0430\u0441\u0442\u044c 1."},"previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#listItem","position":3,"name":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u0424\u043e\u0442\u043e \u0441 Flickr.com&#187;. \u0427\u0430\u0441\u0442\u044c 1.","previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","name":"Swift"}}]},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/#person","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#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\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#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\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#webpage","url":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/","name":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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":"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#website"},"breadcrumb":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/#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-11-28T18:06:03+00:00","dateModified":"2024-12-03T08:37:15+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":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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":"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:","og:url":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/","article:published_time":"2024-11-28T18:06:03+00:00","article:modified_time":"2024-12-03T08:37:15+00:00","twitter:card":"summary","twitter:title":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1. | \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":"\u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0418\u0418 \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 Cursor AI \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 API key \u0438 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438. \u0418 \u044d\u0442\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 Flickr.com. \u0417\u0430\u0434\u0430\u0447\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c UI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u0435\u0442\u043a\u043e\u0439 Grid \u043f\u043e\u0434 \u043d\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435:"},"aioseo_meta_data":{"post_id":"16222","title":null,"description":null,"keywords":[{"label":"Xcode","value":"Xcode"},{"label":"Cursor AI + Xcode","value":"Cursor AI + Xcode"},{"label":"iOS application","value":"iOS application"},{"label":"Swift","value":"Swift"},{"label":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439","value":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439"},{"label":"Flickr photos","value":"Flickr photos"}],"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-11-28 17:46:24","updated":"2026-02-22 20:12:55","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\/swift\/\" title=\"Swift\">Swift<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tCursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0424\u043e\u0442\u043e \u0441 Flickr.com\u00bb. \u0427\u0430\u0441\u0442\u044c 1.\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/bestkora.com\/IosDeveloper"},{"label":"Swift","link":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/"},{"label":"Cursor AI \u0432 iOS \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#171;\u0424\u043e\u0442\u043e \u0441 Flickr.com&#187;. \u0427\u0430\u0441\u0442\u044c 1.","link":"https:\/\/bestkora.com\/IosDeveloper\/cursor-ai-%d0%b2-ios-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b5-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%be%d1%82%d0%be-%d1%81-flickr-com\/"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16222","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=16222"}],"version-history":[{"count":4,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16222\/revisions"}],"predecessor-version":[{"id":16316,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/16222\/revisions\/16316"}],"wp:attachment":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/media?parent=16222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/categories?post=16222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/tags?post=16222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}