рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдкрд░ рдПрдирд┐рдореЗрдЯреЗрдб рдХрд╛рд░реНрдб

рдЖрдЗрдП, SwiftUI рдкрд░ рд╣рд╛рд╡рднрд╛рд╡ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдирд┐рдореЗрдЯреЗрдб рдХрд╛рд░реНрдб SwiftUI :



рдореИрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬреАрдЖрдИрдПрдл рдХрд╛ рдЖрдХрд╛рд░ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдирд╣реАрдВ рд╣реИред рдПрдХ рдмрдбрд╝реЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЛ рд▓рд┐рдВрдХ рдкрд░ рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА


SwiftUI рдЕрдм рдмреАрдЯрд╛ рдореЗрдВ рд╣реИ, рдФрд░ рдирдП Xcode рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдЬреЛ рдмреАрдЯрд╛ рдореЗрдВ рднреА рд╣реИред рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдирдП Xcode рдХреЛ рдкреБрд░рд╛рдиреЗ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк рд╢рд╛рдпрдж рд╣реА рдХрд┐рд╕реА рджрд░реНрдж рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЖрдк Applications рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд▓рд┐рдВрдХ рд╕реЗ рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


SwiftUI рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдЖрдкрдиреЗ рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдкреНрд░реАрд╡реНрдпреВ рджреЗрдЦрд╛ SwiftUI ред рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдХреБрдЫ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ, рдЖрдкрдХреЛ рдмреАрдЯрд╛ macOS Catalina рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рджрд░реНрдж рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╢рд░реНрдд рдирд╣реАрдВ рд▓рдЧрд╛рдИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреБрд░рд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдЪрд▓рд╛рдКрдВрдЧрд╛ред


рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛


рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ Single View Application рдмрдирд╛рдПрдВ - SwiftUI :



ContentView.swift рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВред рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рд╡рд╛рд░рд┐рд╕ PreviewProvider рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ:


 import SwiftUI struct ContentView: View { var body: some View { } } 

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ SwiftUI рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЖрдо рд╕рдордЭ рд╣реИ, рд╣рдо рддреБрдЪреНрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред


рдкрддреНрддреЗ


рдХрд╛рд░реНрдб рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо ZStack рдЙрдкрдпреЛрдЧ ZStack ред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╕рдореВрд╣ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: HStack - рдХреНрд╖реИрддрд┐рдЬ рдФрд░ VStack - рдЕрдиреБрд▓рдВрдм рд░реВрдк рд╕реЗред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП:



рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдб рдЬреЛрдбрд╝реЗрдВ:


 struct ContentView: View { var body: some View { return ZStack { Rectangle() .fill(Color.black) .frame(height: 230) .cornerRadius(10) .padding(16) } } } 

рдпрд╣рд╛рдБ рд╣рдордиреЗ рдПрдХ рдЖрдпрдд рдЬреЛрдбрд╝рд╛, рдХрд╛рд▓реЗ рд░рдВрдЧ рдХрд╛, 230pt рдКрдБрдЪрд╛, рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ 10pt рдЧреЛрд▓ рдХрд┐рдпрд╛ рдФрд░ рд╣рд╛рд╢рд┐рдпреЗ рдХреЗ рд╕рднреА рдкрдХреНрд╖реЛрдВ рдХреЛ 16pt рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ред


рдЖрдпрдд рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдб рдореЗрдВ рдкрд╛рда ZStack рдмреНрд▓реЙрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:


 Text("Main Card") .color(.white) .font(.title) .bold() 

рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХрд╛ рд░рд┐рдЬрд▓реНрдЯ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдВ:



рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рддреАрди рд╣реИрдВ!



рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо MainCard рдХреЛрдб MainCard рдХрд░реЗрдВрдЧреЗ:


 struct MainCard: View { var title: String var body: some View { ZStack { Rectangle() .fill(Color.black) .frame(height: 230) .cornerRadius(10) .padding(16) Text(title) .color(.white) .font(.largeTitle) .bold() } } } 

title рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдпрд╣ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛рд░реНрдб рдкрд░ рд╣реЛрдЧрд╛ред ContentView рдПрдХ рдХрд╛рд░реНрдб рдЬреЛрдбрд╝реЗрдВ, рдЙрд╕реА рд╕рдордп рд╣рдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рджреЗрдЦреЗрдВрдЧреЗ:


 struct ContentView: View { var body: some View { return MainCard(title: "Main Card") } } 

рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреБрд░рдВрдд рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:


 struct Card: View { var title: String var body: some View { ZStack { Rectangle() .fill(Color(red: 68 / 255, green: 41 / 255, blue: 182 / 255)) .frame(height: 230) .cornerRadius(10) .padding(16) Text(title) .color(.white) .font(.title) .bold() } } } 

рдкрд╛рда рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ рдФрд░ рд╢реИрд▓реА рд╕реЗрдЯ рдХрд░реЗрдВред рдмрд╛рдХреА рдХреЛрдб рдореБрдЦреНрдп рдмреНрд▓реИрдХ MainCard рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред ContentView рджреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд╛рд░реНрдб рдЬреЛрдбрд╝реЗрдВред рдХрд╛рд░реНрдб рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ ZStack рдореЗрдВ ZStack ред ContentView рдХреЛрдб:


 struct ContentView: View { var body: some View { return ZStack { Card(title: "Third card") Card(title: "Second Card") MainCard(title: "Main Card") } } } 

рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдб рдХрд╛рд▓реЗ рд░рдВрдЧ рдХреЗ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдм рддрдХ рд╡реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдКрдкрд░ рдХреА рдУрд░ рдСрдлрд╕реЗрдЯ рдФрд░ рдкреИрдбрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ:


 Card(title: "Third card") .blendMode(.hardLight) .padding(64) .padding(.bottom, 64) Card(title: "Second Card") .blendMode(.hardLight) .padding(32) .padding(.bottom, 32) MainCard(title: "Main Card") 

рдЕрдм рдкрд░рд┐рдгрд╛рдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдШреЛрд╖рдгрд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЪрд▓реЛ рдЗрд╢рд╛рд░реЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рдПрдирд┐рдореЗрд╢рди рддрдХред


рдЗрд╢рд╛рд░реЛрдВ


рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдореБрдЭреЗ рд╢реВрдиреНрдп рдХрд░реНрдо рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╖рд╛рдХреНрдд рд╕рдореАрдХреНрд╖рд╛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред



рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдХреЛрдб рджреЗрдЦреЗрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ developer.apple.com рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реИред рдкрд╣рд▓реА рдзрд╛рд░рдгрд╛ рднреНрд░рд╛рдордХ рд╣реИ, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ред


ContentView рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:


 enum DragState { case inactive case dragging(translation: CGSize) var translation: CGSize { switch self { case .inactive: return .zero case .dragging(let translation): return translation } } var isActive: Bool { switch self { case .inactive: return false case .dragging: return true } } } 

DragState рдПрдХ рдЗрд╢рд╛рд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдмрдирд╛ рджреЗрдЧрд╛ред рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рдореЗрдВ рдбреНрд░реИрдЧрд╕реНрдЯреЗрдЯ dragState рдЬреЛрдбрд╝реЗрдВ:


 @GestureState var dragState = DragState.inactive 

рдЬрд╛рджреВ рд╣реЛрдЧрд╛ред



рдЬрд╣рд╛рдВ рднреА dragState рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдирдП рдореВрд▓реНрдп рдЕрдкрдиреЗ рдЖрдк рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдПрдХ рдЗрд╢рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:


 let dragGester = DragGesture() .updating($dragState) { (value, state, transaction) in state = .dragging(translation: value.translation) } 

рдореБрдЦреНрдп рдХрд╛рд░реНрдб рдореЗрдВ рдПрдХ рдЗрд╢рд╛рд░рд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ offset рд╕реЗрдЯ рдХрд░реЗрдВ:


 MainCard(title: "Main Card") .offset( x: dragState.translation.width, y: dragState.translation.height ) .gesture(dragGester) 

