{"id":345918,"date":"2023-02-27T09:02:19","date_gmt":"2023-02-27T09:02:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=345918"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=345918","title":{"rendered":"<span>\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 SwiftUI<\/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<p><strong>SwiftUI \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 API \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 view \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442\u00a0\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 view \u0442\u0430\u043a\u0438\u043c\u00a0\u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/strong>  <\/p>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u0432\u00a0\u0445\u043e\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432 \u043d\u0430 <a href=\"https:\/\/talk.objc.io\/episodes\/S01E322-custom-components-making-the-stepper-styleable\" rel=\"noopener noreferrer nofollow\">Swift Talk<\/a> \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043f\u043f\u0435\u0440 \u0434\u043b\u044f\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041e\u043d\u00a0\u0431\u044b\u043b \u043f\u043e\u0445\u043e\u0436 \u043d\u0430\u00a0Stepper \u0432\u00a0SwiftUI, \u043d\u043e\u00a0\u0441\u00a0API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0442\u0438\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0442\u043a\u0438\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0442\u043e\u0433\u0434\u0430, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u0438\u0451\u043c\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u043b\u0438 view (\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u044c\u044e, \u0432\u044c\u044e\u0448\u043a\u0430) \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435, \u043a\u0430\u043a\u00a0built\u2011in (\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435) \u0432\u00a0SwiftUI. \u0412\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h3>\u0421\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438<\/h3>\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/215\/aaf\/e54\/215aafe5490b9d867a94fa258363ffc7.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u044d\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 view \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f label (\u043c\u0435\u0442\u043a\u0438) \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code class=\"swift\">Button {         \/\/ Continue } label: {     HStack {         Spacer()         Text(\"Continue\")         Spacer()     }     .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))     }     .font(.system(.title2, design: .rounded, weight: .bold))     .foregroundColor(.yellow)     .background(Capsule().stroke(.yellow, lineWidth: 2))<\/code><\/pre>\n<p>\u0425\u043e\u0442\u044f SwiftUI \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 view \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u043d\u043e\u00a0\u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435\u00a0\u0436\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 \u0432\u00a0HStack. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b8\/880\/fdb\/3b8880fdb825a5039eb7596af72bc073.webp\" alt=\"\u0422\u0430\u043a\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u043e \u0432\u0441\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.\" title=\"\u0422\u0430\u043a\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u043e \u0432\u0441\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.\" width=\"699\" height=\"437\"\/><figcaption>\u0422\u0430\u043a\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u043e \u0432\u0441\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.<\/figcaption><\/figure>\n<h3>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0438\u043b\u044f<\/h3>\n<p>\u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043a\u0430\u043a\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b view \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043b\u0438 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u0432\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441\u00a0\u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438\u00a0\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a\u00a0\u0431\u0440\u0435\u043d\u0434\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e\u00a0\u0436\u0435 \u0441\u0442\u0438\u043b\u044f \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c view Button, \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432\u00a0\u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 view \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u00a0API, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c SwiftUI Button, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u00a0\u043d\u0435\u043c\u0443 \u0441\u0442\u0438\u043b\u044c:<\/p>\n<pre><code class=\"swift\">struct MyButton: View {     var action: () -> Void     var label: Label      init(action: @escaping () -> Void, @ViewBuilder label: () -> Label) {         self.action = action         self.label = label()     }      var body: some View {         Button {             action()         } label: {             HStack {                 Spacer()                 Label                 Spacer()             }             .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))         }         .font(.system(.title2, design: .rounded, weight: .bold))         .foregroundColor(.yellow)         .background(Capsule().stroke(.yellow, lineWidth: 2))     } }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 view, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u00a0\u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b, \u0447\u0442\u043e\u00a0\u0438 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 view, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u043e\u0434\u0435:  <\/p>\n<pre><code class=\"swift\">struct MyButton where Label == Text {     @_disfavoredOverload     init(_ title: some StringProtocol, role: ButtonRole? = nil, action: @escaping () -> Void) {         self.action = action         self.role = role         self.label = Text(title)     }     init(_ titleKey: LocalizedStringKey, role: ButtonRole? = nil, action: @escaping () -> Void) {         self.action = action         self.role = role         self.label = Text(titleKey)     } }<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430, Button \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b String \u043a\u0430\u043a\u00a0LocalizedStringKey, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0448\u0430\u0431\u043b\u043e\u043d @_disfavoredOverload. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e view \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u043e\u0439, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0425\u043e\u0442\u044f \u0441\u0442\u0438\u043b\u044c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u0430\u0436\u043d\u043e \u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c view MyButton \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0438 SwiftUI \u0432\u043e\u00a0\u0432\u0441\u0451\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0412\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c.<\/p>\n<pre><code class=\"swift\">VStack {     MyButton(\"OK\") {         \/\/ Confirm     }     Button(\"Cancel\") {         \/\/ Oops, wrong button     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5d9\/195\/fa5\/5d9195fa5225fb1a437dec968c3a2a11.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u00a0\u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0443\u00a0SwiftUI \u0435\u0441\u0442\u044c API, \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<h3>View \u0441\u0442\u0438\u043b\u0435\u0439<\/h3>\n<p>API view \u0441\u0442\u0438\u043b\u0435\u0439 SwiftUI \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b view font(_:) \u0438 tint(_:), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0432\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e view \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0438\u043b\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c view \u0432\u00a0\u044d\u0442\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438:<\/p>\n<pre><code class=\"swift\">HStack {     Button(\"Undo\") { \/* \u2026 *\/ }     Button(\"Redo\") { \/* \u2026 *\/ } } .foregroundColor(.black) .font(.system(.title3, design: .rounded).bold()) .tint(.yellow) .buttonStyle(.borderedProminent)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/215\/32d\/502\/21532d502247758761890054dc43e20c.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0446\u0432\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0430, \u0448\u0440\u0438\u0444\u0442, \u043e\u0442\u0442\u0435\u043d\u043e\u043a \u0438 \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0HStack, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u00a0\u043a\u043e\u0440\u043d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 view:<\/p>\n<pre><code class=\"swift\">@main struct MyApp: App {     var body: some Scene {         WindowGroup {             ContentView()                 .tint(.yellow)                 .buttonStyle(.borderedProminent)         }     } }<\/code><\/pre>\n<p>SwiftUI \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0438\u043b\u0435\u0439 \u043d\u0430\u00a0\u0432\u044b\u0431\u043e\u0440, \u0430\u00a0\u0434\u043b\u044f\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 view, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0445 \u0441\u0442\u0438\u043b\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u0442\u0438\u043b\u0438.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u2011\u0442\u043e, \u0447\u0442\u043e\u00a0SwiftUI \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<p>\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 buttonStyle(_:), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0442\u0438\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0438\u043f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439\u00a0\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 ButtonStyle,\u00a0\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 PrimitiveButtonStyle.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437\u00a0\u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f makeBody(configuration:). \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0435\u043c.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c configuration.label, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c view, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043c\u0435\u0442\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u0441\u0442\u0438\u043b\u044c \u043a\u00a0\u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u043a\u0435:<\/p>\n<pre><code class=\"swift\">struct CustomButtonStyle: ButtonStyle {     func makeBody(configuration: Configuration) -> some View {         HStack {             Spacer()             configuration.label             Spacer()         }         .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))         .font(.system(.title2, design: .rounded).bold())         .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))         .foregroundColor(.yellow)         .background {             Capsule()                 .stroke(.yellow, lineWidth: 2)         }     } }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e.buttonStyle(CustomButtonStyle()).<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 view, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>Toggle<\/p>\n<\/li>\n<li>\n<p>DatePicker<\/p>\n<\/li>\n<li>\n<p>Gauge<\/p>\n<\/li>\n<li>\n<p>ProgressView<\/p>\n<\/li>\n<li>\n<p>Label<\/p>\n<\/li>\n<li>\n<p>LabeledContent<\/p>\n<\/li>\n<li>\n<p>DisclosureGroup<\/p>\n<\/li>\n<li>\n<p>ControlGroup<\/p>\n<\/li>\n<li>\n<p>GroupBox<\/p>\n<\/li>\n<li>\n<p>Form<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0438\u043b\u044f \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0442\u0438\u043b\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0436\u0430\u0442\u0430\u00a0\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0438 \u043a\u0430\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0438\u0434 \u043f\u0440\u0438\u00a0\u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0438\u043b\u0438\u00a0\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435:<\/p>\n<pre><code class=\"swift\">.background {     Capsule()         .stroke(configuration.role == .destructive ? .red : .yellow, lineWidth: 2) } .opacity(configuration.isPressed ? 0.5 : 1)  VStack(spacing: 16) {     Button(role: .destructive) {         \/\/ Delete     } label: {         Label(\"Delete\", systemImage: \"trash\")     }     Button(\"Cancel\", role: .cancel) {         \/\/ Cancel Deletion     } } .buttonStyle(CustomButtonStyle())<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b5c\/4cf\/707\/b5c4cf7078954bc91b0e97d0006fa751.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439<\/h3>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u00a0\u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u043b\u0430\u0433, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430\u00a0\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 view disabled(_:).<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 view \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c view, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u00a0\u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 view. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u00a0view \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment (\u0441\u0440\u0435\u0434\u044b). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment isEnabled:<\/p>\n<pre><code class=\"swift\">@Environment(\\.isEnabled) var isEnabled  func makeBody(configuration: Configuration) -> some View {     \/\/ ...         .saturation(isEnabled ? 1 : 0) }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3b\/2df\/88a\/b3b2df88a40c79d0ea691f505a07fc95.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 view<\/h3>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 view SwiftUI \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u00a0\u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u043d\u0430\u043c\u00a0\u0431\u044b \u0442\u043e\u0433\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043d\u043e, \u043a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 view SwiftUI.<\/p>\n<p>\u0425\u043e\u0442\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0442\u044c \u043a\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 view \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u0432\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 view \u0438\u043b\u0438\u00a0\u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 SwiftUI, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0443\u0441\u043f\u0435\u0445\u0430, \u0441\u0434\u0435\u043b\u0430\u0432 \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 view \u0441\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u043c\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u043d\u0430\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f RangeSlider:<\/p>\n<pre><code class=\"swift\">struct RangeSlider: View {     @Binding     var range: ClosedRange      var bounds: ClosedRange?      var label: Label      init(value: Binding>, in bounds: ClosedRange? = nil, @ViewBuilder label: () -> Label) {         self._value = value         self.bounds = bounds         self.label = label()     }      var body: some View {         LabeledContent {             \/\/ ...         } label: {             Label         }     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8dc\/ddb\/71b\/8dcddb71b787e8cf89d9f213d97cadb0.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u00a0\u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e view \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c?<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a\u00a0API \u0441\u0442\u0438\u043b\u044f SwiftUI \u0434\u043b\u044f\u00a0\u043a\u043d\u043e\u043f\u043a\u0438, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043b\u044f\u00a0\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<p>ButtonStyle \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0438\u043b\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Button \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0431\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00a0\u0436\u0435\u0441\u0442\u043e\u0432, \u0430\u00a0PrimitiveButtonStyle \u0434\u0430\u0451\u0442 \u0441\u0442\u0438\u043b\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u043a\u043d\u043e\u043f\u043a\u043e\u0439.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441\u0442\u0438\u043b\u0435\u0439 \u0432\u00a0SwiftUI \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b PrimitiveButtonStyle \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0441\u043e \u0441\u0442\u0438\u043b\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 ToggleStyle view Toggle \u043d\u0435\u00a0\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00a0\u0436\u0435\u0441\u0442 \u0437\u0430\u00a0\u043d\u0430\u0441. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0442\u0438\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f view.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0442\u0438\u043b\u0435\u0439 \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 API \u0441\u0442\u0438\u043b\u0435\u0439 \u043a\u043d\u043e\u043f\u043e\u043a SwiftUI.<\/p>\n<p>API\u2011\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0441\u0442\u0438\u043b\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437\u00a0\u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439\u00a0\u2014 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 view, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0434\u043b\u044f\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0442\u0438\u043b\u044f, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0438\u043b\u044f:<\/p>\n<pre><code class=\"swift\">extension View {     public func buttonStyle(_ style: S) -> some View where S : PrimitiveButtonStyle }<\/code><\/pre>\n<pre><code class=\"swift\">public protocol PrimitiveButtonStyle {     associatedtype Body : View      @ViewBuilder func makeBody(configuration: Self.Configuration) -> Self.Body      typealias Configuration = PrimitiveButtonStyleConfiguration }<\/code><\/pre>\n<pre><code class=\"swift\">public struct PrimitiveButtonStyleConfiguration {     \/\/ ...      public let role: ButtonRole?      public let label: PrimitiveButtonStyleConfiguration.Label      public func trigger() }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c RangeSlider \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 view, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0438\u043b\u044f.<\/p>\n<p>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 PrimitiveButtonStyleConfiguration \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 Button:<\/p>\n<pre><code class=\"swift\">public init(     role: ButtonRole?,     action: @escaping () -> Void,     @ViewBuilder label: () -> Label )<\/code><\/pre>\n<p>role \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u00ab\u043a\u0430\u043a \u0435\u0441\u0442\u044c\u00bb, action \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u043a\u0430\u043a\u00a0\u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430\u00a0label \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 view \u0441\u043e \u0441\u0442\u0451\u0440\u0442\u044b\u043c \u0442\u0438\u043f\u043e\u043c.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f\u00a0\u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442\u00a0\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0438\u0437\u00a0\u043d\u0430\u0448\u0435\u0433\u043e view \u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"swift\">struct RangeSliderStyleConfiguration {     @Binding     let range: ClosedRange      let bounds: ClosedRange?      let label: Label }<\/code><\/pre>\n<p>\u041a\u0430\u043a\u00a0\u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0434\u043b\u044f\u00a0\u043a\u043d\u043e\u043f\u043a\u0438, \u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u00a0environment, \u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0442\u0438\u043b\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c environment.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442 \u0434\u043b\u044f\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0433\u0440\u0430\u043d\u0438\u0446, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a\u00a0\u0435\u0441\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f\u00a0\u043c\u0435\u0442\u043a\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u00a0\u0442\u0438\u043f\u0443 \u043c\u0435\u0442\u043a\u0438 SwiftUI, \u0430\u00a0\u043d\u0435\u00a0\u043a\u00a0\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 RangeSlider \u0438\u043c\u0435\u0435\u0442 \u0434\u043b\u044f\u00a0\u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0442\u043a\u0438.<\/p>\n<p>\u041a\u043d\u043e\u043f\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0442\u0438\u043f \u0434\u043b\u044f\u00a0\u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0442\u043a\u0438, \u0447\u0442\u043e\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b view \u0434\u043b\u044f\u00a0\u0441\u0432\u043e\u0438\u0445 \u043c\u0435\u0442\u043e\u043a. \u041c\u0435\u0442\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f Text, Label \u0438\u043b\u0438\u00a0HStack, \u043d\u043e\u00a0\u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043a\u043d\u043e\u043f\u043e\u043a, SwiftUI \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u044b\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0437\u0430\u00a0\u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c view ButtonConfiguration.Label. \u042d\u0442\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0438\u043b\u044c \u043e\u0442\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u043a\u00a0\u043b\u044e\u0431\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435.<\/p>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442\u00a0\u0436\u0435 \u0448\u0430\u0431\u043b\u043e\u043d, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0449\u0438\u0439 RangeSlider \u043d\u0430\u0434 \u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0442\u043a\u043e\u0439, \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e API \u0441\u0442\u0438\u043b\u044f \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"swift\">\/\/\/ A type-erased label of a button. public struct Label : View {     public typealias Body = Never }<\/code><\/pre>\n<p>SwiftUI \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f Body \u043a\u0430\u043a\u00a0Never, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u043d\u044b\u0435 API \u0434\u043b\u044f\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f view \u043c\u0435\u0442\u043a\u0438.<\/p>\n<p>\u041c\u044b \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0434\u0435\u0441\u044c SwiftUI, \u043d\u043e\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c AnyView \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e\u00a0\u0436\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"swift\">\/\/\/ A type-erased label of a range slider. struct Label: View {     let underlyingLabel: AnyView      init(_ label: some View) {         self.underlyingLabel = AnyView(label)     }      var body: some View {         underlyingLabel     } }<\/code><\/pre>\n<blockquote>\n<p>\u0425\u043e\u0442\u044f \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c AnyView \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u044d\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u0442\u0438\u043b\u044f\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u00a0\u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f\u00a0\u0442\u0435\u043a\u0441\u0442\u0430\u2011\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u043e \u0441\u0442\u0451\u0440\u0442\u044b\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0441\u0442\u0438\u043b\u0435 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u043c\u0435\u0442\u043a\u0438. <\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f\u00a0\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0441\u0442\u0438\u043b\u0435\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 SwiftUI: <\/p>\n<pre><code class=\"swift\">protocol RangeSliderStyle {     associatedtype Body: View      @ViewBuilder func makeBody(configuration: Configuration) -> Body      typealias Configuration = RangeSliderStyleConfiguration }<\/code><\/pre>\n<p>\u0418\u043c\u0435\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u0438\u043b\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0438\u043b\u044f: <\/p>\n<pre><code class=\"swift\">struct DefaultRangeSliderStyle: RangeSliderStyle {     func makeBody(configuration: Configuration) -> some View {         GeometryReader { proxy in             ZStack {                 Capsule()                     .fill(.regularMaterial)                     .frame(height: 4)                 Capsule()                     .fill(.tint)                     .frame(height: 4)                     \/\/ Width and position...                 Circle()                     .frame(width: 27, height: 27)                     \/\/ Gesture handling and positioning...                 Circle()                     .frame(width: 27, height: 27)                     \/\/ Gesture handling and positioning...             }         }         .frame(height: 27)     } } <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fd4\/7f8\/2a7\/fd47f82a72e31dfb3d6517e437b6ce40.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0434\u043b\u044f\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 view, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u00a0View, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 buttonStyle(_:), \u043d\u043e\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e some, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0442\u043a\u0438\u043c:<\/p>\n<pre><code class=\"swift\">extension View {     func rangeSliderStyle(_ style: some RangeSliderStyle) -> some View {         environment(\\.rangeSliderStyle, style)     } }<\/code><\/pre>\n<p>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u0441\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u043f\u043e\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 view, \u043a\u0430\u043a\u00a0\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f environment. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0442\u0438\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e view \u0432\u043e\u00a0view, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043e. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u00a0\u0436\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0438\u043b\u044f, \u0447\u0442\u043e\u00a0\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438.\u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0441\u0442\u0438\u043b\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443, \u0432\u00a0\u0441\u0440\u0435\u0434\u0443 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f environment \u043b\u044e\u0431\u044b\u043c RangeSliderStyle.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 environment \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0421\u0442\u0438\u043b\u044c\u043d\u044b\u0435 view SwiftUI \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0442\u0438\u043b\u044c \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u0434\u043b\u044f\u00a0view \u0437\u0434\u0435\u0441\u044c:<\/p>\n<pre><code class=\"swift\">struct RangeSliderStyleKey: EnvironmentKey {     static var defaultValue: any RangeSliderStyle = DefaultRangeSliderStyle() }  extension EnvironmentValues {     var rangeSliderStyle: any RangeSliderStyle {         get { self[RangeSliderStyleKey.self] }         set { self[RangeSliderStyleKey.self] = newValue }     } }<\/code><\/pre>\n<p>\u0418\u043c\u0435\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c body \u043d\u0430\u0448\u0435\u0433\u043e view, \u0441\u043e\u0437\u0434\u0430\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0442\u0438\u043b\u044f \u0441\u00a0\u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u00a0\u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 makeBody \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437\u00a0environment: <\/p>\n<pre><code class=\"swift\">struct RangeSlider: View {     \/\/ ...     @Environment(\\.rangeSliderStyle) var style      var body: some View {         let configuration = RangeSliderStyleConfiguration(             range: $range,             bounds: bounds,             label: .init(label)         )          style.makeBody(configuration: configuration)     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/14f\/75b\/87b\/14f75b87b0f83115f0659c6de342114b.webp\" alt=\"\" title=\"\" width=\"699\" height=\"62\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 body \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f view, \u0430\u00a0style, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437\u00a0\u0441\u0440\u0435\u0434\u044b, \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f any RangeSliderStyle, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c view, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u00a0\u0432\u044b\u0437\u043e\u0432\u0430 makeBody, \u0432\u00a0AnyView:<\/p>\n<pre><code class=\"swift\">AnyView(style.makeBody(configuration: configuration))<\/code><\/pre>\n<p>\u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d \u0442\u0438\u043f\u043e\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0441\u0442\u0438\u043b\u0435\u0439, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u00a0\u0431\u044b \u0441\u0442\u0438\u043b\u044c \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e view SwiftUI:  <\/p>\n<pre><code class=\"swift\">Form {     \/\/ ...     RangeSlider(range: $sizeRange, in: minSize...maxSize) {         Text(\"Size Range\")     }     \/\/ ... }.rangeSliderStyle(VerticalRangeSliderStyle())<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a53\/fbc\/3d1\/a53fbc3d10766301d6d2465145abca0c.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u0441\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u0435\u0439 SwiftUI, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0447\u043b\u0435\u043d \u0432\u00a0\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0442\u0438\u043b\u0435\u0439. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0441\u00a0\u0442\u0435\u043c\u00a0\u0436\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c, \u0447\u0442\u043e\u00a0\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 view \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c view:<\/p>\n<pre><code class=\"swift\">extension RangeSliderStyle where Self == VerticalRangeSliderStyle {     static var vertical: Self { .init() } }  .rangeSliderStyle(.vertical)<\/code><\/pre>\n<h3>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>\u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 view \u0432\u0430\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b view, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 view, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u00a0VoiceOver:<\/p>\n<pre><code class=\"swift\">struct MySlider: View {     \/\/ ...      var body: some View {         \/\/ ...         AnyView(style.makeBody(configuration: configuration))             .accessibilityElement(children: .combine)             .accessibilityValue(valueText)             .accessibilityAdjustableAction { direction in                 switch direction {                 case .increment: increment()                 case .decrement: decrement()                 @unknown default:                     break                 }             }     }      var valueText: Text {         if bounds == 0.0...1.0 {              return Text(value.wrappedValue, format: .percent)          } else {              return Text(value.wrappedValue, format: .number)          }     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/639\/669\/779\/63966977938bd0af9e49e2e9f275813a.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>\u201c\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c 50%, \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u043c\u0430\u044f. \u041f\u0440\u043e\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0432\u0435\u0440\u0445 \u0438\u043b\u0438 \u0432\u043d\u0438\u0437 \u043e\u0434\u043d\u0438\u043c \u043f\u0430\u043b\u044c\u0446\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u201d. &#8212; \u0413\u043e\u043b\u043e\u0441 \u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u043c  <\/p>\n<\/blockquote>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u043e\u0432 \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c accessibilityAdjustableAction(_:), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u043e\u00a0view \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c \u043d\u0430\u0434 \u0441\u0442\u0438\u043b\u044f\u043c\u0438, \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 view \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.<\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Environment \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0441\u0442\u0438\u043b\u0435<\/h3>\n<p>\u0414\u043b\u044f\u00a0\u043c\u043d\u043e\u0433\u0438\u0445 view \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c environment. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/environmentvalues\/isenabled\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d<\/a>. \u0414\u043b\u044f\u00a0\u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0434\u043b\u044f\u00a0\u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e view \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0446\u0432\u0435\u0442, \u0435\u0441\u043b\u0438 <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/environmentvalues\/colorscheme\" rel=\"noopener noreferrer nofollow\">\u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430<\/a> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0430\u00a0\u0442\u0451\u043c\u043d\u0443\u044e, \u0438\u043b\u0438\u00a0\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/environmentvalues\/accessibilityreducemotion\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/shapestyle\/tint\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0438\u043b\u044c \u043e\u0442\u0442\u0435\u043d\u043a\u0430<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/environmentvalues\/controlsize\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a>, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u043a\u0430\u0437\u0430\u043d.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u00a0\u043f\u043e\u0442\u043e\u043a\u0435 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0441\u0442\u0438\u043b\u0438 view \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 controlSize \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043c\u044b \u043c\u043e\u0433\u043b\u0438\u00a0\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment controlSize \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0438\u043b\u0435\u0439 \u0438\u043b\u0438\u00a0view, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 environment \u0432\u00a0\u0441\u0442\u0438\u043b\u0435 \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e view SwiftUI \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u043c\u044b \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u0438, \u043d\u043e\u00a0\u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u00a0\u0441\u0442\u0438\u043b\u0435 \u0434\u043b\u044f\u00a0view, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0442\u0438\u043b\u044f, \u044d\u0442\u043e \u043d\u0435\u00a0\u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u043b\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"swift\">struct CheckboxMultipleChoiceStyle: MultipleChoiceStyle {     @Environment(\\.isEnabled) var isEnabled      func makeBody(configuration: Configuration) -> some View {         \/* ... *\/             .saturation(isEnabled ? 1 : 0)             .brightness(isEnabled ? 0 : -0.2)     } }<\/code><\/pre>\n<pre><code class=\"swift\">MultipleChoice(selection: $extras) {     ForEach(Extra.allCases) { extra in         Text(extra.name).tag(extra)     } } .disabled(isOutOfStock) .multipleChoiceStyle(.checkbox)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f8f\/38a\/578\/f8f38a578ef2febed05c9f0bdf160dfd.webp\" alt=\"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" title=\"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" width=\"699\" height=\"437\"\/><figcaption>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c61\/266\/4d7\/c612664d7d0fe129cb2f15eb8863f81d.webp\" alt=\"\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438\" title=\"\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438\" width=\"699\" height=\"437\"\/><figcaption>\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438<\/figcaption><\/figure>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0431\u0438\u0432\u0430\u043b\u043e \u0441\u00a0\u0442\u043e\u043b\u043a\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u0431\u044b\u043b\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u00a0Xcode 14.1, \u0437\u0430\u043f\u0443\u0441\u043a \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0449\u0435\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/618\/e04\/915\/618e049152f169f13c1d70cd8dca49c6.webp\" alt=\"\" title=\"\" width=\"699\" height=\"140\"\/><figcaption><\/figcaption><\/figure>\n<p>CheckboxMultipleChoiceStyle \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f View, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c environment, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u043e\u00a0view \u0438\u043b\u0438\u00a0\u043a\u0430\u043a\u2011\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment \u0432\u00a0\u0441\u0442\u0438\u043b\u0435.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437\u00a0\u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 environment \u0438\u0437\u00a0\u0441\u0442\u0438\u043b\u044f\u00a0\u2014 \u044d\u0442\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c body \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u0432\u00a0\u043d\u043e\u0432\u043e\u0435 view:<\/p>\n<pre><code class=\"swift\">struct CheckboxMultipleChoice: View {     var configuration: MultipleChoiceStyleConfiguration      @Environment(\\.isEnabled) var isEnabled      var body: some View {         \/* ... *\/             .saturation(isEnabled ? 1 : 0)             .brightness(isEnabled ? 0 : -0.2)     } }  struct CheckboxMultipleChoiceStyle: MultipleChoiceStyle {     func makeBody(configuration: Configuration) -> some View {         CheckboxMultipleChoice(configuration: configuration)     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7d1\/80b\/4be\/7d180b4be547624d42748bd3c41309b4.webp\" alt=\"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" title=\"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" width=\"699\" height=\"437\"\/><figcaption>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c80\/8b4\/0e5\/c808b40e584d120ef42143d2da610906.webp\" alt=\"\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" title=\"\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b\" width=\"699\" height=\"437\"\/><figcaption>\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b<\/figcaption><\/figure>\n<p>\u0425\u043e\u0442\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a\u00a0\u0441\u0442\u0438\u043b\u044f\u043c \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 view \u0438\u043d\u0430\u0447\u0435, \u0447\u0435\u043c \u043a\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u044f\u043c view, \u0438 \u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u0445\u043d\u0438\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0442\u0438\u043b\u044c \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e view.<\/p>\n<h3>Dynamic Property (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e)<\/h3>\n<p>\u041c\u044b\u00a0\u0431\u044b\u043b\u0438 \u043d\u0435\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438, \u043a\u0442\u043e \u0442\u0430\u043a \u0434\u0443\u043c\u0430\u043b: \u043d\u0430 <a href=\"https:\/\/swiftui-lab.com\/digital-lounges-2022\/#data-4\" rel=\"noopener noreferrer nofollow\">SwiftUI Digital Lounges WWDC 2022\u00a0\u043a\u0442\u043e\u2011\u0442\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u043e\u0431\u00a0\u044d\u0442\u043e\u043c<\/a> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0442\u0432\u0435\u0442, \u0447\u0442\u043e\u00a0SwiftUI \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f\u00a0\u0447\u043b\u0435\u043d\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 DynamicProperty, \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e.<\/p>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/dynamicproperty\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f\u00a0DynamicProperty<\/a> \u043d\u0435\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e\u00a0\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>\u00abView \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0434\u043e\u00a0\u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442\u0430 view\u00bbs body\u00bb.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u00a0\u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u043e\u00a0\u043f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 @State \u0438\u043b\u0438 @Environment.<\/p>\n<p>\u0422\u0430\u043a \u043c\u043e\u0436\u0435\u043c\u00a0\u043b\u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0441\u0442\u0438\u043b\u044c \u0441\u00a0DynamicProperty?<\/p>\n<pre><code class=\"swift\">protocol RangeSliderStyle: DynamicProperty {     \/\/ ... }<\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u0441\u0442\u0438\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e\u00a0view, \u0430\u00a0\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 @Environment \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 DynamicProperty, \u044d\u0442\u043e \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043a\u00a0\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c\u0443 view:<\/p>\n<pre><code class=\"swift\">struct ResolvedRangeSliderStyle: View {     var configuration: RangeSliderStyleConfiguration      var style: any RangeSliderStyle      var body: some View {         AnyView(style.makeBody(configuration: configuration))     } }<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c\u0443 view \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435:  <\/p>\n<pre><code class=\"swift\">var body: some View {     let configuration = RangeSliderStyleConfiguration(range: $range, bounds: bounds, label: .init(label))     ResolvedRangeSliderStyle(configuration: configuration, style: style) }<\/code><\/pre>\n<p>\u041d\u043e\u00a0\u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432 \u044d\u0442\u043e, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0412\u00a0\u043d\u0430\u0448\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e\u00a0SwiftUI \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f environment \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u044f, \u0435\u0441\u043b\u0438 \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u0442\u0438\u043b\u044f \u0432\u00a0\u0441\u0440\u0435\u0434\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043e\u0431\u0451\u0440\u0442\u043a\u0443 view, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0435\u0439 \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u044f:<\/p>\n<pre><code class=\"swift\">struct ResolvedRangeSliderStyle: View {     var configuration: RangeSliderStyleConfiguration      var style: Style      var body: some View {         style.makeBody(configuration: configuration)     } }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c6a\/713\/381\/c6a71338106aaa3e1dea85b05545ecee.webp\" alt=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c.\" title=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c.\" width=\"699\" height=\"437\"\/><figcaption>\u042d\u0442\u043e\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c.<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/341\/c4d\/332\/341c4d33271f6442d221f8e708818675.webp\" alt=\"\" title=\"\" width=\"697\" height=\"93\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0441\u0442\u0440\u044f\u043b\u0438 \u0437\u0434\u0435\u0441\u044c, \u043d\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0441\u0442\u0438\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0447\u0435\u0440\u0435\u0437 self:<\/p>\n<pre><code class=\"swift\">extension RangeSliderStyle {     func resolve(configuration: Configuration) -> some View {         ResolvedRangeSliderStyle(configuration: configuration, style: self)     } }<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u0432 body \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 resolve \u0434\u043b\u044f \u0441\u0442\u0438\u043b\u044f:  <\/p>\n<pre><code class=\"swift\">var body: some View {     let configuration = RangeSliderStyleConfiguration(range: $range, bounds: bounds, label: .init(label))     AnyView(style.resolve(configuration: configuration)) }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u0441\u043d\u043e\u0432\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044f \u0441\u0442\u0438\u043b\u044e DynamicProperty \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u0432\u00a0\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 view \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430 \u0432\u00a0\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0441\u0442\u0438\u043b\u044f, \u0441\u0442\u0438\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c @Environment \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 DynamicProperty, \u0431\u0435\u0437\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u0438\u043b\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c51\/8f0\/042\/c518f0042bf379c818105d4acf6f5eee.webp\" alt=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c.\" title=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c.\" width=\"699\" height=\"437\"\/><figcaption>\u042d\u0442\u043e\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c.<\/figcaption><\/figure>\n<h3>Style Propagation<\/h3>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437\u00a0\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0441\u0442\u0438\u043b\u044c\u043d\u044b\u0445 view \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e view \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0432\u043e\u00a0view \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f\u00a0\u044d\u043a\u0440\u0430\u043d\u0430 \u0438\u043b\u0438\u00a0\u0432\u00a0\u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0438\u043b\u044c \u0432\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"swift\">WindowGroup {     ContentView()         .buttonStyle(.borderedProminent)         .toggleStyle(.checkbox)         .rangeSliderStyle(.rounded)         \/\/ ... }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/52b\/63b\/f13\/52b63bf1382f4f0b3402d16b499ecb86.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u0442\u0438\u043b\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 view SwiftUI, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a\u00a0ButtonStyle \u0438 ToggleStyle, \u043d\u0435\u00a0\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0view, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0432\u00a0\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c view \u0432\u00a0\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0442\u0430\u043a\u043e\u0439 \u043a\u0430\u043a\u00a0sheet, fullscreenCover \u0438\u043b\u0438\u00a0popover, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u0438 \u0432\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c view, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0438 \u0442\u0430\u043c.<\/p>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e\u00a0\u0441\u0442\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0443 \u0432\u043e\u00a0\u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u043a\u043d\u0430\u0445, \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 NavigationStack, \u0430\u00a0\u0435\u0441\u043b\u0438 \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c NavigationStack \u0432\u043d\u0443\u0442\u0440\u0438 TabView, \u0441\u0442\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435\u043c \u0442\u0438\u043f\u0430\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0439.<\/p>\n<p><strong>\u0417\u0430\u043c\u0435\u0442\u043a\u0430: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f environment \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u00a0\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0view \u0432\u00a0\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0445 \u0432\u00a0iOS 13\u00a0\u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432\u00a0iOS 14.<\/strong>  <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 SwiftUI, \u043d\u043e\u00a0\u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u0430\u043d\u0446\u0443\u0435\u043c \u0441\u00a0UIKit, \u043e\u0431\u0435\u0440\u043d\u0443\u0432 view \u0441\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c sheet \u0432\u00a0UIViewControllerRepresentable, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432\u00a0\u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 UIHostingController \u0434\u043b\u044f\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e view, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c sheets \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u0438:<\/p>\n<pre><code class=\"swift\">struct UIKitDanceView: UIViewControllerRepresentable {     var content: Content      init(@ViewBuilder content: @escaping () -> Content) {         self.content = content()     }      func makeUIViewController(context: Context) -> UIHostingController {         return UIHostingController(rootView: content)     }      func updateUIViewController(_ uiViewController: UIHostingController, context: Context) {      } }<\/code><\/pre>\n<pre><code class=\"swift\">extension View {     func preserveStylesInSheets() -> some View {         UIKitDanceView {             Self         }     } }<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0442\u0438\u043b\u0438 \u0432\u00a0\u043a\u043e\u0440\u043d\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 preserveStylesInSheets(), \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u044d\u0442\u0438 \u0441\u0442\u0438\u043b\u0438 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u00a0\u043b\u044e\u0431\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0445. <\/p>\n<p><strong>\u0417\u0430\u043c\u0435\u0442\u043a\u0430: \u042d\u0442\u043e\u0442 \u0442\u0440\u044e\u043a \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u00a0iOS 13, \u043d\u043e\u00a0\u0442\u0430\u043c \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f environment, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u00a0\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0view \u0432\u00a0\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0445.<\/strong>  <\/p>\n<pre><code class=\"swift\">WindowGroup {     ContentView()         .preserveStylesInSheets()         .buttonStyle(.borderedProminent)         .toggleStyle(.checkbox)         .rangeSliderStyle(.rounded)         \/\/ ... }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/52f\/2a2\/930\/52f2a2930b78a327bd3f37c0ac057532.webp\" alt=\"\" title=\"\" width=\"699\" height=\"437\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432<\/h3>\n<p>\u0421\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0438\u043b\u0435\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441\u0442\u0438\u043b\u044f \u0438\u0437\u00a0\u043d\u0430\u0448\u0438\u0445 view \u0432\u00a0\u0441\u0442\u0438\u043b\u0438 \u0438 \u0438\u043c\u0435\u0442\u044c \u0447\u0451\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0438\u043b\u0435\u043c \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 view \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0432\u00a0\u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u0442\u0438\u043b\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u043d\u0435\u00a0\u0442\u0430\u043a \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u043b\u0435\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e:<\/p>\n<pre><code class=\"swift\">@main struct MyApp: App {     var body: some Scene {         WindowGroup {             ContentView()                 .theme(.springSummer2023)         }     } }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0442\u0438\u043b\u044f view \u0432\u00a0\u0443\u0434\u043e\u0431\u043d\u043e\u0439 theme(_:), \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u044d\u0442\u043e\u043c\u0443, \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0438\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 Xcode \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u044d\u043a\u0440\u0430\u043d\u043e\u043c \u0438\u043b\u0438\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c view, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0448\u0430\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u00a0\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435, \u0438 \u043c\u044b \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e\u00a0Apple \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 view SwiftUI \u0441\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u043c\u0438.<\/p>\n<p>\u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u0438, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0432 <a href=\"https:\/\/github.com\/movingparts-io\/Styling-Components-Playground\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u0443 Xcode Playground \u043d\u0430\u00a0\u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 GitHub<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0435 view \u0441\u00a0API \u0441\u0442\u0438\u043b\u0435\u0439.\u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430\u00a0\u043d\u0430\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0438\u00a0\u0431\u044b\u0442\u044c \u0432\u00a0\u043a\u0443\u0440\u0441\u0435 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u044d\u0442\u043e\u0439, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u043d\u0430\u0441 \u0432\u00a0Mastodon \u0438\u043b\u0438\u00a0Twitter \u0438\u043b\u0438\u00a0\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u00a0\u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e Chris Eidhof \u0438 Eric Horacek \u0437\u0430\u00a0\u043e\u0442\u0437\u044b\u0432\u044b \u043e\u00a0\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u0438 Natalye Childress \u0437\u0430\u00a0\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430.<\/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\/post\/718548\/\"> https:\/\/habr.com\/ru\/post\/718548\/<\/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<p><strong>SwiftUI \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 API \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 view \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442\u00a0\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 view \u0442\u0430\u043a\u0438\u043c\u00a0\u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/strong>  <\/p>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 \u0432\u00a0\u0445\u043e\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432 \u043d\u0430 <a href=\"https:\/\/talk.objc.io\/episodes\/S01E322-custom-components-making-the-stepper-styleable\" rel=\"noopener noreferrer nofollow\">Swift Talk<\/a> \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043f\u043f\u0435\u0440 \u0434\u043b\u044f\u00a0\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041e\u043d\u00a0\u0431\u044b\u043b \u043f\u043e\u0445\u043e\u0436 \u043d\u0430\u00a0Stepper \u0432\u00a0SwiftUI, \u043d\u043e\u00a0\u0441\u00a0API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0442\u0438\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0442\u043a\u0438\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0442\u043e\u0433\u0434\u0430, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u0438\u0451\u043c\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u043b\u0438 view (\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u044c\u044e, \u0432\u044c\u044e\u0448\u043a\u0430) \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435, \u043a\u0430\u043a\u00a0built\u2011in (\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435) \u0432\u00a0SwiftUI. \u0412\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h3>\u0421\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438<\/h3>\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u044d\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 view \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f label (\u043c\u0435\u0442\u043a\u0438) \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code class=\"swift\">Button {         \/\/ Continue } label: {     HStack {         Spacer()         Text(\"Continue\")         Spacer()     }     .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))     }     .font(.system(.title2, design: .rounded, weight: .bold))     .foregroundColor(.yellow)     .background(Capsule().stroke(.yellow, lineWidth: 2))<\/code><\/pre>\n<p>\u0425\u043e\u0442\u044f SwiftUI \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 view \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u043d\u043e\u00a0\u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435\u00a0\u0436\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 \u0432\u00a0HStack. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<figure class=\"full-width\"><figcaption>\u0422\u0430\u043a\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u043e \u0432\u0441\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.<\/figcaption><\/figure>\n<h3>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0438\u043b\u044f<\/h3>\n<p>\u041f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043a\u0430\u043a\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b view \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043b\u0438 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u0432\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441\u00a0\u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u0434\u043b\u044f\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438\u00a0\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a\u00a0\u0431\u0440\u0435\u043d\u0434\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e\u00a0\u0436\u0435 \u0441\u0442\u0438\u043b\u044f \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c view Button, \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432\u00a0\u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 view \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u00a0API, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c SwiftUI Button, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u00a0\u043d\u0435\u043c\u0443 \u0441\u0442\u0438\u043b\u044c:<\/p>\n<pre><code class=\"swift\">struct MyButton: View {     var action: () -> Void     var label: Label      init(action: @escaping () -> Void, @ViewBuilder label: () -> Label) {         self.action = action         self.label = label()     }      var body: some View {         Button {             action()         } label: {             HStack {                 Spacer()                 Label                 Spacer()             }             .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))         }         .font(.system(.title2, design: .rounded, weight: .bold))         .foregroundColor(.yellow)         .background(Capsule().stroke(.yellow, lineWidth: 2))     } }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 view, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u00a0\u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b, \u0447\u0442\u043e\u00a0\u0438 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 view, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u00a0\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u043e\u0434\u0435:  <\/p>\n<pre><code class=\"swift\">struct MyButton where Label == Text {     @_disfavoredOverload     init(_ title: some StringProtocol, role: ButtonRole? = nil, action: @escaping () -> Void) {         self.action = action         self.role = role         self.label = Text(title)     }     init(_ titleKey: LocalizedStringKey, role: ButtonRole? = nil, action: @escaping () -> Void) {         self.action = action         self.role = role         self.label = Text(titleKey)     } }<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u00a0\u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0434\u0430, Button \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b String \u043a\u0430\u043a\u00a0LocalizedStringKey, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0448\u0430\u0431\u043b\u043e\u043d @_disfavoredOverload. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e view \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u043e\u0439, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0425\u043e\u0442\u044f \u0441\u0442\u0438\u043b\u044c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u0430\u0436\u043d\u043e \u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c view MyButton \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0438 SwiftUI \u0432\u043e\u00a0\u0432\u0441\u0451\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0412\u00a0\u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c.<\/p>\n<pre><code class=\"swift\">VStack {     MyButton(\"OK\") {         \/\/ Confirm     }     Button(\"Cancel\") {         \/\/ Oops, wrong button     } }<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u00a0\u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0443\u00a0SwiftUI \u0435\u0441\u0442\u044c API, \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<h3>View \u0441\u0442\u0438\u043b\u0435\u0439<\/h3>\n<p>API view \u0441\u0442\u0438\u043b\u0435\u0439 SwiftUI \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u0430\u043a\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b view font(_:) \u0438 tint(_:), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u0432\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e view \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0438\u043b\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c view \u0432\u00a0\u044d\u0442\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438:<\/p>\n<pre><code class=\"swift\">HStack {     Button(\"Undo\") { \/* \u2026 *\/ }     Button(\"Redo\") { \/* \u2026 *\/ } } .foregroundColor(.black) .font(.system(.title3, design: .rounded).bold()) .tint(.yellow) .buttonStyle(.borderedProminent)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0446\u0432\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0430, \u0448\u0440\u0438\u0444\u0442, \u043e\u0442\u0442\u0435\u043d\u043e\u043a \u0438 \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0HStack, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u00a0\u0432\u0441\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u00a0\u043a\u043e\u0440\u043d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 view:<\/p>\n<pre><code class=\"swift\">@main struct MyApp: App {     var body: some Scene {         WindowGroup {             ContentView()                 .tint(.yellow)                 .buttonStyle(.borderedProminent)         }     } }<\/code><\/pre>\n<p>SwiftUI \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0438\u043b\u0435\u0439 \u043d\u0430\u00a0\u0432\u044b\u0431\u043e\u0440, \u0430\u00a0\u0434\u043b\u044f\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 view, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0445 \u0441\u0442\u0438\u043b\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u0442\u0438\u043b\u0438.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u043d\u0430\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u2011\u0442\u043e, \u0447\u0442\u043e\u00a0SwiftUI \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f\u00a0\u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<p>\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 buttonStyle(_:), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0442\u0438\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0438\u043f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439\u00a0\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 ButtonStyle,\u00a0\u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 PrimitiveButtonStyle.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437\u00a0\u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f makeBody(configuration:). \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0435\u043c.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c configuration.label, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c view, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043c\u0435\u0442\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u0441\u0442\u0438\u043b\u044c \u043a\u00a0\u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u043a\u0435:<\/p>\n<pre><code class=\"swift\">struct CustomButtonStyle: ButtonStyle {     func makeBody(configuration: Configuration) -> some View {         HStack {             Spacer()             configuration.label             Spacer()         }         .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))         .font(.system(.title2, design: .rounded).bold())         .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))         .foregroundColor(.yellow)         .background {             Capsule()                 .stroke(.yellow, lineWidth: 2)         }     } }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e.buttonStyle(CustomButtonStyle()).<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 view, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>Toggle<\/p>\n<\/li>\n<li>\n<p>DatePicker<\/p>\n<\/li>\n<li>\n<p>Gauge<\/p>\n<\/li>\n<li>\n<p>ProgressView<\/p>\n<\/li>\n<li>\n<p>Label<\/p>\n<\/li>\n<li>\n<p>LabeledContent<\/p>\n<\/li>\n<li>\n<p>DisclosureGroup<\/p>\n<\/li>\n<li>\n<p>ControlGroup<\/p>\n<\/li>\n<li>\n<p>GroupBox<\/p>\n<\/li>\n<li>\n<p>Form<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0438\u043b\u044f \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0442\u0438\u043b\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0436\u0430\u0442\u0430\u00a0\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0438 \u043a\u0430\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0438\u0434 \u043f\u0440\u0438\u00a0\u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0438\u043b\u0438\u00a0\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435:<\/p>\n<pre><code class=\"swift\">.background {     Capsule()         .stroke(configuration.role == .destructive ? .red : .yellow, lineWidth: 2) } .opacity(configuration.isPressed ? 0.5 : 1)  VStack(spacing: 16) {     Button(role: .destructive) {         \/\/ Delete     } label: {         Label(\"Delete\", systemImage: \"trash\")     }     Button(\"Cancel\", role: .cancel) {         \/\/ Cancel Deletion     } } .buttonStyle(CustomButtonStyle())<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439<\/h3>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u00a0\u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u043b\u0430\u0433, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430\u00a0\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 view disabled(_:).<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 view \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c view, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u00a0\u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 view. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u00a0view \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment (\u0441\u0440\u0435\u0434\u044b). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 environment isEnabled:<\/p>\n<pre><code class=\"swift\">@Environment(\\.isEnabled) var isEnabled  func makeBody(configuration: Configuration) -> some View {     \/\/ ...         .saturation(isEnabled ? 1 : 0) }<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 view<\/h3>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 view SwiftUI \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u00a0\u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u043d\u0430\u043c\u00a0\u0431\u044b \u0442\u043e\u0433\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043d\u043e, \u043a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0438\u043b\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 view SwiftUI.<\/p>\n<p>\u0425\u043e\u0442\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0442\u044c \u043a\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 view \u0434\u043b\u044f\u00a0\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u0432\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 view \u0438\u043b\u0438\u00a0\u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 SwiftUI, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0443\u0441\u043f\u0435\u0445\u0430, \u0441\u0434\u0435\u043b\u0430\u0432 \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 view \u0441\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u043c\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u044d\u0442\u043e \u043d\u0430\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f RangeSlider:<\/p>\n<pre><code class=\"swift\">struct RangeSlider: View {     @Binding     var range: ClosedRange      var bounds: ClosedRange?      var label: Label      init(value: Binding>, in bounds: ClosedRange? = nil, @ViewBuilder label: () -> Label) {         self._value = value         self.bounds = bounds         self.label = label()     }      var body: some View {         LabeledContent {             \/\/ ...         } label: {             Label         }     } }<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u00a0\u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e view \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u0442\u0438\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c?<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a\u00a0API \u0441\u0442\u0438\u043b\u044f SwiftUI \u0434\u043b\u044f\u00a0\u043a\u043d\u043e\u043f\u043a\u0438, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043b\u044f\u00a0\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<p>ButtonStyle \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0438\u043b\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Button \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0431\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00a0\u0436\u0435\u0441\u0442\u043e\u0432, \u0430\u00a0PrimitiveButtonStyle \u0434\u0430\u0451\u0442 \u0441\u0442\u0438\u043b\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u043a\u043d\u043e\u043f\u043a\u043e\u0439.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441\u0442\u0438\u043b\u0435\u0439 \u0432\u00a0SwiftUI \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b PrimitiveButtonStyle \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0441\u043e \u0441\u0442\u0438\u043b\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 ToggleStyle view Toggle \u043d\u0435\u00a0\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00a0\u0436\u0435\u0441\u0442 \u0437\u0430\u00a0\u043d\u0430\u0441. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0434\u043b\u044f\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0442\u0438\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f view.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u043c \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0442\u0438\u043b\u0435\u0439 \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 API \u0441\u0442\u0438\u043b\u0435\u0439 \u043a\u043d\u043e\u043f\u043e\u043a SwiftUI.<\/p>\n<p>API\u2011\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0441\u0442\u0438\u043b\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437\u00a0\u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439\u00a0\u2014<\/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-345918","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345918","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=345918"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345918\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=345918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=345918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=345918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}