{"id":305855,"date":"2020-06-24T15:00:38","date_gmt":"2020-06-24T15:00:38","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305855"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305855","title":{"rendered":"SwiftUI 2020. \u0427\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c?"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/508002\/\">\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0430\u0441, \u0436\u0438\u0442\u0435\u043b\u0438 \u0425\u0430\u0431\u0440\u0430 \u0438 \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u043e\u0434 IOS. \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0410\u043d\u043d\u0430 \u0416\u0430\u0440\u043a\u043e\u0432\u0430, Senior iOS\/Android \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/usetech.ru\" rel=\"nofollow\">Usetech<\/a><br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0438 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Apple \u043d\u0430 WWDC 2020. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0438 \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 SwiftUI. <\/p>\n<p>  \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u043b\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430 WWDC 2019. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u043d\u0435\u0439 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/500194\/\">\u0441\u044e\u0434\u0430<\/a><\/p>\n<p>  \u0418\u0442\u0430\u043a. Apple \u0438 \u0438\u0445 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0433\u043e\u0434 \u0441\u043b\u0435\u0434\u0438\u043b\u0438 \u0437\u0430 \u043e\u0431\u0437\u043e\u0440\u0430\u043c\u0438, \u0441\u0442\u0430\u0442\u044c\u044f\u043c\u0438, \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432-\u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u043e\u0432. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0432\u0438\u0434\u0435\u043e <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10041\/\" rel=\"nofollow\">\u00abWhat&#8217;s new in SwiftUI\u00bb<\/a> \u043e\u043d\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u044e\u0442 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u043c \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u043d\u044b\u043c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c SwiftUI \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (\u043e\u0442 watchOS \u0434\u043e macOS):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/du\/nh\/vu\/dunhvuvnryo4i2yqw7187tqimp0.png\"><br \/>  <a name=\"habracut\"><\/a><br \/>  \u041f\u0440\u0438\u0447\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0441\u0442\u0438 \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0412 Xcode 12 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wl\/u2\/g8\/wlu2g8doeqfmm7i2airnzx0wih0.png\" width=\"70%\"><\/p>\n<p>  \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 Shared-\u0431\u043b\u043e\u043a\u043e\u043c \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u0430\u043c\u0438, \u0433\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dg\/ui\/ao\/dguiaodpdzfhm4_cve-4dvypmb0.png\" width=\"70%\"><\/p>\n<p>  \u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u044d\u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438<s> \u0432 Kotlin Multiplatform<\/s>. \u0427\u0442\u043e \u0436, \u0432\u0438\u0434\u0438\u043c\u043e, \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0442\u0440\u0435\u043d\u0434 \u043d\u0430 \u044f\u0432\u043d\u043e\u0435 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b Apple \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. <\/p>\n<p>  \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b UIKit \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 SwiftUI<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hg\/e-\/er\/hge-erzxainfznriyxzzvdpsqka.png\"><\/p>\n<p>  \u041d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0432 SwiftUI \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433 UICollectionView \u2014 LazyVGrid\/LazyHGrid, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 GridItem:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tj\/yv\/yq\/tjyvyq8x2qehjqv2yov6nas2o8w.png\"><\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043d\u043e\u0432\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u043c Apple \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 UITableView\/UICollectionView \u0432 UIKit. <\/p>\n<p>  \u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 UI (\u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432, \u0448\u0440\u0438\u0444\u0442, \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u0442.\u043f). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0442\u0440\u0438\u0431\u0443\u0442 @ScaledMetric \u0443 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-y\/6j\/vo\/-y6jvowpqbs2dwswuouq36mtahc.png\"><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u043d\u0430 SwiftUI.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/p8\/xe\/0d\/p8xe0dnntxm0pyanrxxeklj_efk.png\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 ViewState:<\/p>\n<pre><code class=\"swift\">Map(coordinateRegion: &lt;#T##Binding&lt;MKCoordinateRegion&gt;#&gt;) <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Document Based Apps, Widgets, App Clips. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 2 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0444\u0438\u0447\u0430\u043c\u0438 iOS SDK 14. \u0412\u0438\u0434\u0436\u0435\u0442\u044b \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043d\u0430\u043b\u043e\u0433 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0432 Android. <\/p>\n<p>  \u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u044b \u0438 \u0432\u0438\u0434\u0435\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u043e\u0442-\u0432\u043e\u0442 \u043d\u0430 WWDC 2020. <\/p>\n<p>  \u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c:<\/p>\n<p>  <b>1.<\/b> \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. Memory Performance. <\/p>\n<p>  \u042d\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Swift 5.3 \u0432 \u0446\u0435\u043b\u043e\u043c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u043e\u043a, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 (heap), \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/v7\/tx\/fl\/v7txflgrvlrjddwghhpsfvtrvxi.png\"><\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0432 \u0441\u0430\u043c\u043e\u043c SwiftUI \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Lazy \u043f\u043e\u0434\u0445\u043e\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0435 \u0436\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 LazyVGrid\/LazyHGrid(\u0430\u043d\u0430\u043b\u043e\u0433 UICollectionView). \u041f\u043e \u0438\u0434\u0435\u0435, \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 View \u0441\u0440\u0430\u0437\u0443. <i>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u043e NavigationLink\u2026 <\/i>. <\/p>\n<p>  <b>2.<\/b> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 DSL \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 ViewBuilder. <\/p>\n<p>  \u0423\u0440\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c if\/else \u0438\u043b\u0438 switch-case \u0432 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0446\u0435\u043b\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 Child View \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e View. \u0418\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 NavigationView.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/r8\/yg\/uh\/r8yguhghgm5janwtjltpjuuap48.png\"><\/p>\n<p>  \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. <\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u043e @PropertyWrapper \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u0430: <\/p>\n<pre><code class=\"swift\">@State private var isVisible = true if isVisible == true {     Text(&quot;Hello&quot;) \/\/ Only rendered when isVisible is true. } <\/code><\/pre>\n<p>  <b>3.<\/b> \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 100% \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 SwiftUI. <\/p>\n<p>  \u0414\u0430-\u0434\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e Apple \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438, \u043a\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 AppDelegate, SceneDelegate \u0438 UIHostingViewController. <\/p>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/habr.com\/ru\/users\/main\/\" class=\"user_link\">main<\/a> \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 App, Scene \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c:<\/p>\n<pre><code class=\"swift\">@main struct testmultiplatformApp: App {   @SceneBuilder var body: some Scene {         WindowGroup {             MailViewer()         }         Settings {             SettingsView()         }     } } <\/code><\/pre>\n<p>  <a href=\"https:\/\/habr.com\/ru\/users\/main\/\" class=\"user_link\">main<\/a> \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u043e\u0432\u0430\u044f \u0432\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 App \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0438\u043f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 body \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b App. \u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0446\u0435\u043d, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Scene. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0446\u0435\u043d\u044b \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 root View \u0438 \u0441\u0432\u043e\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0446\u0435\u043d (\u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043c\u043d\u043e\u0433\u043e\u043e\u043a\u043e\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438), \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443 body \u0430\u0442\u0440\u0438\u0431\u0443\u0442 SceneBuilder. \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 UISceneDelegate \u0438 \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>  WindowGroup \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430, \u043a\u0430\u043a \u0438 UIWindow\/UIWindowScene. <\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e SwiftUI \u2014 \u044d\u0442\u043e \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0430\u0434 UIKit. \u0418 UIKit \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438. \u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u0430\u0436\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0432 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 View \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8o\/sz\/kz\/8oszkzjav2bu2vz2osxpskekbai.png\"><\/p>\n<p>  \u0418 UIHostingViewController \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0438 UIWindowScene. \u041d\u043e \u0432\u043d\u0443\u0442\u0440\u0438. \u0414\u0430, \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u043b\u0438 \u043e\u043d\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 UISceneDelegate \u0441 \u044f\u0432\u043d\u044b\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>  \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 lifecycle \u0441\u0446\u0435\u043d\u044b \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<pre><code class=\"swift\">public func onChange&lt;V&gt;(of value: V, perform action: @escaping (V) -&gt; Void) -&gt; some Scene where V : Equatable <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<pre><code class=\"swift\">  \/\/\/     \/\/\/ Use this modifier to trigger a side effect when a value changes, like     \/\/\/ the value associated with an ``SwiftUI\/Environment`` key or a     \/\/\/ ``SwiftUI\/Binding``. For example, you can clear a cache when you notice     \/\/\/ that a scene moves to the background:     \/\/\/     \/\/\/     struct MyScene: Scene {     \/\/\/         @Environment(\\.scenePhase) private var scenePhase     \/\/\/         @StateObject private var cache = DataCache()     \/\/\/     \/\/\/         var body: some Scene {     \/\/\/             WindowGroup {     \/\/\/                 MyRootView()     \/\/\/             }     \/\/\/             .onChange(of: scenePhase) { newScenePhase in     \/\/\/                 if newScenePhase == .background {     \/\/\/                     cache.empty()     \/\/\/                 }     \/\/\/             }     \/\/\/         }     \/\/\/     }     \/\/\/     \/\/\/ The system calls the `action` closure on the main thread, so avoid     \/\/\/ long-running tasks in the closure. If you need to perform such tasks,     \/\/\/ dispatch to a background queue:     \/\/\/     \/\/\/     .onChange(of: scenePhase) { newScenePhase in     \/\/\/         if newScenePhase == .background {     \/\/\/             DispatchQueue.global(qos: .background).async {     \/\/\/                 \/\/ ...     \/\/\/             }     \/\/\/         }     \/\/\/     }     \/\/\/     \/\/\/ The system passes the new value into the closure. If you need the old     \/\/\/ value, capture it in the closure.     \/\/\/ <\/code><\/pre>\n<p>  <b>4.<\/b> \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f SwiftUI. <\/p>\n<p>  \u0412\u0438\u0434\u0435\u043e-\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043d\u043e \u0441\u0443\u0434\u044f \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435, \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 MVVM, \u0430 MVI \u0438\u043b\u0438 Redux: <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/k6\/jx\/px\/k6jxpxica4d1hvfu2vxacggl3tm.png\"><\/p>\n<p>  \u0414\u0430-\u0434\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0435\u0439. <\/p>\n<p>  \u0427\u0442\u043e \u0436, \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u043d\u0434\u0430 \u043d\u0430 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432. \u041f\u043e\u043a\u0430 Google \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f SwiftUI \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 JetPack Compose, Apple \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 Google. \u041d\u0443 \u0430 \u0444\u0430\u043a\u0442 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0443 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u043e\u0432 Apple \u0438 \u043d\u0435 \u0441\u043a\u0440\u044b\u0432\u0430\u043b\u0438. \u0421\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0438\u043c\u0435\u043d\u043d\u043e Redux\/MVI \u0441 SwiftUI, \u0432 \u0441\u0435\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0435\u0449\u0435 \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430: <a href=\"https:\/\/blog.scottlogic.com\/2020\/02\/06\/Exploring-SwiftUI-4-redux-bindable.html\" rel=\"nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a>.<\/p>\n<p>  \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<p>  \u0418 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435. \u0421\u0435\u0441\u0441\u0438\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u0440\u0430\u0437\u0433\u0430\u0440\u0435, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0435\u0449\u0435 \u0432\u043f\u0435\u0440\u0435\u0434\u0438. \u041d\u043e \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u0435. <\/p>\n<p>  \u041d\u0435 \u0440\u0430\u0441\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u044b\u043b\u0438 \u043f\u043b\u0430\u043d\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0435\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0430\u043c\u0438 SwiftUi \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 \u0431\u0430\u0437\u0443 \u0438 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. <\/p>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a WWDC 2020. \u0418 \u0436\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435) <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u0441\u044b\u043b\u043a\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\"><a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/state-and-data-flow\" rel=\"nofollow\">developer.apple.com\/documentation\/swiftui\/state-and-data-flow<\/a><br \/>  <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10170\/\" rel=\"nofollow\">developer.apple.com\/videos\/play\/wwdc2020\/10170<\/a><br \/>  <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10041\" rel=\"nofollow\">developer.apple.com\/videos\/play\/wwdc2020\/10041<\/a><\/div>\n<\/p><\/div>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/508002\/\"> https:\/\/habr.com\/ru\/post\/508002\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/508002\/\">\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0430\u0441, \u0436\u0438\u0442\u0435\u043b\u0438 \u0425\u0430\u0431\u0440\u0430 \u0438 \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u043e\u0434 IOS. \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u0410\u043d\u043d\u0430 \u0416\u0430\u0440\u043a\u043e\u0432\u0430, Senior iOS\/Android \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/usetech.ru\" rel=\"nofollow\">Usetech<\/a><br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0438 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Apple \u043d\u0430 WWDC 2020. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0438 \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 SwiftUI. <\/p>\n<p>  \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u043b\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430 WWDC 2019. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u043d\u0435\u0439 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/500194\/\">\u0441\u044e\u0434\u0430<\/a><\/p>\n<p>  \u0418\u0442\u0430\u043a. Apple \u0438 \u0438\u0445 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0433\u043e\u0434 \u0441\u043b\u0435\u0434\u0438\u043b\u0438 \u0437\u0430 \u043e\u0431\u0437\u043e\u0440\u0430\u043c\u0438, \u0441\u0442\u0430\u0442\u044c\u044f\u043c\u0438, \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432-\u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u043e\u0432. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0432\u0438\u0434\u0435\u043e <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10041\/\" rel=\"nofollow\">\u00abWhat&#8217;s new in SwiftUI\u00bb<\/a> \u043e\u043d\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u044e\u0442 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u043c \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u043d\u044b\u043c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c SwiftUI \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (\u043e\u0442 watchOS \u0434\u043e macOS):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/du\/nh\/vu\/dunhvuvnryo4i2yqw7187tqimp0.png\">  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305855","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305855"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305855\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}