{"id":17007,"date":"2025-05-05T09:39:42","date_gmt":"2025-05-05T09:39:42","guid":{"rendered":"https:\/\/bestkora.com\/IosDeveloper\/?p=17007"},"modified":"2025-05-31T09:48:26","modified_gmt":"2025-05-31T09:48:26","slug":"%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba","status":"publish","type":"post","link":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/","title":{"rendered":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d\u00a0 \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental\u00a0"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-12.20.54.png\"><img loading=\"lazy\" decoding=\"async\" width=\"999\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-12.20.54-999x1024.png\" alt=\"\" class=\"wp-image-17029\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-12.20.54-999x1024.png 999w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-12.20.54-293x300.png 293w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-12.20.54-768x787.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-12.20.54.png 1374w\" sizes=\"auto, (max-width: 999px) 100vw, 999px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><code>iOS 17<\/code> \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c <code>SwiftUI <\/code>\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 <code>MapKit <\/code>\u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 <code>UIKit<\/code>:&nbsp;<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u043d\u043e\u0432\u044b\u0439 <code>Map (position:selection:content:)<\/code> \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b <code>position<\/code> \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442&nbsp; \u0432\u044b\u0431\u043e\u0440 <code>selection<\/code> \u043d\u0430 \u043a\u0430\u0440\u0442\u0435,<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b <code>Map<\/code> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c <strong>\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b<\/strong> \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>SwiftUI DSL<\/code> (<code>ForEach, Marker, Annotation<\/code> \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>MapContentBuilder<\/code> \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>View<\/code>,<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><code>LookAroundPreview<\/code> (\u0430\u043d\u0430\u043b\u043e\u0433 \u043f\u0430\u043d\u043e\u0440\u0430\u043c \u0443\u043b\u0438\u0446) \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435,&nbsp;&nbsp;<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b: \u043a\u043e\u043c\u043f\u0430\u0441 .<code>mapControl(.compass),<\/code> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c <code>mapControl(.userLocation)<\/code>, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u0430\u044f \u043b\u0438\u043d\u0435\u0439\u043a\u0430 <code>.mapControl(.scaleView)<\/code>,<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a&nbsp; <code>MKLocalSearchCompletion<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 <code>SwiftUI<\/code> \u0447\u0435\u0440\u0435\u0437 <code>@State<\/code>.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 <code>API<\/code>, \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u043c<code> iOS <\/code>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u0442\u0435 <a href=\"https:\/\/www.polpiella.dev\/mapkit-and-swiftui-searchable-map\/\"><strong>Building a searchable map with SwiftUI and MapKit<\/strong><\/a>&nbsp; (\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/docs.google.com\/document\/d\/1Upw3oerUlcOfKVW_0OyMjeCsp5HeklR0mkl1Pks4wEE\/edit?usp=sharing\">\u0437\u0434\u0435\u0441\u044c<\/a>) \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0431\u043b\u0435\u0441\u0442\u044f\u0449\u0438\u043c \u0418\u0418 \u043e\u0442 Google, <code>Gemini 2.5 Pro Experimental<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/span><\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0412\u043e\u0442 \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0412\u0432\u043e\u0434\u0438\u0448\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u043e\u0434\u0430 \/ \u043c\u0435\u0441\u0442\u0430 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u043d\u0438\u0437\u0443 \u044d\u043a\u0440\u0430\u043d\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">C \u0432\u0432\u043e\u0434\u043e\u043c \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0431\u0443\u043a\u0432\u044b \u043d\u0438\u0436\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a (\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 <code>suggestions<\/code>).<\/span><\/li>\n\n\n\n<li>&nbsp;<span style=\"font-weight: 400;\">\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Enter \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0448\u044c \u043c\u0430\u0440\u043a\u0435\u0440 \u2014 \u0441\u043d\u0438\u0437\u0443 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f<code> Look Around<\/code> \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 (\u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u0445, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043d\u0438\u0437\u0443 \u0440\u0430\u0437\u043d\u044b\u0435 <code>LookAroundPreview<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041a\u043b\u0438\u043a\u0430\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 <code>LookAroundPreview<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 <code>suggestions<\/code> \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u043d\u043e\u0432\u043e.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u0430\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 <code>suggestions<\/code>, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043d\u0438\u0437\u0443 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp; <code>LookAroundPreview<\/code>.<\/span><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXe4uGBsczfXr54209xYCKD37zkEuHMfTz8rAPufL5nue071hxKR0EJK08mDA3mF1-9rQwVmZb5y7wVV8DDxDimSB0CpHvf7VxDy8IGhcy2gkSvPUOsZa7RzfqEiZo3KHdlmp1bRtg?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\" style=\"width:607px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043e\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 <code>Thread 1: EXC_BAD_ACCESS (code=1, address=0x68),<\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0443\u0448\u0435\u043b \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u043b\u044f \u0437\u0440\u0435\u043d\u0438\u044f.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412 \u0446\u0435\u043b\u043e\u043c \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0438\u0434\u0435\u0438, \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 <code>LookAroundPreview<\/code> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440, \u0442\u0430\u043a \u0438 \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0416\u0430\u043b\u044c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0440\u0430\u0437, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0441 \u0431\u043b\u0435\u0441\u0442\u044f\u0449\u0438\u043c \u0418\u0418 \u043e\u0442 Google, <code>Gemini 2.5 Pro Experimental,<\/code> \u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0431\u043e\u0436\u0435\u0441\u043a\u0438\u0439 \u0432\u0438\u0434.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u0441\u043c\u043e\u0442\u0440\u044e \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0418\u0418 \u043a\u0430\u043a \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u0433\u043e <strong>&#171;\u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0438\u043b\u043e\u0442\u0430&#187;<\/strong>, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041d\u0430 \u043d\u0435\u0433\u043e \u0432\u043e\u0437\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0443\u0442\u044b\u0445 \u0444\u0438\u0447\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 <code>LookAroundPreview<\/code> \u0438\u0437 <code>MapKit<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430, \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f <code>Apple<\/code> \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 <code>WWDC<\/code>!<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418\u0442\u0430\u043a, <code>Gemini 2.5 Pro Experimental<\/code> &#8212; \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u0439 \u201c\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0438\u043b\u043e\u0442\u201d, \u043d\u043e \u0432\u0430\u043c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u0435\u043d \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0438\u043b\u043e\u0442 \u0432 \u043a\u0440\u0435\u0441\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0438\u0440\u0430, \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0432\u0437\u044f\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0430\u0432\u0442\u043e\u043f\u0438\u043b\u043e\u0442 \u0437\u0430\u043f\u0443\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043b\u0435\u0442\u0435\u0442\u044c \u0441\u043a\u0432\u043e\u0437\u044c \u0433\u043e\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043d \u0441\u0430\u043c \u0436\u0435 \u0438 \u0441\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 <a href=\"https:\/\/docs.google.com\/document\/d\/1Upw3oerUlcOfKVW_0OyMjeCsp5HeklR0mkl1Pks4wEE\/edit?usp=drive_link\">\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d.<\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043b\u0438\u0448\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u044d\u0442\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0418\u0418 Gemini 2.5 Pro Experimental \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430\u0448\u0435 \u043a\u043e\u0434\u0438\u043d\u0433-\u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c, \u0447\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0434\u043a\u043e.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043f\u0440\u043e\u0441\u0438\u043b\u0430 <code>Gemini 2.5 Pro<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u043e\u0441\u0442\u0430 <a href=\"https:\/\/www.polpiella.dev\/mapkit-and-swiftui-searchable-map\/\"><strong>Building a searchable map with SwiftUI and MapKit<\/strong><\/a>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438, \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u201c\u041a\u0430\u0440\u0442 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><code>Gemini 2.5 Pro Experimental<\/code> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u043f\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u043c, \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043b\u0438\u0448\u044c \u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430. \u042d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0447\u0438\u0442\u0430\u0442\u044c \u043c\u044b\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u044d\u043a\u0440\u0430\u043d!<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeTwULJMTovSWfJzDohwhbMIY7Cy4zr_9KAOlk3PoAGi20HTvCksVa6BpsSd7rZXLptZjsBrHE4eFJC7nkqZ5FsoaCBZRl2frCq-AJ9j54rD1q7Y1cvRrrmv2A3zohe0V-IxAEHIA?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdPbAM4bHXeBVLGJlv6zh4jhUE47MVisog4R-D_hj71eVc2oRUX3XJWLD5zdI-_5bv6wfjanOsHSHQJvWp2TyiJJB-E4VFyoAqqfEeyLaRDNuh9BAGYQorbSm2CP5WtAOKcHSs72g?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041e\u0442\u0432\u0435\u0442 Gemini 2.5 Pro:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c SwiftUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Searchable Map \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043d\u0438\u043c\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043b\u0443\u0447\u0448\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u0438\u0437 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0440\u0430\u043d\u0435\u0435.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0443\u0434\u0435\u0442:<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Map View \u0438\u0437 MapKit.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u043b\u0438\u0441\u0442 SheetView \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 .sheet \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0435\u0441\u0442.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c MKLocalSearchCompleter \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c MKLocalSearch \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <strong>\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430&nbsp; \u0432 \u0432\u0438\u0434\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (\u043c\u0430\u0440\u043a\u0435\u0440\u0430 Marker).<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 Marker \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e @State \u0438 @Observable.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c&nbsp; LocationService \u0432 SheetView.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442 SheetView \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \/ \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c (zoom \/ pan) \u043a\u0430\u0440\u0442\u0443 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u0430\u0440\u0442\u0435, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0441\u043d\u0438\u043c\u043a\u0443 \u044d\u043a\u0440\u0430\u043d\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 SwiftUI.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043a\u043e\u0434, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 Gemini 2.5 Pro, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u043c <a href=\"https:\/\/docs.google.com\/document\/d\/1Upw3oerUlcOfKVW_0OyMjeCsp5HeklR0mkl1Pks4wEE\/edit?usp=drive_link\">\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u0442\u0438\u043c \u0418\u0418<\/a>, a \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u201cSan Diego\u201d \u0438 \u043d\u0430\u0436\u0430\u0442\u044c Enter ( \u0442.\u0435. Submit)<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdUm-vRKkyivAqQDXv45lfPyLIzBySX0x_GFo2nS2_BlQ22fNOvojWh9qtE2HaumoM9saooXw0DyQTyRgNSQEpN41gs5D8N0toQXxUBjNIfKDQBhkZqDTtnq33mwdDYzlzqIiTg5Q?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\" style=\"width:614px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u044b Marker \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u043b\u0438\u043a\u0430\u0442\u044c, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0441\u0442\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0440\u043a\u0435\u0440\u0443 Marker. \u041f\u043e\u043a\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0435 Marker LookAroundPreview \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f (\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0438 Gemini 2.5 Pro),&nbsp; \u043d\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043e \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0435\u0441\u0442\u044c.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d SheetView \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0434\u043b\u044f \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">A \u0432\u043e\u0442 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXef35wmb_qysPo7acyhNXxu4KQGSWKKIqIYjp-G9Pw4l2lcOrT0fL8e4BxV9wMRpdE0gqaJi4WpyIbGGqO30GXICecjV1qnCYArbdf-7ElOnmSib_Fnq8Trew-lbJWuzhNBewfCKA?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\" style=\"width:606px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 Marker \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438. \u0418 \u043e\u043f\u044f\u0442\u044c SheetView \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0434\u043b\u044f&nbsp; \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u043e\u0441\u0438\u043c Gemini 2.5 Pro Experimental \u043f\u043e\u043c\u043e\u0447\u044c \u043d\u0430\u043c \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c UI \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c SheetView \u043d\u0430 \u044d\u043a\u0440\u0430\u043d.<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfVXNLvr37uGkxjfcNjtLygPGpEvbOsivbX1PN_RFdeVWKjqwZUvR6ivNUksl-sRJathIrmW7mWlw9LFpvaF280NMZJ7w3ljZWEXK3fkOhH66s4dlDUdGfJicrGnMr7sQHG3-ydRw?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"316\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53-1024x316.png\" alt=\"\" class=\"wp-image-17014\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53-1024x316.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53-300x93.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53-768x237.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53-500x154.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.46.53.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041e\u0442\u0432\u0435\u0442 Gemini 2.5 Pro:<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e, \u0432\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443&nbsp;UI! \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u0441\u0442 <code>SheetView<\/code>, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430, \u0447\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c, \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445. \u0421\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f:&nbsp;<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 Button \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430 \u043b\u0438\u0441\u0442\u0430 SheetView.&nbsp;<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u043a\u0430\u0440\u0442\u0430\u043c\u0438 <code>Map<\/code>. \u041e\u043d \u0434\u0430\u0435\u0442 \u0447\u0435\u0442\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432. \u041a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 &nbsp;<a href=\"https:\/\/docs.google.com\/document\/d\/1Upw3oerUlcOfKVW_0OyMjeCsp5HeklR0mkl1Pks4wEE\/edit?usp=drive_link\">\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Gemini 2.5 Pro<\/a>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcpveA_vtkkn187k8X-Qeejlfq5huwdHJp8qyqwDSp4rKwyy4DVBPQiRlB1TESJ7l-mLFwWxVGaCoLtZYYkpAEpyRZVt_NNt84mtfAe8ksv6eCNiQDWAjL-j28zKJtXcxuVRJ1i?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u042f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 Gemini 2.5 Pro Experimental:<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcD_hlujkCalAYKoyYr49ERsAkwKrwxL9dzZyMgF8OR1qvcxtHf2skTm9uah7HSA2xqy6ABk7KASUEbaFB4O5wCmj-EA6cG6N5cZgf9bhTSn20OSG7cQJ5DtNLgKKdbtilD8PFWig?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"225\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51-1024x225.png\" alt=\"\" class=\"wp-image-17015\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51-1024x225.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51-300x66.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51-768x168.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51-500x110.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.49.51.png 1432w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041e\u0442\u0432\u0435\u0442 Gemini 2.5 Pro:<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u044b \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u0440\u0430\u0432\u044b! \u041f\u0440\u0438\u043d\u043e\u0448\u0443 \u0441\u0432\u043e\u0438 \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f. \u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f <code>onDismiss <\/code>\u0431\u044b\u043b\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code>.sheet<\/code> \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 <code>content<\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><code>Gemini 2.5 Pro \u0438<\/code>\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443, \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 &nbsp;<a href=\"https:\/\/docs.google.com\/document\/d\/1Upw3oerUlcOfKVW_0OyMjeCsp5HeklR0mkl1Pks4wEE\/edit?usp=drive_link\">\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Gemini 2.5 Pro<\/a>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u0441\u0447\u0435\u0437\u043b\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u043b\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u201cSan Francisco\u201d \u0438 \u043d\u0430\u0436\u0430\u043b\u0438 <code>Enter<\/code> (<code>.onSubmit<\/code>), <code>SheetView<\/code> \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0441 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u044b <code>Marker<\/code> \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0430&nbsp; \u0441 \u201c\u043b\u0443\u043f\u043e\u0439\u201d \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442&nbsp; <code>SheetView<\/code>&nbsp; \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432\u043d\u043e\u0432\u044c \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a.&nbsp;<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfgfZ4ylIjxIedtEQG3ERJT5pjToojUl7uJ-nBzm4trmlGFh0DHhpyWBMQMgYoJ0sl-eU2WI-fL2URG3wEjV_n-or3YJPwLspUQogqBbA0bZ5fIk0CyNmTAr16SgXzn57lUbAe-?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0435:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeLAVKx39Sj8HlydtZs4sOKFTEdngX99sz_BgOcSVw_LSHfAmUENQl34mtTBslo-acq0MQVwZncM8SzxHVo1Xysp6DOXB7ez0CSis_WgjE4PYR76bc0TqjkjHcHm1f8BXptZc5pFA?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\" style=\"width:614px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 &#8212; \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043d\u0430\u0436\u0430\u0432 <strong>Enter<\/strong>, \u043b\u0438\u0431\u043e \u0432\u044b\u0431\u0440\u0430\u0432 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 &#8212; <code>SheetView<\/code> \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u044d\u043a\u0440\u0430\u043d, \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043a\u0438, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e, \u043d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c <code>Look Around <\/code>\u0441\u0446\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0432\u043e\u0433\u043e <code>LookAroundPreview<\/code> \u0432 iOS 17 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 <code>Map<\/code>, \u043b\u0438\u0431\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0430 \u0443\u0442\u0435\u0440\u044f\u043d\u0430.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>&nbsp;LookAroundPreview \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f&nbsp;<\/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 <code>Gemini 2.5 Pro Experimental <\/code>&nbsp;(\u0438 \u043e\u043f\u044f\u0442\u044c \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442, \u0447\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438):<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfVtK_WOUlxD7hv0bToFQl6FilFXXgHWK8_oJcOeKZPXtSyoevf26S3GSSq6QFRw7BWkyX3WnKn-13yzD2jwSMHf7ykLl7W6BMCVxzWxJDaKME9R7Ryj9LLKpFCGUrlooQG3cDZqA?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"128\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56-1024x128.png\" alt=\"\" class=\"wp-image-17016\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56-1024x128.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56-300x37.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56-768x96.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56-500x62.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.52.56.png 1362w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0418\u0418 Gemini 2.5 Pro \u0432 \u043a\u043e\u0434\u0435:<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fetchLookAroundScene<\/strong>: \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f async \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 <code>MKLookAroundScene<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>MKLookAroundSceneRequest<\/code>. \u041e\u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 <code>@State <\/code>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>lookAroundScene<\/code> \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0441\u043f\u0435\u0445\u0430 \u0438\u043b\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0438.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>.onChange(of: selectedResult) \u0438 .task(id: selectedResult?.id)<\/strong>: \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>fetchLookAroundScene<\/code> \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0438\u0445 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>.safeAreaInset(edge: .bottom)<\/strong>: \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0435 <code>Map<\/code>. \u041e\u043d \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 <code>LookAroundPreview<\/code> (\u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0432 <code>LookAroundPanelView<\/code>), \u043a\u043e\u0433\u0434\u0430 <code>selectedResult<\/code> \u043d\u0435 \u0440\u0430\u0432\u0435\u043d <code>nil<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>LookAroundPanelView<\/strong>: \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d UI \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e <code>View<\/code> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430). \u041e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0441\u0446\u0435\u043d\u044b <code>$scene<\/code> \u0438, \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e, \u0438\u043c\u044f <code>name<\/code>.<\/span><\/li>\n\n\n\n<li><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/strong>:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (<code>onChange(of: searchResults<\/code>)), \u043f\u0430\u043d\u0435\u043b\u044c <code>Look Around <\/code>\u044f\u0432\u043d\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041a\u043e\u0433\u0434\u0430<code> selectedResult<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>nil<\/code> (\u043c\u0430\u0440\u043a\u0435\u0440 \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d), \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>fetchLookAroundScene<\/code> \u0441 nil, \u0447\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c.<\/span><\/li>\n<\/ul>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f<\/strong>: \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b <code>.animation<\/code> \u0438 <code>.transition<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u043d\u0435\u043b\u044c \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0430\u0441\u044c \u0438 \u0438\u0441\u0447\u0435\u0437\u0430\u043b\u0430.<\/span><\/li>\n<\/ol>\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\u044b \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440 <code>Marker<\/code> \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 <code>Map<\/code>, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 <code>Look Around<\/code>. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 <code>LookAroundPanelView<\/code>&nbsp; \u0432\u044b\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445. \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u0440\u043a\u0435\u0440&nbsp; <code>Marker<\/code> \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u043f\u0430\u043d\u0435\u043b\u044c <code>Look Around<\/code>, \u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043a\u0440\u043e\u0435\u0442 \u0435\u0435.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdQGaaGLRPsMkRuAZShGUTEHl3cwZ0UTDIDCZgRq0Kf6Ja4H4JtWQdLoO7FApr4T9rAq0lZUI4J5fZfXPEt6z_NWXnnlr9lXM7N0gQWsPAADHRB1-UwJhVQ-BMzQmcfQzu6Cpvo8g?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0433\u0435\u0440\u043e\u044f \u043d\u0430 \u043f\u0443\u0442\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f, \u0438 \u043d\u0430\u0448\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u043e\u0441\u044c \u0432 \u0431\u0438\u0442\u0432\u0435 \u0441 \u0443\u0436\u0430\u0441\u043d\u044b\u043c \u0437\u0432\u0435\u0440\u0435\u043c, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u043a\u0430\u043a \u041e\u0448\u0438\u0431\u043a\u0430 \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <code>SwiftUI<\/code>: &#171;<code>Unable to type-check this expression in reasonable time<\/code>.&#187; (\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0422\u0418\u041f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f). \u042d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 SwiftUI \u0441\u043a\u0430\u0437\u0430\u0442\u044c: &#171;\u042d\u0439, \u043f\u0440\u0438\u044f\u0442\u0435\u043b\u044c, \u043f\u043e\u043b\u0435\u0433\u0447\u0435! <code>View<\/code>, \u0447\u0442\u043e \u0442\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b, \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043c\u043e\u0437\u0433 \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0441\u043f\u043b\u0430\u0432\u0438\u043b\u0441\u044f, \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0433\u043e \u043e\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0438\u043f\u0430.&#187; \u0422\u0430\u043a\u043e\u0435 \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 <code>View<\/code> \u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u043e\u043a\u0440\u0443\u0433 <code>Map<\/code>.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041e\u0448\u0438\u0431\u043a\u0430 <\/strong><strong>&#171;The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions&#187;<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u043c\u043e\u0447\u044c <code>Gemini 2.5 Pro Experimental<\/code>:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdBYa4x17T-zPorD4BDKmGA37m_FvvFtb9OlOQRVxTpANUolmwl4vdnYeMv7syKKils04JTLn3UWN3W8w0-qfU-8OdIa5Vlot0hyoCHHRuxblOmVdX5QI1r-wX8JZYSnX2-dNCDzA?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"264\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39-1024x264.png\" alt=\"\" class=\"wp-image-17017\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39-1024x264.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39-300x77.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39-768x198.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39-500x129.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-05-at-19.57.39.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Gemini 2.5 Pro Experimental \u043a\u0430\u043a \u0445\u0440\u0430\u0431\u0440\u044b\u0439 \u0440\u044b\u0446\u0430\u0440\u044c, \u0431\u0440\u043e\u0441\u0438\u043b\u0441\u044f \u0432 \u0431\u043e\u0439:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2014 \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0437 .<code>onChange<\/code>, <code>.onDismiss <\/code>\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 <code>private <\/code>\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (<code>handleSearchResultsChange,<\/code> <code>handleSelectionChange<\/code>, <code>handleSheetDismiss<\/code>), \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>var body <\/code>\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e <code>View<\/code>.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2014 \u041c\u043e\u0436\u0435\u0442, \u043e\u0431\u0435\u0440\u043d\u0435\u043c <code>Map<\/code> \u0438 \u0435\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b ( <code>.mapStyle, .ignoresSafeArea)<\/code> \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0442\u0430\u043a\u043e\u0439 \u043a\u0430\u043a <code>ZStack<\/code> \u0438\u043b\u0438 <code>VStack<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (<code>.onChange, .task, .overlay, .safeAreaInset, .sheet, .alert<\/code>) \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443?<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u2014 \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0440\u0442\u044b (<code>ForEach<\/code>) \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u043a\u043e\u0434\u0430<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--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:#1E1E1E\"><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\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>.ignoresSafeArea(edges: .top, treatingAs: .edge)<\/textarea><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">ignoresSafeArea<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">edges<\/span><span style=\"color: #D4D4D4\">: .<\/span><span style=\"color: #9CDCFE\">top<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #DCDCAA\">treatingAs<\/span><span style=\"color: #D4D4D4\">: .<\/span><span style=\"color: #9CDCFE\">edge<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435 <code>Gemini 2.5 Pro<\/code>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0439 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u00ab\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0422\u0418\u041f\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f; \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0434\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u00bb.&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u043c \u043e\u0431 \u044d\u0442\u043e\u043c <code>Gemini 2.5 Pro Experimenta<\/code>l:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcTEPkazPfJrxz0lNsRWpO77jjeHygXs8RkMu4srLEyIaxxM98esizXjrKkCldgTv8VfBC7u53dSa9axbnsW9shPd7yVFqbFR7WgNDS7-segM009r2QzkhJKYRtbBnTuvSxZfTlPQ?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"177\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40-1024x177.png\" alt=\"\" class=\"wp-image-17022\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40-1024x177.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40-300x52.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40-768x133.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40-500x87.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.44.40.png 1328w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;<strong>\u041e\u0442\u0432\u0435\u0442 <strong>Gemini 2.5 Pro<\/strong>:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u044b \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u0440\u0430\u0432\u044b! \u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u0440\u0438\u043d\u043e\u0448\u0443 \u0441\u0432\u043e\u0438 \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>treatingAs<\/code> \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code>.ignoresSafeArea<\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>Optional<\/code>&nbsp; \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>sides<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u0440\u0430\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443&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-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--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:#1E1E1E\"><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\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>.ignoresSafeArea(edges: .top, treatingAs: .edge) \/\/ &lt;&#8212; WRONG<\/textarea><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">ignoresSafeArea<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">edges<\/span><span style=\"color: #D4D4D4\">: .<\/span><span style=\"color: #9CDCFE\">top<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #DCDCAA\">treatingAs<\/span><span style=\"color: #D4D4D4\">: .<\/span><span style=\"color: #9CDCFE\">edge<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #6A9955\">\/\/ &lt;--- WRONG<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\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-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--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:#1E1E1E\"><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\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>ignoresSafeArea(edges: .top) \/\/ &lt;&#8212; CORRECT: Ignore top safe area<\/textarea><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCDCAA\">ignoresSafeArea<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">edges<\/span><span style=\"color: #D4D4D4\">: .<\/span><span style=\"color: #9CDCFE\">top<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #6A9955\">\/\/ &lt;--- CORRECT: Ignore top safe area<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443! \u042d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0423\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 \u0431\u0435\u0437 ZStack&nbsp;&nbsp;<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeOeYyiByubbEbvIc6He0xPJUi9_3yKs9G7Y5CQtMbTD8LvO43rzQxoEIeGenI1Et76PeWyl0nEh-XfwhbZLsYqAzDVr-chC_3syeHtB6QeCqEheGAH-CriPxTb6_G3VItxEkMCag?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"145\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39-1024x145.png\" alt=\"\" class=\"wp-image-17023\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39-1024x145.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39-300x43.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39-768x109.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39-500x71.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2025\/05\/Screenshot-2025-05-06-at-10.51.39.png 1298w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041e\u0442\u0432\u0435\u0442 <\/strong><strong>Gemini 2.5 Pro:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e, \u043f\u043e\u043d\u044f\u043b. \u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a<code> Map View<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>.safeAreaInset(edge: .bottom)<\/code> \u0434\u043b\u044f <code>LookAroundPanelView<\/code>.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0430\u0436\u0435 \u0431\u0435\u0437 <code>ZStack<\/code> \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>overlay (searchButtonOverlay) <\/code>\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430 <code>Sheet<\/code> (<code>sheetContent<\/code>), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u043e\u0434 <strong>SearchableMap.swift,<\/strong> \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0432\u0430\u0448\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 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\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>import SwiftUI\nimport MapKit\nstruct SearchableMap: View {\n\u00a0 \u00a0 \/\/ &#8212; State Variables &#8212;\n\u00a0 \u00a0 @State private var locationService = LocationService()\n\u00a0 \u00a0 @State private var position: MapCameraPosition = .automatic\n\u00a0 \u00a0 @State private var selectedResult: SearchResult?\n\u00a0 \u00a0 @State private var isSheetPresented: Bool = true\n\u00a0 \u00a0 @State private var showSearchButton: Bool = false\n\u00a0 \u00a0 @State private var lookAroundScene: MKLookAroundScene?\n\u00a0\n\u00a0 \u00a0 \/\/ Computed property\n\u00a0 \u00a0 var searchResults: [SearchResult] { locationService.searchResults }\n\u00a0 \u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 \u00a0 Map(position: $position, selection: $selectedResult) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Map content: Markers for search results\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ForEach(searchResults) { result in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Marker(result.name, coordinate: result.location)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .tag(result)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ &#8212; Apply Modifiers Directly to Map &#8212;\n\u00a0 \u00a0 \u00a0 \u00a0 .mapStyle(.standard(elevation: .realistic))\n\u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ &#8212; State Change Handlers &#8212;\n\u00a0 \u00a0 \u00a0 \u00a0 .onChange(of: searchResults) { _, newResults in handleSearchResultsChange(newResults) }\n\u00a0 \u00a0 \u00a0 \u00a0 .onChange(of: selectedResult) { _, newValue in handleSelectionChange(newValue) }\n\u00a0 \u00a0 \u00a0 \u00a0 .task(id: selectedResult?.id) { await fetchLookAroundScene(for: selectedResult) } \/\/ Robust fetch\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ &#8212; Search Button Overlay &#8212;\n\u00a0 \u00a0 \u00a0 \u00a0 .overlay(alignment: .topTrailing) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Use computed property for the button content\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 searchButtonOverlay\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Apply animation specifically for the button&#8217;s appearance\/disappearance\n\u00a0 \u00a0 \u00a0 \u00a0 .animation(.easeInOut, value: showSearchButton)\n\u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ &#8212; Look Around Panel using safeAreaInset &#8212;\n\u00a0 \u00a0 \u00a0 \u00a0 .safeAreaInset(edge: .bottom) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Conditionally display the panel using the computed property\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 lookAroundPanel \/\/ Ensures animation applies correctly\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ &#8212; Bottom Sheet Presentation &#8212;\n\u00a0 \u00a0 \u00a0 \u00a0 .sheet(isPresented: $isSheetPresented, onDismiss: handleSheetDismiss) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Use computed property for sheet content\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sheetContent\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ &#8212; Optional: Error Alert &#8212;\n\u00a0 \u00a0 \u00a0 \u00a0 .alert(&#171;Location Service Error&#187;, isPresented: locationService.isErrorPresented, presenting: locationService.error) { _ in Button(&#171;OK&#187;) {} } message: { error in Text(error.localizedDescription) }\n\u00a0 \u00a0 } \/\/ End of body\n\u00a0 \u00a0 \/\/ MARK: &#8212; Computed Properties for Sub-Views (Helps Compiler)\n\u00a0 \u00a0 \/\/ Computed property for the Look Around Panel content\n\u00a0 \u00a0 @ViewBuilder\n\u00a0 \u00a0 private var lookAroundPanel: some View {\n\u00a0 \u00a0 \u00a0 \u00a0 if selectedResult != nil { \/\/ Condition checked here\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 LookAroundPanelView(scene: $lookAroundScene, resultName: selectedResult?.name)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .frame(height: 150) \/\/ Define size here\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .clipShape(RoundedRectangle(cornerRadius: 15))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(.thinMaterial)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .cornerRadius(15)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .shadow(radius: 5)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding(.horizontal) \/\/ Add horizontal padding\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding(.bottom, 10) \/\/ Add some padding from the absolute bottom edge\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .transition(.move(edge: .bottom).combined(with: .opacity)) \/\/ Animation transition\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ Computed property for the search button overlay content\n\u00a0 \u00a0 @ViewBuilder\n\u00a0 \u00a0 private var searchButtonOverlay: some View {\n\u00a0 \u00a0 \u00a0 \u00a0 if showSearchButton {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Button {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 selectedResult = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 showSearchButton = false\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isSheetPresented = true\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } label: {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Image(systemName: &#171;magnifyingglass&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.title2)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding(12)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .background(.thinMaterial, in: Circle())\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .shadow(radius: 3)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding() \/\/ Padding from screen edges\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .transition(.scale.combined(with: .opacity))\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 EmptyView()\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ Computed property for the sheet&#8217;s content view\n\u00a0 \u00a0 private var sheetContent: some View {\n\u00a0 \u00a0 \u00a0 \u00a0 SheetView(locationService: locationService)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .presentationDetents([.height(250), .medium, .large])\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .presentationBackground(.regularMaterial)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .presentationBackgroundInteraction(.enabled(upThrough: .medium))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .presentationCornerRadius(15)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Optional: .interactiveDismissDisabled()\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ MARK: &#8212; Helper Functions \/ Handlers (Keep As Is)\n\u00a0 \u00a0 private func handleSearchResultsChange(_ newResults: [SearchResult]) {\n\u00a0 \u00a0 \u00a0 \u00a0 if !newResults.isEmpty {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isSheetPresented = false\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 showSearchButton = true\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if newResults.count == 1 { selectedResult = newResults.first }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if let region = locationService.region {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 withAnimation(.smooth(duration: 0.7)) { position = .region(region) }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 showSearchButton = false\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 private func handleSelectionChange(_ newValue: SearchResult?) {\n\u00a0 \u00a0 \u00a0 \u00a0 print(&#171;Selected result changed to: \\(newValue?.name ?? &#171;None&#187;)&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 if newValue == nil &amp;&amp; !isSheetPresented &amp;&amp; !searchResults.isEmpty { showSearchButton = true }\n\u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Fetching handled by .task\n\u00a0 \u00a0 }\n\u00a0 \u00a0 private func handleSheetDismiss() {\n\u00a0 \u00a0 \u00a0 \u00a0 print(&#171;Sheet dismissed manually.&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 if !locationService.searchResults.isEmpty { showSearchButton = true }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 private func fetchLookAroundScene(for result: SearchResult?) async {\n\u00a0 \u00a0 \u00a0 \u00a0 guard let result = result else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.lookAroundScene = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 print(&#171;Fetching Look Around scene for \\(result.name)&#8230;&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 let request = MKLookAroundSceneRequest(coordinate: result.location)\n\u00a0 \u00a0 \u00a0 \u00a0 do {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let scene = try await request.scene\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.lookAroundScene = scene\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/&#8212;-\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isSheetPresented = false\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/&#8212;-\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print(&#171;Look Around scene fetched successfully: \\(scene != nil)&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 } catch {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print(&#171;\u274c Failed to fetch Look Around scene: \\(error.localizedDescription)&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.lookAroundScene = nil\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n}\n\/\/ MARK: &#8212; Extracted Look Around Panel View (Keep As Is)\nstruct LookAroundPanelView: View {\n\u00a0 \u00a0 @Binding var scene: MKLookAroundScene?\n\u00a0 \u00a0 var resultName: String?\n\u00a0 \u00a0 var body: some View {\n\u00a0 \u00a0 \u00a0 \u00a0 VStack(alignment: .leading, spacing: 5) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if let name = resultName {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Text(name)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .font(.caption.weight(.semibold))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding(.horizontal, 8)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .padding(.top, 8)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 LookAroundPreview(scene: $scene, allowsNavigation: true, badgePosition: .bottomTrailing)\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n}\n\n\/\/ MARK: &#8212; Observable Extension for Alert Binding (Keep As Is)\nextension LocationService {\n\u00a0 \u00a0 var isErrorPresented: Binding&lt;Bool> {\n\u00a0 \u00a0 \u00a0 \u00a0 Binding(get: { self.error != nil }, set: { if !$0 { self.error = nil } })\n\u00a0 \u00a0 }\n}\n\/\/ MARK: &#8212; Preview\n#Preview {\n\u00a0 \u00a0 SearchableMap()\n}<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">MapKit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SearchableMap<\/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: #7F848E; font-style: italic\">\/\/ --- State Variables ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> locationService = <\/span><span style=\"color: #61AFEF\">LocationService<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> position: MapCameraPosition = .<\/span><span style=\"color: #E06C75\">automatic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> selectedResult: SearchResult?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isSheetPresented: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> showSearchButton: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> lookAroundScene: MKLookAroundScene?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Computed property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> searchResults: [SearchResult] { locationService.<\/span><span style=\"color: #E06C75\">searchResults<\/span><span style=\"color: #ABB2BF\"> }<\/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\">Map<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">position<\/span><span style=\"color: #ABB2BF\">: $position, <\/span><span style=\"color: #61AFEF\">selection<\/span><span style=\"color: #ABB2BF\">: $selectedResult) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Map content: Markers for search results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(searchResults) { result <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Marker<\/span><span style=\"color: #ABB2BF\">(result.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">coordinate<\/span><span style=\"color: #ABB2BF\">: result.<\/span><span style=\"color: #E06C75\">location<\/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\">tag<\/span><span style=\"color: #ABB2BF\">(result)<\/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: #7F848E; font-style: italic\">\/\/ --- Apply Modifiers Directly to Map ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">mapStyle<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">standard<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">elevation<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">realistic<\/span><span style=\"color: #ABB2BF\">))<\/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: #7F848E; font-style: italic\">\/\/ --- State Change Handlers ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\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\">: searchResults) { _, newResults <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">handleSearchResultsChange<\/span><span style=\"color: #ABB2BF\">(newResults) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\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\">: selectedResult) { _, newValue <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">handleSelectionChange<\/span><span style=\"color: #ABB2BF\">(newValue) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">task<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">id<\/span><span style=\"color: #ABB2BF\">: selectedResult?.<\/span><span style=\"color: #E06C75\">id<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchLookAroundScene<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: selectedResult) } <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Robust fetch<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Search Button Overlay ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">overlay<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">topTrailing<\/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: #7F848E; font-style: italic\">\/\/ Use computed property for the button content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 searchButtonOverlay<\/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: #7F848E; font-style: italic\">\/\/ Apply animation specifically for the button&#39;s appearance\/disappearance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">animation<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">easeInOut<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: showSearchButton)<\/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: #7F848E; font-style: italic\">\/\/ --- Look Around Panel using safeAreaInset ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">safeAreaInset<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">edge<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/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: #7F848E; font-style: italic\">\/\/ Conditionally display the panel using the computed property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 lookAroundPanel <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Ensures animation applies correctly<\/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: #7F848E; font-style: italic\">\/\/ --- Bottom Sheet Presentation ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">sheet<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: $isSheetPresented, <\/span><span style=\"color: #61AFEF\">onDismiss<\/span><span style=\"color: #ABB2BF\">: handleSheetDismiss) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use computed property for sheet content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sheetContent<\/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: #7F848E; font-style: italic\">\/\/ --- Optional: Error Alert ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">alert<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Location Service Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: locationService.<\/span><span style=\"color: #E06C75\">isErrorPresented<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">presenting<\/span><span style=\"color: #ABB2BF\">: locationService.error) { _ <\/span><span style=\"color: #C678DD\">in<\/span><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 style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: { error <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #ABB2BF\">) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 } <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ End of body<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Computed Properties for Sub-Views (Helps Compiler)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Computed property for the Look Around Panel content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@ViewBuilder<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> lookAroundPanel: <\/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: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> selectedResult != <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Condition checked here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">LookAroundPanelView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">scene<\/span><span style=\"color: #ABB2BF\">: $lookAroundScene, <\/span><span style=\"color: #61AFEF\">resultName<\/span><span style=\"color: #ABB2BF\">: selectedResult?.<\/span><span style=\"color: #E06C75\">name<\/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\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">150<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Define size here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">clipShape<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">RoundedRectangle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">thinMaterial<\/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\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">shadow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">radius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">5<\/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\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add horizontal padding<\/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 style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add some padding from the absolute bottom edge<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">transition<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #56B6C2\">move<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">edge<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottom<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">combined<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">opacity<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Animation transition<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Computed property for the search button overlay content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">@ViewBuilder<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> searchButtonOverlay: <\/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: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> showSearchButton {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 selectedResult = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 showSearchButton = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isSheetPresented = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #61AFEF\">label<\/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\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;magnifyingglass&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 .<\/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 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/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\">background<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">thinMaterial<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Circle<\/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\">shadow<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">radius<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">3<\/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 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">() <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Padding from screen edges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">transition<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">scale<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">combined<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">opacity<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 } <\/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 <\/span><span style=\"color: #61AFEF\">EmptyView<\/span><span style=\"color: #ABB2BF\">()<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Computed property for the sheet&#39;s content view<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> sheetContent: <\/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\">SheetView<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">locationService<\/span><span style=\"color: #ABB2BF\">: locationService)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">presentationDetents<\/span><span style=\"color: #ABB2BF\">([.<\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">250<\/span><span style=\"color: #ABB2BF\">), .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">, .<\/span><span style=\"color: #E06C75\">large<\/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\">presentationBackground<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">regularMaterial<\/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\">presentationBackgroundInteraction<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">enabled<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">upThrough<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">medium<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #61AFEF\">presentationCornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">15<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optional: .interactiveDismissDisabled()<\/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: #7F848E; font-style: italic\">\/\/ MARK: - Helper Functions \/ Handlers (Keep As Is)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">handleSearchResultsChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">newResults<\/span><span style=\"color: #ABB2BF\">: [SearchResult]) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !newResults.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isSheetPresented = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 showSearchButton = <\/span><span style=\"color: #D19A66\">true<\/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 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> newResults.count == <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\"> { selectedResult = newResults.first }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\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\"> region = locationService.region {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">withAnimation<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #61AFEF\">smooth<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">duration<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0.7<\/span><span style=\"color: #ABB2BF\">)) { position = .<\/span><span style=\"color: #61AFEF\">region<\/span><span style=\"color: #ABB2BF\">(region) }<\/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 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 showSearchButton = <\/span><span style=\"color: #D19A66\">false<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">handleSelectionChange<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">newValue<\/span><span style=\"color: #ABB2BF\">: SearchResult?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Selected result changed to: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">newValue?.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\"> ?? <\/span><span style=\"color: #98C379\">&quot;None&quot;<\/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 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> newValue == <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> &amp;&amp; !isSheetPresented &amp;&amp; !searchResults.isEmpty { showSearchButton = <\/span><span style=\"color: #D19A66\">true<\/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\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Fetching handled by .task<\/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\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">handleSheetDismiss<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Sheet dismissed manually.&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !locationService.searchResults.isEmpty { showSearchButton = <\/span><span style=\"color: #D19A66\">true<\/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\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetchLookAroundScene<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">result<\/span><span style=\"color: #ABB2BF\">: SearchResult?) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\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\"> result = result <\/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 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">lookAroundScene<\/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 <\/span><span style=\"color: #C678DD\">return<\/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: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Fetching Look Around scene for <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">result.<\/span><span style=\"color: #E06C75\">name<\/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 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> request = <\/span><span style=\"color: #61AFEF\">MKLookAroundSceneRequest<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">coordinate<\/span><span style=\"color: #ABB2BF\">: result.<\/span><span style=\"color: #E06C75\">location<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \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 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> scene = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> request.<\/span><span style=\"color: #E06C75\">scene<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">lookAroundScene<\/span><span style=\"color: #ABB2BF\"> = scene<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/----<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 isSheetPresented = <\/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: #7F848E; font-style: italic\">\/\/----<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Look Around scene fetched successfully: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">scene != <\/span><span style=\"color: #D19A66\">nil<\/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 } <\/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 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u274c Failed to fetch Look Around scene: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">lookAroundScene<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Extracted Look Around Panel View (Keep As Is)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LookAroundPanelView<\/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\">@Binding<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> scene: MKLookAroundScene?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> resultName: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">?<\/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\">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\">5<\/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: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> name = resultName {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(name)<\/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\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">caption<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">weight<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">semibold<\/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\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">horizontal<\/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\">padding<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">top<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">LookAroundPreview<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">scene<\/span><span style=\"color: #ABB2BF\">: $scene, <\/span><span style=\"color: #61AFEF\">allowsNavigation<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">badgePosition<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">bottomTrailing<\/span><span style=\"color: #ABB2BF\">)<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Observable Extension for Alert Binding (Keep As Is)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">extension<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LocationService<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isErrorPresented: Binding&lt;<\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">Binding<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">get<\/span><span style=\"color: #ABB2BF\">: { <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error != <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> }, <\/span><span style=\"color: #61AFEF\">set<\/span><span style=\"color: #ABB2BF\">: { <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !<\/span><span style=\"color: #E5C07B\">$0<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error = <\/span><span style=\"color: #D19A66\">nil<\/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>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Preview<\/span><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #61AFEF\">SearchableMap<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u043e\u0434 LocationService<strong>.swift<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(3 * 0.6 * .75rem);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\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>import MapKit\nimport CoreLocation \/\/ Ensure CoreLocation is imported\n\/\/ Represents a search suggestion\nstruct SearchCompletions: Identifiable {\n\u00a0 \u00a0 let id = UUID()\n\u00a0 \u00a0 let title: String\n\u00a0 \u00a0 let subTitle: String\n\u00a0 \u00a0 \/\/ We can store the original MKLocalSearchCompletion if needed for more complex actions later\n\u00a0 \u00a0 \/\/ let mapKitCompletion: MKLocalSearchCompletion\n}\n\/\/ Represents a pin\/marker on the map\nstruct SearchResult: Identifiable, Hashable, Equatable {\n\u00a0 \u00a0 let id = UUID()\n\u00a0 \u00a0 let name: String\n\u00a0 \u00a0 let location: CLLocationCoordinate2D\n\u00a0 \u00a0 let mapItem: MKMapItem \/\/ Store the original map item\n\u00a0 \u00a0 \/\/ Conformance for Map selection and comparison\n\u00a0 \u00a0 static func == (lhs: SearchResult, rhs: SearchResult) -> Bool {\n\u00a0 \u00a0 \u00a0 \u00a0 lhs.id == rhs.id\n\u00a0 \u00a0 }\n\u00a0 \u00a0 func hash(into hasher: inout Hasher) {\n\u00a0 \u00a0 \u00a0 \u00a0 hasher.combine(id)\n\u00a0 \u00a0 }\n}\n@Observable \/\/ Use @Observable for modern Swift concurrency state management\nclass LocationService: NSObject, MKLocalSearchCompleterDelegate {\n\u00a0 \u00a0 private let completer: MKLocalSearchCompleter\n\u00a0 \u00a0 private var currentSearch: MKLocalSearch?\n\u00a0 \u00a0 \/\/ &#8212; Published Properties (Observable updates views) &#8212;\n\u00a0 \u00a0 var completions = [SearchCompletions]()\n\u00a0 \u00a0 var searchResults = [SearchResult]()\n\u00a0 \u00a0 var error: Error?\n\u00a0 \u00a0 var region: MKCoordinateRegion? \/\/ Optional region to focus the map\n\u00a0 \u00a0 \/\/ &#8212; Initialization &#8212;\n\u00a0 \u00a0 override init() {\n\u00a0 \u00a0 \u00a0 \u00a0 self.completer = MKLocalSearchCompleter()\n\u00a0 \u00a0 \u00a0 \u00a0 super.init()\n\u00a0 \u00a0 \u00a0 \u00a0 self.completer.delegate = self\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Configure completer (optional: filter results, etc.)\n\u00a0 \u00a0 \u00a0 \u00a0 self.completer.resultTypes = [ .pointOfInterest]\/\/[.address, .pointOfInterest]\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Optionally filter by region if needed\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ self.completer.region = MKCoordinateRegion(.world)\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ &#8212; Public Methods &#8212;\n\u00a0 \u00a0 func update(queryFragment: String) {\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Reset previous results and errors on new query\n\u00a0 \u00a0 \u00a0 \u00a0 self.completions = []\n\u00a0 \u00a0 \u00a0 \u00a0 self.error = nil\n\u00a0 \u00a0 \u00a0 \u00a0 completer.queryFragment = queryFragment\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ &#8212; MKLocalSearchCompleterDelegate &#8212;\n\u00a0 \u00a0 func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Map completer results to our SearchCompletions struct\n\u00a0 \u00a0 \u00a0 \u00a0 self.completions = completer.results.map { completion in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Extracting title parts can be useful if subtitle is long\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ let title = completion.title\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ let subTitle = completion.subtitle\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .init(title: completion.title, subTitle: completion.subtitle \/*, mapKitCompletion: completion *\/)\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 self.error = nil\n\u00a0 \u00a0 }\n\u00a0 \u00a0 func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {\n\u00a0 \u00a0 \u00a0 \u00a0 print(&#171;\u274c Completer failed with error: \\(error.localizedDescription)&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 self.error = error\n\u00a0 \u00a0 \u00a0 \u00a0 self.completions = []\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ &#8212; Search Execution &#8212;\n\u00a0 \u00a0 func search ( with query: String) async {\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Ensure query isn&#8217;t empty\n\u00a0 \u00a0 \u00a0 \u00a0 guard !query.isEmpty else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.searchResults = []\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.region = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Cancel any ongoing search\n\u00a0 \u00a0 \u00a0 \u00a0 currentSearch?.cancel()\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Prepare the search request\n\u00a0 \u00a0 \u00a0 \u00a0 let request = MKLocalSearch.Request()\n\u00a0 \u00a0 \u00a0 \u00a0 request.naturalLanguageQuery = query\n\u00a0 \u00a0 \u00a0 \/\/ request.resultTypes = [.address, .pointOfInterest]\n\u00a0 \u00a0 \u00a0 \u00a0 request.resultTypes = [ .pointOfInterest]\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ You could bias search results towards the current map view region if desired\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ if let mapRegion = self.currentMapRegion { \/\/ Assuming you have a way to get the current map region\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ \u00a0 \u00a0 request.region = mapRegion\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ }\n\u00a0 \u00a0 \u00a0 \u00a0 let search = MKLocalSearch(request: request)\n\u00a0 \u00a0 \u00a0 \u00a0 self.currentSearch = search\n\u00a0 \u00a0 \u00a0 \u00a0 self.error = nil \/\/ Reset error before search\n\u00a0 \u00a0 \u00a0 \u00a0 print(&#171;\u27a1\ufe0f Performing search for: \\(query)&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 do {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let response = try await search.start()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.currentSearch = nil \/\/ Clear current search reference\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Map MKMapItems to our SearchResult struct\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.searchResults = response.mapItems.compactMap { mapItem in\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 guard let location = mapItem.placemark.location?.coordinate else { return nil }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return SearchResult(name: mapItem.name ?? &#171;Unknown Place&#187;, location: location, mapItem: mapItem)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Calculate a region encompassing all results\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.region = calculateRegion(for: self.searchResults)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print(&#171;\u2705 Search successful, found \\(self.searchResults.count) results.&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 } catch {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.currentSearch = nil \/\/ Clear current search reference\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Handle errors, including cancellation\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if let nsError = error as NSError?, nsError.code == NSUserCancelledError {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print(&#187; Canceled search.&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Don&#8217;t necessarily clear results if cancelled due to new search starting\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else if let mkError = error as? MKError, mkError.code == .placemarkNotFound {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print(&#171;\u2139\ufe0f No results found for &#8216;\\(query)&#8217;.&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.searchResults = []\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.region = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Optionally set a specific &#171;not found&#187; error state instead of generic error\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 print(&#171;\u274c Search failed with error: \\(error.localizedDescription)&#187;)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.error = error\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.searchResults = []\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.region = nil\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ Helper function to search based on a completion item\n\u00a0 \u00a0 func search(for completion: SearchCompletions) async {\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Create a more specific query from the completion\n\u00a0 \u00a0 \u00a0 \u00a0 let query = &#171;\\(completion.title), \\(completion.subTitle)&#187;\n\u00a0 \u00a0 \u00a0 \u00a0 await search(with: query)\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ &#8212; Helper for calculating region &#8212;\n\u00a0 \u00a0 private func calculateRegion(for results: [SearchResult]) -> MKCoordinateRegion? {\n\u00a0 \u00a0 \u00a0 \u00a0 guard !results.isEmpty else { return nil }\n\u00a0 \u00a0 \u00a0 \u00a0 if results.count == 1, let firstResult = results.first {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ For a single result, center on it with a reasonable span\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return MKCoordinateRegion(center: firstResult.location, latitudinalMeters: 1000, longitudinalMeters: 1000) \/\/ 1km span\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ For multiple results, calculate bounding box\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var minLat = 90.0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var maxLat = -90.0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var minLon = 180.0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var maxLon = -180.0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 for result in results {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let coord = result.location\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 minLat = min(minLat, coord.latitude)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 maxLat = max(maxLat, coord.latitude)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 minLon = min(minLon, coord.longitude)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 maxLon = max(maxLon, coord.longitude)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let center = CLLocationCoordinate2D(latitude: (minLat + maxLat) \/ 2.0, longitude: (minLon + maxLon) \/ 2.0)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 let span = MKCoordinateSpan(latitudeDelta: (maxLat &#8212; minLat) * 1.4, longitudeDelta: (maxLon &#8212; minLon) * 1.4) \/\/ Add padding (* 1.4)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return MKCoordinateRegion(center: center, span: span)\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n}<\/textarea><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\">MapKit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CoreLocation<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Ensure CoreLocation is imported<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Represents a search suggestion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SearchCompletions<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> title: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> subTitle: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ We can store the original MKLocalSearchCompletion if needed for more complex actions later<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ let mapKitCompletion: MKLocalSearchCompletion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Represents a pin\/marker on the map<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SearchResult<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Identifiable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Hashable<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">Equatable <\/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\"> id = <\/span><span style=\"color: #61AFEF\">UUID<\/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\"> name: <\/span><span style=\"color: #E5C07B\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> location: CLLocationCoordinate2D<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> mapItem: MKMapItem <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Store the original map item<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Conformance for Map selection and comparison<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">static<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">==<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #61AFEF; font-style: italic\">lhs<\/span><span style=\"color: #ABB2BF\">: SearchResult, <\/span><span style=\"color: #61AFEF; font-style: italic\">rhs<\/span><span style=\"color: #ABB2BF\">: SearchResult) -&gt; <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 lhs.<\/span><span style=\"color: #E06C75\">id<\/span><span style=\"color: #ABB2BF\"> == rhs.<\/span><span style=\"color: #E06C75\">id<\/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\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">hash<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">into<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">hasher<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #C678DD\">inout<\/span><span style=\"color: #ABB2BF\"> Hasher) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 hasher.<\/span><span style=\"color: #61AFEF\">combine<\/span><span style=\"color: #ABB2BF\">(id)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">@Observable<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use @Observable for modern Swift concurrency state management<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">LocationService<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">NSObject<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">MKLocalSearchCompleterDelegate <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> completer: MKLocalSearchCompleter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> currentSearch: MKLocalSearch?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Published Properties (Observable updates views) ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> completions = [SearchCompletions]()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> searchResults = [SearchResult]()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> error: <\/span><span style=\"color: #E5C07B\">Error<\/span><span style=\"color: #ABB2BF\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> region: MKCoordinateRegion? <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optional region to focus the map<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Initialization ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">override<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">completer<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #61AFEF\">MKLocalSearchCompleter<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">super<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">completer<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">delegate<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #E5C07B\">self<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Configure completer (optional: filter results, etc.)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">completer<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">resultTypes<\/span><span style=\"color: #ABB2BF\"> = [ .<\/span><span style=\"color: #E06C75\">pointOfInterest<\/span><span style=\"color: #ABB2BF\">]<\/span><span style=\"color: #7F848E; font-style: italic\">\/\/[.address, .pointOfInterest]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optionally filter by region if needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ self.completer.region = MKCoordinateRegion(.world)<\/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: #7F848E; font-style: italic\">\/\/ --- Public Methods ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">update<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">queryFragment<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Reset previous results and errors on new query<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">completions<\/span><span style=\"color: #ABB2BF\"> = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error = <\/span><span style=\"color: #D19A66\">nil<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 completer.<\/span><span style=\"color: #E06C75\">queryFragment<\/span><span style=\"color: #ABB2BF\"> = queryFragment<\/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: #7F848E; font-style: italic\">\/\/ --- MKLocalSearchCompleterDelegate ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">completerDidUpdateResults<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">completer<\/span><span style=\"color: #ABB2BF\">: MKLocalSearchCompleter) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Map completer results to our SearchCompletions struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">completions<\/span><span style=\"color: #ABB2BF\"> = completer.<\/span><span style=\"color: #E06C75\">results<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #56B6C2\">map<\/span><span style=\"color: #ABB2BF\"> { completion <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Extracting title parts can be useful if subtitle is long<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ let title = completion.title<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ let subTitle = completion.subtitle<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .<\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">title<\/span><span style=\"color: #ABB2BF\">: completion.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">subTitle<\/span><span style=\"color: #ABB2BF\">: completion.<\/span><span style=\"color: #E06C75\">subtitle<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/*, mapKitCompletion: completion *\/<\/span><span style=\"color: #ABB2BF\">)<\/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: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error = <\/span><span style=\"color: #D19A66\">nil<\/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\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">completer<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">completer<\/span><span style=\"color: #ABB2BF\">: MKLocalSearchCompleter, <\/span><span style=\"color: #61AFEF\">didFailWithError<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">error<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Error<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u274c Completer failed with error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error = error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">completions<\/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\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ --- Search Execution ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">search<\/span><span style=\"color: #ABB2BF\"> ( <\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">query<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Ensure query isn&#39;t empty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> !query.isEmpty <\/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 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">searchResults<\/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: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/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 <\/span><span style=\"color: #C678DD\">return<\/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: #7F848E; font-style: italic\">\/\/ Cancel any ongoing search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 currentSearch?.<\/span><span style=\"color: #61AFEF\">cancel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Prepare the search request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> request = MKLocalSearch.<\/span><span style=\"color: #61AFEF\">Request<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 request.<\/span><span style=\"color: #E06C75\">naturalLanguageQuery<\/span><span style=\"color: #ABB2BF\"> = query<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ request.resultTypes = [.address, .pointOfInterest]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 request.<\/span><span style=\"color: #E06C75\">resultTypes<\/span><span style=\"color: #ABB2BF\"> = [ .<\/span><span style=\"color: #E06C75\">pointOfInterest<\/span><span style=\"color: #ABB2BF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ You could bias search results towards the current map view region if desired<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ if let mapRegion = self.currentMapRegion { \/\/ Assuming you have a way to get the current map region<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ \u00a0 \u00a0 request.region = mapRegion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> search = <\/span><span style=\"color: #61AFEF\">MKLocalSearch<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">request<\/span><span style=\"color: #ABB2BF\">: request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">currentSearch<\/span><span style=\"color: #ABB2BF\"> = search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error = <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Reset error before search<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u27a1\ufe0f Performing search for: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">query<\/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 <\/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 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> response = <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> search.start()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">currentSearch<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Clear current search reference<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Map MKMapItems to our SearchResult struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">searchResults<\/span><span style=\"color: #ABB2BF\"> = response.<\/span><span style=\"color: #E06C75\">mapItems<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">compactMap<\/span><span style=\"color: #ABB2BF\"> { mapItem <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \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\"> location = mapItem.placemark.location?.coordinate <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/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 \u00a0 <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">SearchResult<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">name<\/span><span style=\"color: #ABB2BF\">: mapItem.<\/span><span style=\"color: #E06C75\">name<\/span><span style=\"color: #ABB2BF\"> ?? <\/span><span style=\"color: #98C379\">&quot;Unknown Place&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">location<\/span><span style=\"color: #ABB2BF\">: location, <\/span><span style=\"color: #61AFEF\">mapItem<\/span><span style=\"color: #ABB2BF\">: mapItem)<\/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 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Calculate a region encompassing all results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #61AFEF\">calculateRegion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">searchResults<\/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: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u2705 Search successful, found <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">searchResults<\/span><span style=\"color: #ABB2BF\">.count<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\"> results.&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\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 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">currentSearch<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Clear current search reference<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Handle errors, including cancellation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\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\"> nsError = error as NSError?, nsError.code == NSUserCancelledError {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot; Canceled search.&quot;<\/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: #7F848E; font-style: italic\">\/\/ Don&#39;t necessarily clear results if cancelled due to new search starting<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> mkError = error as? MKError, mkError.code == .placemarkNotFound {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u2139\ufe0f No results found for &#39;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">query<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&#39;.&quot;<\/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: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">searchResults<\/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: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/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 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optionally set a specific &quot;not found&quot; error state instead of generic error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/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 \u00a0 <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;\u274c Search failed with error: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.error = error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">searchResults<\/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: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">region<\/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 }<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Helper function to search based on a completion item<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">search<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">completion<\/span><span style=\"color: #ABB2BF\">: SearchCompletions) <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Create a more specific query from the completion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> query = <\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">completion.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">, <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">completion.<\/span><span style=\"color: #E06C75\">subTitle<\/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 <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">search<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: query)<\/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: #7F848E; font-style: italic\">\/\/ --- Helper for calculating region ---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">calculateRegion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">results<\/span><span style=\"color: #ABB2BF\">: [SearchResult]) -&gt; MKCoordinateRegion? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> !results.isEmpty <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/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 <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> results.count == <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> firstResult = results.<\/span><span style=\"color: #56B6C2\">first<\/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: #7F848E; font-style: italic\">\/\/ For a single result, center on it with a reasonable span<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">MKCoordinateRegion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">center<\/span><span style=\"color: #ABB2BF\">: firstResult.<\/span><span style=\"color: #E06C75\">location<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">latitudinalMeters<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1000<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">longitudinalMeters<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1000<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ 1km span<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 } <\/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 <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ For multiple results, calculate bounding box<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> minLat = <\/span><span style=\"color: #D19A66\">90.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> maxLat = <\/span><span style=\"color: #D19A66\">-90.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> minLon = <\/span><span style=\"color: #D19A66\">180.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> maxLon = <\/span><span style=\"color: #D19A66\">-180.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> result <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> results {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> coord = result.<\/span><span style=\"color: #E06C75\">location<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 minLat = <\/span><span style=\"color: #56B6C2\">min<\/span><span style=\"color: #ABB2BF\">(minLat, coord.<\/span><span style=\"color: #E06C75\">latitude<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 maxLat = <\/span><span style=\"color: #56B6C2\">max<\/span><span style=\"color: #ABB2BF\">(maxLat, coord.<\/span><span style=\"color: #E06C75\">latitude<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 minLon = <\/span><span style=\"color: #56B6C2\">min<\/span><span style=\"color: #ABB2BF\">(minLon, coord.<\/span><span style=\"color: #E06C75\">longitude<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 maxLon = <\/span><span style=\"color: #56B6C2\">max<\/span><span style=\"color: #ABB2BF\">(maxLon, coord.<\/span><span style=\"color: #E06C75\">longitude<\/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 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> center = <\/span><span style=\"color: #61AFEF\">CLLocationCoordinate2D<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">latitude<\/span><span style=\"color: #ABB2BF\">: (minLat + maxLat) \/ <\/span><span style=\"color: #D19A66\">2.0<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">longitude<\/span><span style=\"color: #ABB2BF\">: (minLon + maxLon) \/ <\/span><span style=\"color: #D19A66\">2.0<\/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: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> span = <\/span><span style=\"color: #61AFEF\">MKCoordinateSpan<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">latitudeDelta<\/span><span style=\"color: #ABB2BF\">: (maxLat - minLat) * <\/span><span style=\"color: #D19A66\">1.4<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">longitudeDelta<\/span><span style=\"color: #ABB2BF\">: (maxLon - minLon) * <\/span><span style=\"color: #D19A66\">1.4<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Add padding (* 1.4)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">MKCoordinateRegion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">center<\/span><span style=\"color: #ABB2BF\">: center, <\/span><span style=\"color: #61AFEF\">span<\/span><span style=\"color: #ABB2BF\">: span)<\/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 }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u043e\u0434 SheetView<strong>.swift<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:.75rem;font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);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\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>import SwiftUI\nimport MapKit\nstruct SheetView: View {\n    \/\/ Use @Bindable for two-way binding with @Observable service\n    @Bindable var locationService: LocationService\n    @State private var search: String = &#171;&#187;\n    \/\/ Environment variable to dismiss the sheet\n    @Environment(\\.dismiss) var dismiss\n    var body: some View {\n        VStack(spacing: 0) { \/\/ Use spacing 0 and add padding manually if needed\n            \/\/ Search Bar Area\n            HStack {\n                Image(systemName: &#171;magnifyingglass&#187;)\n                    .foregroundColor(.secondary)\n                TextField(&#171;Search for a place or address&#187;, text: $search)\n                    .autocorrectionDisabled()\n                    .onSubmit(performSearch) \/\/ Search when return key is pressed\n            }\n            .modifier(TextFieldGrayBackgroundColor()) \/\/ Apply custom style\n            .padding()\n            Divider()\n            \/\/ List of Completions\n            List {\n                \/\/ Display suggestions if available\n                ForEach(locationService.completions) { completion in\n                    Button(action: { didTapOnCompletion(completion) }) {\n                        VStack(alignment: .leading, spacing: 4) {\n                            Text(completion.title)\n                                .font(.headline)\n                                .foregroundColor(.primary) \/\/ Ensure text is readable\n                            Text(completion.subTitle)\n                                .font(.subheadline)\n                                .foregroundColor(.secondary)\n                        }\n                    }\n                    .listRowBackground(Color.clear) \/\/ Optional: Make background transparent\n                }\n                \/\/ Show message if query entered but no completions\n                if !search.isEmpty &amp;&amp; locationService.completions.isEmpty &amp;&amp; locationService.error == nil {\n                    ContentUnavailableView.search(text: search)\n                        \/\/ .listRowBackground(Color.clear) \/\/ Match background if needed\n                }\n            }\n            .listStyle(.plain)\n            .scrollContentBackground(.hidden) \/\/ Hide default list background\n        }\n        \/\/ Update completions live as the user types\n        .onChange(of: search) { _, newValue in\n            locationService.update(queryFragment: newValue)\n        }\n        \/\/ You might want to add error display within the sheet too\n        .alert(&#171;Search Error&#187;, isPresented: Binding(get: { locationService.error != nil }, set: { _ in locationService.error = nil }), presenting: locationService.error) { _ in\n            Button(&#171;OK&#187;) {}\n        } message: { error in\n            Text(error.localizedDescription)\n        }\n    }\n    \/\/ MARK: &#8212; Actions\n    private func performSearch() {\n        guard !search.isEmpty else { return }\n        Task {\n            await locationService.search(with: search)\n            \/\/ Sheet dismissal is now handled by SearchableMap&#8217;s onChange(of: searchResults)\n        }\n    }\n    private func didTapOnCompletion(_ completion: SearchCompletions) {\n        Task {\n            await locationService.search(for: completion)\n            \/\/ Sheet dismissal is now handled by SearchableMap&#8217;s onChange(of: searchResults)\n        }\n    }\n}\n\/\/ MARK: &#8212; View Modifier for Text Field Style\nstruct TextFieldGrayBackgroundColor: ViewModifier {\n    func body(content: Content) -> some View {\n        content\n            .padding(12)\n            .background(Color(.systemGray6)) \/\/ Use semantic colors\n            .cornerRadius(10) \/\/ Slightly rounder corners\n            .foregroundColor(.primary)\n    }\n}<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">MapKit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SheetView<\/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: #7F848E; font-style: italic\">\/\/ Use @Bindable for two-way binding with @Observable service<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Bindable<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> locationService: LocationService<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> search: <\/span><span style=\"color: #E5C07B\">String<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #98C379\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Environment variable to dismiss the sheet<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Environment<\/span><span style=\"color: #ABB2BF\">(\\.<\/span><span style=\"color: #E06C75\">dismiss<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> dismiss<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\">) { <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use spacing 0 and add padding manually if needed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Search Bar Area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;magnifyingglass&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">TextField<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Search for a place or address&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: $search)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">autocorrectionDisabled<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">onSubmit<\/span><span style=\"color: #ABB2BF\">(performSearch) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Search when return key is pressed<\/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\">modifier<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">TextFieldGrayBackgroundColor<\/span><span style=\"color: #ABB2BF\">()) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Apply custom style<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Divider<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ List of Completions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">List<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Display suggestions if available<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">ForEach<\/span><span style=\"color: #ABB2BF\">(locationService.<\/span><span style=\"color: #E06C75\">completions<\/span><span style=\"color: #ABB2BF\">) { completion <\/span><span style=\"color: #C678DD\">in<\/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: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: { <\/span><span style=\"color: #61AFEF\">didTapOnCompletion<\/span><span style=\"color: #ABB2BF\">(completion) }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">alignment<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">leading<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">spacing<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">4<\/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\">(completion.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">headline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Ensure text is readable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(completion.<\/span><span style=\"color: #E06C75\">subTitle<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">subheadline<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">secondary<\/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\">listRowBackground<\/span><span style=\"color: #ABB2BF\">(Color.<\/span><span style=\"color: #E06C75\">clear<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Optional: Make background transparent<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Show message if query entered but no completions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !search.isEmpty &amp;&amp; locationService.completions.isEmpty &amp;&amp; locationService.error == <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    ContentUnavailableView.<\/span><span style=\"color: #61AFEF\">search<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">: search)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ .listRowBackground(Color.clear) \/\/ Match background if needed<\/span><\/span>\n<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\">listStyle<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">plain<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">scrollContentBackground<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">hidden<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Hide default list background<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Update completions live as the user types<\/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\">: search) { _, newValue <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            locationService.<\/span><span style=\"color: #56B6C2\">update<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">queryFragment<\/span><span style=\"color: #ABB2BF\">: newValue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ You might want to add error display within the sheet too<\/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;Search Error&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isPresented<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #61AFEF\">Binding<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">get<\/span><span style=\"color: #ABB2BF\">: { locationService.error != <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> }, <\/span><span style=\"color: #61AFEF\">set<\/span><span style=\"color: #ABB2BF\">: { _ <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> locationService.error = <\/span><span style=\"color: #D19A66\">nil<\/span><span style=\"color: #ABB2BF\"> }), <\/span><span style=\"color: #61AFEF\">presenting<\/span><span style=\"color: #ABB2BF\">: locationService.error) { _ <\/span><span style=\"color: #C678DD\">in<\/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\">        } <\/span><span style=\"color: #61AFEF\">message<\/span><span style=\"color: #ABB2BF\">: { error <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(error.<\/span><span style=\"color: #E06C75\">localizedDescription<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Actions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">performSearch<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> !search.isEmpty <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #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\"> locationService.<\/span><span style=\"color: #61AFEF\">search<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">with<\/span><span style=\"color: #ABB2BF\">: search)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Sheet dismissal is now handled by SearchableMap&#39;s onChange(of: searchResults)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">didTapOnCompletion<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">completion<\/span><span style=\"color: #ABB2BF\">: SearchCompletions) {<\/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\"> locationService.<\/span><span style=\"color: #61AFEF\">search<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">for<\/span><span style=\"color: #ABB2BF\">: completion)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Sheet dismissal is now handled by SearchableMap&#39;s onChange(of: searchResults)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - View Modifier for Text Field Style<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">TextFieldGrayBackgroundColor<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ViewModifier <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">body<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">content<\/span><span style=\"color: #ABB2BF\">: Content) -&gt; <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        content<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">12<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">Color<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">systemGray6<\/span><span style=\"color: #ABB2BF\">)) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Use semantic colors<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">cornerRadius<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">10<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Slightly rounder corners<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">primary<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0421\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0423\u0434\u0430\u043b\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 <code>ZStack<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e <code>.safeAreaInset(edge: .bottom) <\/code>\u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 <code>Map View<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>lookAroundPanel<\/code> (\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 <code>LookAroundPanelView<\/code>) \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f <code>.safeAreaInset<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e <code>.overlay <\/code>\u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 <code>Button<\/code> \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 <code>Map View<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>searchButtonOverlay<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e .<code>animation(.easeInOut, value: showSearchButton)<\/code> \u043f\u043e\u0441\u043b\u0435 .<code>overlay <\/code>\u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b <code>.onChange, .task, .sheet, .alert \u0438 .ignoresSafeArea(edges: .top) <\/code>\u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a <code>Map View<\/code> \u043f\u043e\u0441\u043b\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0423\u0434\u0430\u043b\u0435\u043d <code>.ignoresSafeArea(edges: .bottom)<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a <code>.safeAreaInset<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u0436\u043d\u044f\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430.<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u043b\u0438\u0436\u0435 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>.safeAreaInset <\/code>\u043a\u0430\u043a \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f overlay \u0438 \u043b\u0438\u0441\u0442\u0430 <code>sheet<\/code>, \u043c\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u0434\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0448\u0430\u043d\u0441 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Gemini 2.5 Pro<\/code>&nbsp; iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c&nbsp; \u0438 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdEeXNKKotvVDFFeF39M9N4b6_gvniLwnru6cGzeqvOSwhnK3_OVweSKZc092Wz_Y9GQEMxQBFGepx4j2ArbYYq1i5zzQg8RrzI16AIXHNYAUe5QIR_QX2LzqmqHiCo7zeLH_kbFA?key=49AVqPDHsG2Qc4B2UPVrYZoT\" alt=\"\" style=\"width:614px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0435\u043d\u0430: \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u0435\u0437\u0443\u043f\u0440\u0435\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430<a href=\"https:\/\/github.com\/BestKora\/SearchableMapGemini2_5\" title=\"\"> GitHub<\/a>.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Gemini 2.5 Pro:<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\"><strong>\u041c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430:<\/strong> \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u0442\u043e\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u0439 <code>LocationService<\/code>? <code>Gemini 2.5 Pro<\/code> \u0440\u0430\u0441\u043f\u0443\u0442\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b <code>SheetView<\/code> \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0433\u0434\u0435 \u043f\u043e\u043f\u0430\u043b\u043e. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u043b \u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0441\u0443\u043f\u0435\u0440-\u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u043a\u043e\u0434\u0435. <em>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e?<\/em> \u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0433\u0438 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 \u0441\u043f\u0430\u0433\u0435\u0442\u0442\u0438. \u041e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0440\u0443\u0442\u0438\u043d\u0435.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0417\u0430\u043a\u043b\u0438\u043d\u0430\u0442\u0435\u043b\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432:<\/strong> \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0437 <code>MapKit (MKLocalSearchCompleter)<\/code>? \u0413\u043e\u0442\u043e\u0432\u043e. \u041d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (<code>MKLocalSearch)<\/code>? \u0411\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0443\u0436\u0435\u043d \u0442\u043e\u0442 \u043a\u0440\u0443\u0442\u043e\u0439 <code>LookAroundPreview<\/code>? <code>Gemini<\/code> \u0437\u043d\u0430\u043b \u043d\u0443\u0436\u043d\u044b\u0435 <code>API <\/code>\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (<code>async\/await<\/code>) \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u044f \u0443\u0441\u043f\u0435\u043b\u0430 \u0431\u044b \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c <code>import MapKit<\/code>. \u041e\u043d \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u0433\u043b\u043e\u0442\u0438\u043b \u0432\u0441\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e <code>MapKit<\/code>.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u041f\u0440\u043e\u0444\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432:<\/strong> \u041e\u043d \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u043d\u0430\u043b <code>API<\/code>, \u043d\u043e \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, <em>\u043a\u0430\u043a<\/em> \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 &#171;\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430&#187; \u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 <code>@State <\/code>\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c UI \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u043d\u043e <code>Gemini<\/code> \u0441\u043e\u0431\u0440\u0430\u043b \u0438\u0445 \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u041f\u043e\u0437\u0436\u0435 \u043e\u043d \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0438 <code>View<\/code> \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438\u043b\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438:<\/strong> \u041e\u043d \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0444\u0438\u0447\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0441 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 <code>Look Around<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430&#8230; \u043e\u043d \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u043d\u043e\u0441\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043a \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044e:<\/strong> \u041c\u043e\u0433 \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0443.<\/span><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Gemini 2.5 Pro:<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><span style=\"font-weight: 400;\">\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u043d\u0438\u044f:<\/span><\/strong> \u0418\u043d\u043e\u0433\u0434\u0430 <code>Gemini<\/code> \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043a\u043e\u0434 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438, \u043d\u043e \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438. \u0421\u0430\u043c\u044b\u043c \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u0431\u044b\u043b<code> ignoresSafeArea(edges: .top, treatingAs: .edge).<\/code> \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>treatingAs<\/code>? \u0415\u0433\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! \u041e\u043d \u0441\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 (\u043d\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439) \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430. \u042d\u0442\u0430 \u0445\u0438\u0442\u0440\u043e\u0443\u043c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0439\u0442\u0438. \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <code>onDismis<\/code>s \u0431\u044b\u043b\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c.<\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0416\u043e\u043d\u0433\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c:<\/strong> \u0425\u043e\u0442\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043d \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d <em>\u043f\u043e\u0447\u0442\u0438<\/em> \u0442\u0435\u0440\u044f\u0435\u0442 \u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u0442\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0441 \u043c\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0415\u0433\u043e \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0440\u043e\u0447\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0434\u0430\u0432\u0430\u043b\u0430 \u0441\u0431\u043e\u0439 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\"><strong>\u0423\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u043a\u043b\u044e\u0447 (\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0430\u0432):<\/strong> \u0418\u0418 \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u043e\u0441\u0438\u0442 \u0438 \u0431\u043b\u0435\u0441\u0442\u044f\u0449\u0438\u0439, \u0438 \u0433\u043b\u044e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0442\u0438\u043b\u0435 &#171;\u0414\u0435\u0440\u0436\u0438, \u0447\u0435\u043b\u043e\u0432\u0435\u043a!&#187;. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e &#171;\u0425\u043c, \u043d\u0430\u0441\u0447\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u0443\u0441\u043a\u0430 \u044f \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d&#8230;&#187;, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e <em>\u0432\u044b<\/em> \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043a\u0435\u043f\u0442\u0438\u043a\u043e\u043c, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c, \u0442\u0435\u043c, \u043a\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443.<\/span><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0424\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u043e\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412 \u043a\u043e\u043d\u0446\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u0442\u0430\u043d\u0434\u0435\u043c\u0430 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e: <code>Gemini 2.5 Pro Experimental <\/code>\u2014 \u044d\u0442\u043e \u043d\u0435 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u043f\u0430\u043b\u043e\u0447\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0442\u0430\u043b\u0430\u043d\u0442\u043b\u0438\u0432\u044b\u0439, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0441\u0435\u044f\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u0436\u0451\u0440. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u043c\u043e\u043b\u043d\u0438\u0435\u043d\u043e\u0441\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u043e \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e <code>SwiftUI<\/code> \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0439 <code>Views<\/code> \u0438\u043b\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u0435\u043c\u0443 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u0430 \u0442\u0432\u0435\u0440\u0434\u0430\u044f \u0440\u0443\u043a\u0430 \u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u0430\u0432\u043d\u0438\u043a\u0430.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0418\u0418-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430 \u0432\u0440\u043e\u0434\u0435 <code>Gemini 2.5 Pro Experimental <\/code>\u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u2014 \u043d\u0435 \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u043b\u044f\u0439\u0442\u0435\u0441\u044c! \u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435, \u0447\u0442\u043e \u043e\u043d \u0432\u0430\u043c \u043d\u0430\u0433\u0435\u043d\u0435\u0440\u0438\u043b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit:&nbsp; \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 API, \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u043c iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u0442\u0435 &hellip; <a href=\"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/\">\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":[131,141,139,14,54,132],"tags":[31,56,140,116],"class_list":["post-17007","post","type-post","status-publish","format-standard","hentry","category-ai","category-gemini-2-5-pro","category-google-ai-studio","category-swift","category-swiftui","category-132","tag-swift","tag-swiftui","tag--gemini-2-5-pro","tag-116"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439\" \/>\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=\"gemini 2.5 pro,mapkit,lookaround\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/\" \/>\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=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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=\"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-05-05T09:39:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-05-31T09:48:26+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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=\"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439\" \/>\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\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#article\",\"name\":\"\\u0421\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435 SwiftUI iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u201c\\u041a\\u0430\\u0440\\u0442\\u0430 \\u0441 \\u043f\\u043e\\u0438\\u0441\\u043a\\u043e\\u043c\\u201d \\u0432 \\u0442\\u0430\\u043d\\u0434\\u0435\\u043c\\u0435 \\u0441 \\u0418\\u0418 Gemini 2.5 Pro Experimental | \\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\":\"\\u0421\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435 SwiftUI iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u201c\\u041a\\u0430\\u0440\\u0442\\u0430 \\u0441 \\u043f\\u043e\\u0438\\u0441\\u043a\\u043e\\u043c\\u201d\\u00a0 \\u0432 \\u0442\\u0430\\u043d\\u0434\\u0435\\u043c\\u0435 \\u0441 \\u0418\\u0418 Gemini 2.5 Pro Experimental\\u00a0\",\"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\\\/2025\\\/05\\\/Screenshot-2025-05-06-at-12.20.54.png\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#articleImage\",\"width\":1374,\"height\":1408},\"datePublished\":\"2025-05-05T09:39:42+00:00\",\"dateModified\":\"2025-05-31T09:48:26+00:00\",\"inLanguage\":\"ru-RU\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#webpage\"},\"articleSection\":\"AI, Gemini 2.5 Pro, Google AI Studio, Swift, SwiftUI, \\u0418\\u0418, Swift, SwiftUI, \\u0418\\u0418 Gemini 2.5 Pro, \\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\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#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\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#listItem\",\"name\":\"\\u0421\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435 SwiftUI iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u201c\\u041a\\u0430\\u0440\\u0442\\u0430 \\u0441 \\u043f\\u043e\\u0438\\u0441\\u043a\\u043e\\u043c\\u201d\\u00a0 \\u0432 \\u0442\\u0430\\u043d\\u0434\\u0435\\u043c\\u0435 \\u0441 \\u0418\\u0418 Gemini 2.5 Pro Experimental\\u00a0\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#listItem\",\"position\":3,\"name\":\"\\u0421\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435 SwiftUI iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u201c\\u041a\\u0430\\u0440\\u0442\\u0430 \\u0441 \\u043f\\u043e\\u0438\\u0441\\u043a\\u043e\\u043c\\u201d\\u00a0 \\u0432 \\u0442\\u0430\\u043d\\u0434\\u0435\\u043c\\u0435 \\u0441 \\u0418\\u0418 Gemini 2.5 Pro Experimental\\u00a0\",\"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\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#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\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#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\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#webpage\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/\",\"name\":\"\\u0421\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435 SwiftUI iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u044f \\u201c\\u041a\\u0430\\u0440\\u0442\\u0430 \\u0441 \\u043f\\u043e\\u0438\\u0441\\u043a\\u043e\\u043c\\u201d \\u0432 \\u0442\\u0430\\u043d\\u0434\\u0435\\u043c\\u0435 \\u0441 \\u0418\\u0418 Gemini 2.5 Pro Experimental | \\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\":\"iOS 17 \\u043f\\u0440\\u0438\\u043d\\u0435\\u0441\\u043b\\u0430 \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u0447\\u0438\\u043a\\u0430\\u043c SwiftUI \\u043d\\u0430\\u0441\\u0442\\u043e\\u044f\\u0449\\u0438\\u0439 \\u043f\\u043e\\u0434\\u0430\\u0440\\u043e\\u043a \\u043e\\u0442 MapKit \\u2014 \\u043a\\u0443\\u0447\\u0443 \\u043d\\u043e\\u0432\\u044b\\u0445 \\u0444\\u0438\\u0448\\u0435\\u043a, \\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0435 \\u043d\\u0435 \\u043f\\u043e\\u0442\\u0440\\u0435\\u0431\\u0443\\u044e\\u0442 \\u043d\\u0438\\u043a\\u0430\\u043a\\u0438\\u0445 \\u0448\\u0430\\u043c\\u0430\\u043d\\u0441\\u043a\\u0438\\u0445 \\u0431\\u0443\\u0431\\u043d\\u043e\\u0432 \\u0438 \\u043a\\u043e\\u0441\\u0442\\u044b\\u043b\\u0435\\u0439 \\u0438\\u0437 UIKit: \\u043d\\u043e\\u0432\\u044b\\u0439 Map (position:selection:content:) \\u0437\\u0430\\u0434\\u0430\\u0435\\u0442 \\u043f\\u043e\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u043a\\u0430\\u043c\\u0435\\u0440\\u044b position \\u0438 \\u043e\\u0442\\u0441\\u043b\\u0435\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 \\u0432\\u044b\\u0431\\u043e\\u0440 selection \\u043d\\u0430 \\u043a\\u0430\\u0440\\u0442\\u0435, \\u0432\\u043d\\u0443\\u0442\\u0440\\u044c \\u043a\\u0430\\u0440\\u0442\\u044b Map \\u043c\\u043e\\u0436\\u043d\\u043e \\u0434\\u043e\\u0431\\u0430\\u0432\\u043b\\u044f\\u0442\\u044c \\u0430\\u043d\\u043d\\u043e\\u0442\\u0430\\u0446\\u0438\\u0438, \\u043c\\u0430\\u0440\\u043a\\u0435\\u0440\\u044b, \\u043f\\u043e\\u043b\\u0438\\u0433\\u043e\\u043d\\u044b, \\u043c\\u0430\\u0440\\u0448\\u0440\\u0443\\u0442\\u044b \\u0447\\u0435\\u0440\\u0435\\u0437 \\u043e\\u0431\\u044b\\u0447\\u043d\\u044b\\u0439 SwiftUI DSL (ForEach, Marker, Annotation \\u0438 \\u0442.\\u0434.), \\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0439\",\"inLanguage\":\"ru-RU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"datePublished\":\"2025-05-05T09:39:42+00:00\",\"dateModified\":\"2025-05-31T09:48:26+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":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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":"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439","canonical_url":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"gemini 2.5 pro,mapkit,lookaround","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#article","name":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d\u00a0 \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental\u00a0","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\/2025\/05\/Screenshot-2025-05-06-at-12.20.54.png","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#articleImage","width":1374,"height":1408},"datePublished":"2025-05-05T09:39:42+00:00","dateModified":"2025-05-31T09:48:26+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#webpage"},"isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#webpage"},"articleSection":"AI, Gemini 2.5 Pro, Google AI Studio, Swift, SwiftUI, \u0418\u0418, Swift, SwiftUI, \u0418\u0418 Gemini 2.5 Pro, \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\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#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\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#listItem","name":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d\u00a0 \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental\u00a0"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#listItem","position":3,"name":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d\u00a0 \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental\u00a0","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\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#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\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#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\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#webpage","url":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/","name":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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":"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#website"},"breadcrumb":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/#breadcrumblist"},"author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"creator":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"datePublished":"2025-05-05T09:39:42+00:00","dateModified":"2025-05-31T09:48:26+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":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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":"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439","og:url":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/","article:published_time":"2025-05-05T09:39:42+00:00","article:modified_time":"2025-05-31T09:48:26+00:00","twitter:card":"summary","twitter:title":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental | \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":"iOS 17 \u043f\u0440\u0438\u043d\u0435\u0441\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c SwiftUI \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u0430\u0440\u043e\u043a \u043e\u0442 MapKit \u2014 \u043a\u0443\u0447\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0445 \u0431\u0443\u0431\u043d\u043e\u0432 \u0438 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0438\u0437 UIKit: \u043d\u043e\u0432\u044b\u0439 Map (position:selection:content:) \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b position \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 selection \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u0430\u0440\u0442\u044b Map \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 SwiftUI DSL (ForEach, Marker, Annotation \u0438 \u0442.\u0434.), \u043a\u043e\u0442\u043e\u0440\u044b\u0439"},"aioseo_meta_data":{"post_id":"17007","title":null,"description":null,"keywords":[{"label":"Gemini 2.5 Pro","value":"Gemini 2.5 Pro"},{"label":"MapKit","value":"MapKit"},{"label":"LookAround","value":"LookAround"}],"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":"2025-05-05 09:38:30","updated":"2026-02-22 19:50:50","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\t\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d  \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental \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":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SwiftUI iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u201c\u041a\u0430\u0440\u0442\u0430 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c\u201d\u00a0 \u0432 \u0442\u0430\u043d\u0434\u0435\u043c\u0435 \u0441 \u0418\u0418 Gemini 2.5 Pro Experimental\u00a0","link":"https:\/\/bestkora.com\/IosDeveloper\/%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d0%b5-swiftui-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d1%81-%d0%bf%d0%be%d0%b8%d1%81%d0%ba\/"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/17007","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=17007"}],"version-history":[{"count":4,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/17007\/revisions"}],"predecessor-version":[{"id":17039,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/17007\/revisions\/17039"}],"wp:attachment":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/media?parent=17007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/categories?post=17007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/tags?post=17007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}