{"id":412015,"date":"2024-06-29T22:18:05","date_gmt":"2024-06-29T22:18:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=412015"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=412015","title":{"rendered":"<span>\u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. SwiftUI, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u043f\u043e\u0431\u043b\u0438\u0436\u0435?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<details class=\"spoiler\">\n<summary>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043e <strong>SwiftUi<\/strong>, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e. \u041d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <strong>SwiftUI<\/strong> \u043c\u043d\u0435 \u0431\u044b\u043b \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c, \u044f \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u043b \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u043e\u043f\u044b\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u043d\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u0434\u044b\u0445 \u0432\u043e\u043b\u043e\u0441, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f \u0435\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u043d\u0430\u0437\u043e\u0432\u0443. \u0422\u043e\u0433\u0434\u0430 \u0436\u0435, \u044f \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0438 \u0432\u043b\u044e\u0431\u0438\u043b\u0441\u044f \u0432 <strong>SwiftUi<\/strong> \u0442.\u043a. \u043e\u043d \u0434\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>\u041d\u043e \u0432\u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f, \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0441 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0449\u0443\u043f\u0430\u0432 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c <strong>SwiftUI<\/strong> \u043f\u043e\u0433\u043b\u0443\u0431\u0436\u0435. \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043c\u0435\u043b\u043e\u0441\u0442\u044c, \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044f \u0434\u0443\u043c\u0430\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0442\u0438\u0432\u044b\u0439 \u043a\u043e\u043d\u044c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0442\u044c\u0441\u044f. <\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0448\u043b\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0438 \u0421\u043a\u0438\u043b\u043b  \u0435\u0449\u0435 \u043f\u043e\u0432\u044b\u0441\u0438\u043b\u0441\u044f, \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<hr\/>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u043c\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435? \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e <strong>SwiftUI<\/strong> \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0444\u0430\u0432\u043e\u0440\u0438\u0442\u043e\u0432. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e \u0438 \u0434\u0435\u043b\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043a\u043e\u0441\u044f\u043a\u0438, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 <strong>SwiftUI<\/strong>, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 <strong>View<\/strong>, \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442.\u043a. Apple \u0432\u0441\u0435 \u0436\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0443\u0434\u043d\u0430 \u0434\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u043e <strong>SwiftUI<\/strong>, \u044f \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0443\u044e \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0443 \u043f\u043e \u043d\u0435\u043c\u0443 (\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0412\u044b \u0435\u0451 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0434\u0435\u0441\u044c &#8212; <a href=\"https:\/\/habr.com\/ru\/post\/591775\/\" rel=\"noopener noreferrer nofollow\">\u0422\u044b\u0446<\/a>). \u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0443 \u043f\u043e \u0430\u0437\u0430\u043c \u0442.\u043a. \u0442\u0430\u043c \u0432\u044b \u043d\u0430\u0432\u0440\u044f\u0442\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u043d\u043e\u0432\u043e\u0435\/\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u0430 \u0432\u043e\u0442 \u0442\u0435\u043c\u043e\u0439 \u044d\u0442\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. <\/p>\n<p><strong><em><sub>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! <\/sub><\/em><\/strong><em><sub>\u041f\u043e\u0434\u0430\u0447\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0433\u0438\u043f\u0435\u0440\u0431\u043e\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430 \u0442.\u043a. \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0447\u0438\u0442\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0443\u0440\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c.<\/sub><\/em><\/p>\n<h2>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u043c\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 <strong>SwiftUI<\/strong> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 <strong>AppStore<\/strong>, \u043e\u043d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 &#8212; <a href=\"https:\/\/apps.apple.com\/us\/app\/%D1%80%D0%B0%D1%81%D1%85%D0%BE%D0%B4%D1%8B-%D1%83%D1%87%D0%B5%D1%82-%D1%80%D0%B0%D1%81%D1%85%D0%BE%D0%B4%D0%BE%D0%B2-becosts\/id1604140188\" rel=\"noopener noreferrer nofollow\">\u0422\u044b\u0446<\/a>.<\/p>\n<p>\u0412 \u043d\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u0430\u0431\u043e\u0440: <strong>CoreData<\/strong>, <strong>UserDefault<\/strong> \u0438 <strong>SwiftUI<\/strong>.<\/p>\n<h3>\u0421\u043e\u0441\u0442\u0430\u0432 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/h3>\n<ul>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u0435\u043a(\u043e\u0431\u0435\u0440\u0442\u043e\u043a) \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 (NSPredicate)<\/p>\n<\/li>\n<li>\n<p>@ViewBuilder<\/p>\n<\/li>\n<li>\n<p>Optional(nil) != nil<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e NavigationView<\/p>\n<\/li>\n<\/ul>\n<h4>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/h4>\n<pre><code class=\"swift\">struct MyView: View {          @State var isDisplacedText: Bool = false     @State var isDisplacedRectangle: Bool = false          var body: some View {         VStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .offset(y: isDisplacedText ? 100 : 0)             Rectangle()                 .offset(y: isDisplacedRectangle ? 100 : 0)         }         .padding(.top, isDisplacedText ? 100 : 0)         .padding(.top, isDisplacedRectangle ? 100 : 0)     }  }<\/code><\/pre>\n<p>\u041d\u0435\u0437\u0430\u0442\u0435\u0439\u043b\u0438\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0445\u043e\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u043c\u043d\u043e\u0433\u0438\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u0435\u0433\u043e \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u043e\u0441\u044f\u0442 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u044f\u0437\u044b\u043a\u0430. \u0412\u043e\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 (\u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434) \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"swift\">struct MyView: View {          @State var isDisplacedText: Bool = false     @State var isDisplacedRectangle: Bool = false          private var offsetText: CGFloat {         isDisplacedText ? 100 : 0     }          private var offsetRectangle: CGFloat {         isDisplacedRectangle ? 100 : 0     }          private var paddingVstask: CGFloat {         (isDisplacedRectangle ? 100 : 0) + (isDisplacedRectangle ? 100 : 0)     }          var body: some View {         VStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .offset(y: offsetText)             Rectangle()                 .offset(y: isDisplacedRectangle ? 100 : 0)         }         .padding(.top, paddingVstask)     }  }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u0439 \u0441\u0443\u0442\u0438, \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 <strong>View<\/strong>, \u0433\u0434\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u044d\u0442\u043e \u043d\u0435 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043e \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 <strong>body<\/strong>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0448\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0436\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0445\u0443\u0436\u0435 \u0442.\u043a. <strong>body<\/strong> \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u0433\u0434\u0435 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u043d\u043e\u0433\u043e\u0433\u043e. \u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0442.\u0434.<\/p>\n<pre><code class=\"swift\">struct MyView: View {          @State var isDisplacedText: Bool = false     @State var isDisplacedRectangle: Bool = false          private var offsetText: CGFloat {         isDisplacedText ? 100 : 0     }          private var offsetRectangle: CGFloat {         isDisplacedRectangle ? 100 : 0     }          private var paddingVstask: CGFloat { self.returnPaddingVstask() }          var body: some View {         VStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .offset(y: offsetText)             Rectangle()                 .offset(y: isDisplacedRectangle ? 100 : 0)         }         .padding(.top, paddingVstask)     }          private func returnPaddingVstask() -> CGFloat {         (isDisplacedRectangle ? 100 : 0) + (isDisplacedRectangle ? 100 : 0)     }  }<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434 \u0438 \u0434\u0435\u043b\u0438\u0442 <strong>View<\/strong> \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438.<\/p>\n<h4>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u0435\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <strong>View<\/strong><\/p>\n<pre><code class=\"swift\">struct MyView: View {      @State var isShowed: Bool = false      var body: some View {         \/\/...\u043a\u043e\u0434     }    }<\/code><\/pre>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0435 <strong>Apple<\/strong> (\u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>.onApear<\/strong>) \u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440) \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c (\u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440). \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434<\/p>\n<pre><code class=\"swift\">struct MyView: View {      @State var isShowed: Bool          init(isShowed: Bool){     self.isShowed = isShowed     }      var body: some View {         \/\/...\u043a\u043e\u0434     }    }<\/code><\/pre>\n<p>\u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0441 <strong>@Binding<\/strong> \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <strong>@State <\/strong>\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0430\u0446\u0438\u044e \u0438\u043d\u0430\u0447\u0435<\/p>\n<pre><code class=\"swift\">struct MyView: View {      @State var isShowed: Bool          init(isShowed: Bool){     self._isShowed = State(initialValue: isShowed)     }      \/\/\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e     init(isShowed: Bool){       let stateValue: State&lt;Bool> = State&lt;Bool>(initialValue: isShowed)     self._isShowed = stateValue     }      var body: some View {         \/\/...\u043a\u043e\u0434     }    }<\/code><\/pre>\n<p> <strong>@State<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f <strong>State&lt;><\/strong>.<\/p>\n<p><strong>@Binding<\/strong> &#8212; \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d <strong>Binding&lt;><\/strong>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043a \u0438 \u0432\u044b\u0448\u0435<\/p>\n<pre><code class=\"swift\">struct MyFirstView: View {      @State var isShowed: Bool          init(isShowed: Bool){         self._isShowed = State(initialValue: isShowed)     }      var body: some View {         MySecondView($isShowed)     }    }  struct MySecondView: View {      @Binding var isShowed: Bool          init(_ isShowed: Binding&lt;Bool>){         self._isShowed = isShowed     }      var body: some View {         \/\/...\u041a\u043e\u0434     }    }<\/code><\/pre>\n<h4>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<pre><code class=\"swift\">@propertyWrapper struct File: DynamicProperty {          private let string: State&lt;String>     private let path: URL          var wrappedValue: String {         get {             string.wrappedValue         }         nonmutating set { setWrappedValue(newValue) }     }          public var projectedValue: Binding&lt;String> {         Binding(             get: { string.wrappedValue },             set: { wrappedValue = $0 }         )      }          private func setWrappedValue(_ value: String){         print(\"\u043f\u0440\u0438\u043d\u044f\u043b \\(value)\")         do {             try value.write(to: path, atomically: true, encoding: .utf8) self.string.wrappedValue = value         } catch {             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438\")         }     }          init(wrappedValue fileName: String) {         self.path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fileName)         self.string = State(initialValue: (try? String(contentsOf: self.path)) ?? \"\u043f\u0443\u0441\u0442\u043e\")     } }<\/code><\/pre>\n<p><strong><em><sub>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/sub><\/em><\/strong><em><sub> \u041a\u043e\u0434 \u0432\u044b\u0448\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u0431\u0435\u0437 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438 \u0442.\u0434.<\/sub><\/em><\/p>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043e\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<pre><code class=\"swift\">struct MyView: View {          @File var file = \"file.txt\"          var body: some View {         VStack{             Text(file)             TextField(\"\", text: $file)                      }         Button(\"\u041a\u043d\u043e\u043f\u043a\u0430\") {             file = \"\u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"         }     } }<\/code><\/pre>\n<p><strong>projectedValue<\/strong>, \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u043c\u044b\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f <strong>Binding<\/strong> \u0441\u0432\u044f\u0437\u043e\u043a<\/p>\n<p><strong>wrappedValue<\/strong>, \u0442\u043e \u043a \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0438 \u0432\u043e \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <\/p>\n<p><strong>wrappedValue <\/strong>\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435, \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u0438\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0438\u043d\u0430\u0447\u0435<\/p>\n<pre><code class=\"swift\">\/\/...      init(name fileName: String) {         self.path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fileName)         self.string = State(initialValue: (try? String(contentsOf: self.path)) ?? \"\u043f\u0443\u0441\u0442\u043e\")     }  \/\/\/...  @File(name: \"file.txt\") var doc<\/code><\/pre>\n<p><strong>DynamicProperty <\/strong>\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 SwiftUI \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0435 \u043a\u043e\u0440\u043e\u0447\u0435 \u0438 \u0432\u043c\u0435\u0441\u0442\u043e <strong>State&lt;><\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>@State<\/strong> \u0432 \u043d\u0430\u0448\u0435\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0435. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u044b \u043b\u0438\u0448\u0438\u043c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u043d\u043e \u0438 \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043d\u0435\u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0449\u0435\u043c \u0441\u0435\u0442\u0442\u0435\u0440\u0435.<\/p>\n<h4>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 (NSPredicate)<\/h4>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434<\/p>\n<pre><code class=\"swift\">struct MyApp: App {      let coreData = CoreDataController.shared      var body: some Scene {         WindowGroup {             MyView()               .environment(\\.managedObjectContext, coreData.container.viewContext)         }     }  }  struct MyView: View {      @Environment(\\.managedObjectContext)     private var viewContext      @FetchRequest( sortDescriptors:[], NSPredicate() )     private var myEntities: FetchedResults&lt;MyEntity>      var body: some View {         \/\/...\u043a\u043e\u0434     }    } <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, <strong>SwiftUI<\/strong> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 <strong>CoreData<\/strong> \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b, \u0432 \u043e\u0431\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043f\u043e\u0447\u0442\u0438&#8230; \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u0433\u0434\u0435 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c).<\/p>\n<pre><code class=\"swift\">struct MyView: View {      @Environment(\\.managedObjectContext)     private var viewContext      private var myEntitiesRequest : FetchRequest&lt;MyEntity>     var myEntities : FetchedResults&lt;MyEntity> {     myEntitiesRequest.wrappedValue     }          init(predicate: NSPredicate) {         self.transactionRequest = FetchRequest(             sortDescriptors: [],             predicate: predicate         )     }       var body: some View {      \/\/...\u043a\u043e\u0434      }  }<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c View \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>@ViewBuilder<\/h4>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043a\u043e\u0434 \u043d\u0438\u0436\u0435<\/p>\n<pre><code class=\"swift\">struct MyView: View {     var body: some View {         VStack{             Rectangle()             Text(\"\")         }     } }<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 <strong>Vstack<\/strong> \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c <strong>View<\/strong>. \u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435?<\/p>\n<p>\u0417\u0430\u0439\u0434\u0435\u043c \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<pre><code class=\"swift\">func example(value: String, closure: () -> Void){     print(value)     closure() }<\/code><\/pre>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a, \u0432\u0441\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e.<\/p>\n<pre><code class=\"swift\">example(value: \"\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\", closure: { print(\"\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\") } )<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043c.<\/p>\n<pre><code class=\"swift\">example(value: \"\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"){     print(\"\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\") }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c <strong>value<\/strong> \u0438\u043b\u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a.<\/p>\n<pre><code class=\"swift\">example(){     print(\"\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\") }<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043c \u0441\u043a\u043e\u0431\u043a\u0438.<\/p>\n<pre><code class=\"swift\">example{     print(\"\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\") }<\/code><\/pre>\n<p>\u0417\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430? \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0438. \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c <strong>@escaping<\/strong>), \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u0438 \u0442.\u0434. <\/p>\n<p><strong>@ViewBuilder<\/strong> \u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <strong>View<\/strong> \u0438 \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u043c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u0442\u0438\u043f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 <strong>View<\/strong><\/p>\n<pre><code class=\"swift\">struct MyStack&lt;Content>: View where Content: View {          let content: () -> Content          init(@ViewBuilder content: @escaping () -> Content) {         self.content = content     }     var body: some View {         VStack{             Rectangle()                 .frame(height: 100)                 .foregroundColor(.gray)             Spacer()                          content() \/\/\u0412\u0441\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 ViewBuilder                        Spacer()             Rectangle()                 .frame(height: 100)                 .foregroundColor(.gray)         }         .background(Color.blue)         .ignoresSafeArea()     } }<\/code><\/pre>\n<p>\u0418 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<pre><code class=\"swift\">struct MyView: View {     var body: some View {         MyStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .foregroundColor(.white)         }     } }<\/code><\/pre>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9de\/1fa\/73f\/9de1fa73f80dc5178725f2a8440850ce.png\" width=\"750\" height=\"1437\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9de\/1fa\/73f\/9de1fa73f80dc5178725f2a8440850ce.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>Optional(nil) != nil<\/h2>\n<p><sub>\u0412\u043e\u043e\u0431\u0449\u0435 &#8212; \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043c\u043e\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u043f\u043e\u044f\u0432\u043b\u044f\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0434\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442.<\/sub><\/p>\n<p>\u0422\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u0434\u043d\u044f\u0445 \u044f \u0447\u0438\u0442\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/post\/597933\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e<\/a> \u0438 \u0442\u0430\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c <strong>SwiftUI. <\/strong>\u041e\u043d\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <strong>View<\/strong> \u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u043c\u0438 <strong>View<\/strong>, \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 <strong>Optional<\/strong> \u0442.\u043a. \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Apple, <strong>Optional<\/strong> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0442 <strong>View<\/strong>. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e <strong>Optional(nil)<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u043e\u0439\u0442\u0438 \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043d\u0435 \u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 <strong>nil<\/strong> \u0442.\u043a. <strong>Optional(nil)<\/strong> \u043d\u0435 \u0440\u0430\u0432\u043d\u043e <strong>nil<\/strong>, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <strong>View<\/strong>. \u0412 \u0442\u043e\u0439 \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0438\u0437 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">struct ContentView: View {     var body: some View {         let v: Optional&lt;Optional&lt;Text>> = .some(nil)         VStack{             Helper.ultraView(title: \"\u0447\u0443\u043a \u0440\u0443\u043b\u0438\u0442\")             Helper.ultraView(title: \"\u0433\u0435\u043a \u043d\u043e\u0440\u043c\", description: \"\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u0440\u0430\u0442\")                          UltraView(               title: Text(\"\u0442\u0435\u043a\u0441\u0442\"),               description: v)         }         .padding(.horizontal, 10)     } }   struct UltraView&lt;T1: View, T2: View>: View {     let title: T1     let description: T2? \/\/ \u0432\u044c\u044e\u0445\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c \u0436\u0435, \u0432\u0435\u0440\u043d\u043e?        \/\/ \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440     init(title: T1, description: T2?) {         self.title = title         self.description = description     }        \/\/ \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442     init(title: T1) where T2 == EmptyView {         self.title = title         self.description = nil     }      var body: some View {         let color = description == nil ? Color.blue : Color.green          VStack {             title              if let description = description {                 description             }         }         .frame(maxWidth: .infinity)         .padding()         .border(color) \/\/ \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0445\u0435\u043b\u043f\u0435\u0440 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u043c\u043a\u0438     } }  struct Helper {     static func ultraView(title: String, description: String? = nil) -> some View {         UltraView(           title: Text(title),           description: description.map { Text($0).font(.footnote) })               \/\/                       ^ \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b \u0432 Text     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439 \u0438 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<pre><code class=\"swift\">extension Optional where Wrapped: View {     var isNil: Bool {         if ((self as AnyObject) as? NSNull) == nil {             return false         } else {             return true         }     } }<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0441\u043d\u044e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <strong>SwiftUI<\/strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. <strong>View<\/strong> \u0432\u0441\u0435 \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c. \u041a\u0430\u043a-\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c <strong>class<\/strong> \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u043d\u0435\u043b\u044c\u0437\u044f, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e <strong>View<\/strong> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a <strong>AnyObject<\/strong>, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 <strong>Optional<\/strong>. \u041f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <strong>Optional(nil)<\/strong> \u043a <strong>AnyObject <\/strong>\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c<strong> null<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a<strong> NSNull<\/strong>, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u0448  <strong>View<\/strong> (\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <strong>Optional(nil)<\/strong>) \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a <strong>NSNull<\/strong> \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043a\u043b\u0430\u0434\u043a\u0443 \u0432 \u0432\u0438\u0434\u0435 <strong>AnyObject<\/strong>, \u0442\u043e \u044d\u0442\u043e <strong>nil<\/strong>. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"swift\">init(title: T1, description: T2?) { self.title = title self.description = description.isNil ? nil : description }<\/code><\/pre>\n<h4>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e NavigationView<\/h4>\n<p><strong>NavigationView<\/strong> \u0432 <strong>SwiftUI<\/strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438, \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442, \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439.<\/p>\n<p>\u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u043e \u043d\u0435\u0439 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e &#8212; <a href=\"https:\/\/habr.com\/ru\/post\/645117\/\" rel=\"noopener noreferrer nofollow\">\u0422\u044b\u0446<\/a><\/p>\n<p><em>See you later&#8230;<\/em><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/600029\/\"> https:\/\/habr.com\/ru\/articles\/600029\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<details class=\"spoiler\">\n<summary>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043e <strong>SwiftUi<\/strong>, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e. \u041d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <strong>SwiftUI<\/strong> \u043c\u043d\u0435 \u0431\u044b\u043b \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c, \u044f \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u043b \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u043e\u043f\u044b\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u043d\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u0434\u044b\u0445 \u0432\u043e\u043b\u043e\u0441, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f \u0435\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u043d\u0430\u0437\u043e\u0432\u0443. \u0422\u043e\u0433\u0434\u0430 \u0436\u0435, \u044f \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0438 \u0432\u043b\u044e\u0431\u0438\u043b\u0441\u044f \u0432 <strong>SwiftUi<\/strong> \u0442.\u043a. \u043e\u043d \u0434\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>\u041d\u043e \u0432\u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f, \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0441 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0449\u0443\u043f\u0430\u0432 \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c <strong>SwiftUI<\/strong> \u043f\u043e\u0433\u043b\u0443\u0431\u0436\u0435. \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u043c\u0435\u043b\u043e\u0441\u0442\u044c, \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044f \u0434\u0443\u043c\u0430\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0442\u0438\u0432\u044b\u0439 \u043a\u043e\u043d\u044c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0442\u044c\u0441\u044f. <\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0448\u043b\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0438 \u0421\u043a\u0438\u043b\u043b  \u0435\u0449\u0435 \u043f\u043e\u0432\u044b\u0441\u0438\u043b\u0441\u044f, \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<hr\/>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u043c\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435? \u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u044e <strong>SwiftUI<\/strong> \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0444\u0430\u0432\u043e\u0440\u0438\u0442\u043e\u0432. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e \u0438 \u0434\u0435\u043b\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043a\u043e\u0441\u044f\u043a\u0438, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 <strong>SwiftUI<\/strong>, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 <strong>View<\/strong>, \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442.\u043a. Apple \u0432\u0441\u0435 \u0436\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0443\u0434\u043d\u0430 \u0434\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u043e <strong>SwiftUI<\/strong>, \u044f \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0443\u044e \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0443 \u043f\u043e \u043d\u0435\u043c\u0443 (\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0412\u044b \u0435\u0451 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0434\u0435\u0441\u044c &#8212; <a href=\"https:\/\/habr.com\/ru\/post\/591775\/\" rel=\"noopener noreferrer nofollow\">\u0422\u044b\u0446<\/a>). \u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0443 \u043f\u043e \u0430\u0437\u0430\u043c \u0442.\u043a. \u0442\u0430\u043c \u0432\u044b \u043d\u0430\u0432\u0440\u044f\u0442\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u043d\u043e\u0432\u043e\u0435\/\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u0430 \u0432\u043e\u0442 \u0442\u0435\u043c\u043e\u0439 \u044d\u0442\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. <\/p>\n<p><strong><em><sub>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! <\/sub><\/em><\/strong><em><sub>\u041f\u043e\u0434\u0430\u0447\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0433\u0438\u043f\u0435\u0440\u0431\u043e\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430 \u0442.\u043a. \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0447\u0438\u0442\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0443\u0440\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c.<\/sub><\/em><\/p>\n<h2>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u043c\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 <strong>SwiftUI<\/strong> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 <strong>AppStore<\/strong>, \u043e\u043d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 &#8212; <a href=\"https:\/\/apps.apple.com\/us\/app\/%D1%80%D0%B0%D1%81%D1%85%D0%BE%D0%B4%D1%8B-%D1%83%D1%87%D0%B5%D1%82-%D1%80%D0%B0%D1%81%D1%85%D0%BE%D0%B4%D0%BE%D0%B2-becosts\/id1604140188\" rel=\"noopener noreferrer nofollow\">\u0422\u044b\u0446<\/a>.<\/p>\n<p>\u0412 \u043d\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u0430\u0431\u043e\u0440: <strong>CoreData<\/strong>, <strong>UserDefault<\/strong> \u0438 <strong>SwiftUI<\/strong>.<\/p>\n<h3>\u0421\u043e\u0441\u0442\u0430\u0432 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/h3>\n<ul>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u0435\u043a(\u043e\u0431\u0435\u0440\u0442\u043e\u043a) \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 (NSPredicate)<\/p>\n<\/li>\n<li>\n<p>@ViewBuilder<\/p>\n<\/li>\n<li>\n<p>Optional(nil) != nil<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e NavigationView<\/p>\n<\/li>\n<\/ul>\n<h4>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/h4>\n<pre><code class=\"swift\">struct MyView: View {          @State var isDisplacedText: Bool = false     @State var isDisplacedRectangle: Bool = false          var body: some View {         VStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .offset(y: isDisplacedText ? 100 : 0)             Rectangle()                 .offset(y: isDisplacedRectangle ? 100 : 0)         }         .padding(.top, isDisplacedText ? 100 : 0)         .padding(.top, isDisplacedRectangle ? 100 : 0)     }  }<\/code><\/pre>\n<p>\u041d\u0435\u0437\u0430\u0442\u0435\u0439\u043b\u0438\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0445\u043e\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u043c\u043d\u043e\u0433\u0438\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u0435\u0433\u043e \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u043e\u0441\u044f\u0442 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u044f\u0437\u044b\u043a\u0430. \u0412\u043e\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 (\u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434) \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"swift\">struct MyView: View {          @State var isDisplacedText: Bool = false     @State var isDisplacedRectangle: Bool = false          private var offsetText: CGFloat {         isDisplacedText ? 100 : 0     }          private var offsetRectangle: CGFloat {         isDisplacedRectangle ? 100 : 0     }          private var paddingVstask: CGFloat {         (isDisplacedRectangle ? 100 : 0) + (isDisplacedRectangle ? 100 : 0)     }          var body: some View {         VStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .offset(y: offsetText)             Rectangle()                 .offset(y: isDisplacedRectangle ? 100 : 0)         }         .padding(.top, paddingVstask)     }  }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u0439 \u0441\u0443\u0442\u0438, \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 <strong>View<\/strong>, \u0433\u0434\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u044d\u0442\u043e \u043d\u0435 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043e \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 <strong>body<\/strong>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0448\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0436\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0445\u0443\u0436\u0435 \u0442.\u043a. <strong>body<\/strong> \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u0433\u0434\u0435 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u043d\u043e\u0433\u043e\u0433\u043e. \u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0442.\u0434.<\/p>\n<pre><code class=\"swift\">struct MyView: View {          @State var isDisplacedText: Bool = false     @State var isDisplacedRectangle: Bool = false          private var offsetText: CGFloat {         isDisplacedText ? 100 : 0     }          private var offsetRectangle: CGFloat {         isDisplacedRectangle ? 100 : 0     }          private var paddingVstask: CGFloat { self.returnPaddingVstask() }          var body: some View {         VStack{             Text(\"\u0422\u0435\u043a\u0441\u0442\")                 .offset(y: offsetText)             Rectangle()                 .offset(y: isDisplacedRectangle ? 100 : 0)         }         .padding(.top, paddingVstask)     }          private func returnPaddingVstask() -> CGFloat {         (isDisplacedRectangle ? 100 : 0) + (isDisplacedRectangle ? 100 : 0)     }  }<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434 \u0438 \u0434\u0435\u043b\u0438\u0442 <strong>View<\/strong> \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438.<\/p>\n<h4>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u0435\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <strong>View<\/strong><\/p>\n<pre><code class=\"swift\">struct MyView: View {      @State var isShowed: Bool = false      var body: some View {         \/\/...\u043a\u043e\u0434     }    }<\/code><\/pre>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u043a\u0435 <strong>Apple<\/strong> (\u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>.onApear<\/strong>) \u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440) \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c (\u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440). \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434<\/p>\n<pre><code class=\"swift\">struct MyView: View {      @State var isShowed: Bool          init(isShowed: Bool){     self.isShowed = isShowed     }      var body: some View {         \/\/...\u043a\u043e\u0434     }    }<\/code><\/pre>\n<p>\u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0441 <strong>@Binding<\/strong> \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <strong>@State <\/strong>\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0430\u0446\u0438\u044e \u0438\u043d\u0430\u0447\u0435<\/p>\n<pre><code class=\"swift\">struct MyView: View {      @State var isShowed: Bool          init(isShowed: Bool){     self._isShowed = State(initialValue: isShowed)     }      \/\/\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e     init(isShowed: Bool){       let stateValue: State&lt;Bool> = State&lt;Bool>(initialValue: isShowed)     self._isShowed = stateValue     }      var body: some View {         \/\/...\u043a\u043e\u0434     }    }<\/code><\/pre>\n<p> <strong>@State<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f <strong>State&lt;><\/strong>.<\/p>\n<p><strong>@Binding<\/strong> &#8212; \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d <strong>Binding&lt;><\/strong>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043a \u0438 \u0432\u044b\u0448\u0435<\/p>\n<pre><code class=\"swift\">struct MyFirstView: View {      @State var isShowed: Bool          init(isShowed: Bool){         self._isShowed = State(initialValue: isShowed)     }      var body: some View {         MySecondView($isShowed)     }    }  struct MySecondView: View {      @Binding var isShowed: Bool          init(_ isShowed: Binding&lt;Bool>){         self._isShowed = isShowed     }      var body: some View {         \/\/...\u041a\u043e\u0434     }    }<\/code><\/pre>\n<h4>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<pre><code class=\"swift\">@propertyWrapper struct File: DynamicProperty {          private let string: State&lt;String>     private let path: URL          var wrappedValue: String {         get {             string.wrappedValue         }         nonmutating set { setWrappedValue(newValue) }     }          public var projectedValue: Binding&lt;String> {         Binding(             get: { string.wrappedValue },             set: { wrappedValue = $0 }         )      }          private func setWrappedValue(_ value: String){         print(\"\u043f\u0440\u0438\u043d\u044f\u043b \\(value)\")         do {             try value.write(to: path, atomically: true, encoding: .utf8) self.string.wrappedValue = value         } catch {             print(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438\")         }     }          init(wrappedValue fileName: String) {         self.path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fileName)         self.string = State(initialValue: (try? String(contentsOf: self.path)) ?? \"\u043f\u0443\u0441\u0442\u043e\")     } }<\/code><\/pre>\n<p><strong><em><sub>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/sub><\/em><\/strong><em><sub> \u041a\u043e\u0434 \u0432\u044b\u0448\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u0431\u0435\u0437 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438 \u0442.\u0434.<\/sub><\/em><\/p>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043e\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<pre><code class=\"swift\">struct MyView: View {          @File var file = \"file.txt\"          var body: some View {         VStack{             Text(file)             TextField(\"\", text: $file)                      }         Button(\"\u041a\u043d\u043e\u043f\u043a\u0430\") {             file = \"\u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"         }     } }<\/code><\/pre>\n<p><strong>projectedValue<\/strong>, \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u043c\u044b\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f <strong>Binding<\/strong> \u0441\u0432\u044f\u0437\u043e\u043a<\/p>\n<p><strong>wrappedValue<\/strong>, \u0442\u043e \u043a \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0438 \u0432\u043e \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <\/p>\n<p><strong>wrappedValue <\/strong>\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435, \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u0438\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0438\u043d\u0430\u0447\u0435<\/p>\n<pre><code class=\"swift\">\/\/...      init(name fileName: String) {         self.path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent(fileName)         self.string = State(initialValue: (try? String(contentsOf: self.path)) ?? \"\u043f\u0443\u0441\u0442\u043e\")     }  \/\/\/...  @File(name: \"file.txt\") var doc<\/code><\/pre>\n<p><strong>DynamicProperty <\/strong>\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 SwiftUI \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0435 \u043a\u043e\u0440\u043e\u0447\u0435 \u0438 \u0432\u043c\u0435\u0441\u0442\u043e <strong>State&lt;><\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>@State<\/strong> \u0432 \u043d\u0430\u0448\u0435\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0435. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u044b \u043b\u0438\u0448\u0438\u043c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u043d\u043e \u0438 \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043d\u0435\u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0449\u0435\u043c \u0441\u0435\u0442\u0442\u0435\u0440\u0435.<\/p>\n<h4>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 (NSPredicate)<\/h4>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434<\/p>\n<pre><code class=\"swift\">struct MyApp: App {      let coreData = CoreDataController.shared      var body: some Scene {         WindowGroup {             MyView()               .environment(\\.managedObjectContext, coreData.container.viewContext)         }     }  }  struct MyView: View {      @Environment(\\.managedObjectContext)     private var viewContext      @FetchRequest( sortDescriptors:[], NSPredicate() )     private var myEntities: FetchedResults&lt;MyEntity>      var body: some View {         \/\/...\u043a\u043e\u0434     }    } <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, <strong>SwiftUI<\/strong> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 <strong>CoreData<\/strong> \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-412015","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/412015","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=412015"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/412015\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=412015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=412015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=412015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}