рдЬрдм рдпрд╣ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдСрдлрд╕реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛? рдирд╣реАрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ ред рдпрд╣ рдЬрд╛рджреВ рд╣реИред


рдХрд╛рд░реНрдб рдлреЙрд▓реЛ рдХрд░реЗрдВрдЧреЗ рдПрдХ рдЙрдВрдЧрд▓реА рд╕реЗ рдПрдХ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдПрдирд┐рдореЗрд╢рди рдХреЗ рдмрд┐рдирд╛:



рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдб рдХреЛ рднреА рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдП ( рдХрдо рд╕реЗ рдХрдо рд╣рдо рдРрд╕рд╛ рдЪрд╛рд╣рддреЗ рдереЗ )ред рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЗрд╢рд╛рд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред rotation3DEffect рдПрдбреЗрдХреНрдЯ рдХрд╛рд░реНрдб рдХреЛ рдШреБрдорд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдЗрд╢рд╛рд░рд╛ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛:


 Card(title: "Third card") .rotation3DEffect(Angle(degrees: dragState.isActive ? 0 : 60), axis: (x: 10.0, y: 10.0, z: 10.0)) .blendMode(.hardLight) .padding(dragState.isActive ? 32 : 64) .padding(.bottom, dragState.isActive ? 32 : 64) Card(title: "Second Card") .rotation3DEffect(Angle(degrees: dragState.isActive ? 0 : 30), axis: (x: 10.0, y: 10.0, z: 10.0)) .blendMode(.hardLight) .padding(dragState.isActive ? 16 : 32) .padding(.bottom, dragState.isActive ? 0 : 32) 

рдЖрдк 3D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред рдореИрдВрдиреЗ blendMode рднреА рдЬреЛрдбрд╝рд╛ред рдореЛрдб рдлрд╝реЛрдЯреЛрд╢реЙрдк рдФрд░ рд╕реНрдХреЗрдЪ рдореЗрдВ рдЙрдкрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИрдВред


рдЬрдмрдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдПрдирд┐рдореЗрдЯреЗрдб рдирд╣реАрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред


рдПрдиреАрдореЗрд╢рди


рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред рдмрд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:


 .animation(.spring()) 

рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗрдВред рдЕрдм рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдПрдирд┐рдореЗрдЯреЗрдб рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди-рдЖрдХрд╛рд░, 3 рдбреА рд░реЛрдЯреЗрд╢рди рдФрд░ offset ред рдпрджрд┐ рдЖрдкрдХреЛ рдШрдЯрддрд╛ рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ basic рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдЕрд▓рдВрдХрд░рдг


рдСрдлрд╕реЗрдЯ рд╕реЗ рдмрдВрдзреЗ рдореБрдЦреНрдп рджреГрд╢реНрдп рдХреА рдЫрд╛рдпрд╛ рдФрд░ рд░реЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ:


 .rotationEffect(Angle(degrees: Double(dragState.translation.width / 10))) .shadow(radius: dragState.isActive ? 8 : 0) 

рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╕рдВрджрд░реНрдн рджреЗрдЦреЗрдВрдЧреЗред рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЪрд╛рд▓реВ рдХрд░реЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, рдкреНрд░рднрд╛рд╡ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдб рдХреЛ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдЦреАрдВрдЪреЗрдВред



рд╕рд╛рдзрдХреЛрдВ рдХреЗ рд▓рд┐рдП


тЖТ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рднрдВрдбрд╛рд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдмрд╛рдд рд╕реЗ рдбрд░реЛ рдордд рдХрд┐ рдЗрддрдирд╛ рдХрдо рдХреЛрдб SwiftUI рд╕реЗ рдПрдХ рд╣реИред


рдпрджрд┐ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рддреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВред рд╡реИрд╕реЗ, рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдореИрдВ рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдкреНрд░реАрд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред


Source: https://habr.com/ru/post/hi456936/


All Articles