рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ: рдПрдХреНрд╡рд╛рдпрдВрдЯреЗрдВрд╕

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

рдЕрдиреБрдорд╛рдирд┐рдд рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп: 25 рдорд┐рдирдЯред

SwiftUI рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрд┐рд▓реНрдбрд░ (рдЖрдИрдмреА) рдФрд░ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдИрдмреА рдФрд░ рдПрдХреНрд╕рдХреЛрдб рдПрдХреНрд╕рдХреЛрдб 4 рд╕реЗ рдкрд╣рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереЗ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ "рдбреЙрдХрд┐рдВрдЧ" рддрдм рднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╣рдо IBAction рдпрд╛ IBOutlet рдирд╛рдо рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП IB рдХреЛ рдХреЛрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╛ рдЬрдм рд╣рдо рд╕реЗрдЧрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЯреЗрдмрд▓ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди Xcode рдЙрдиреНрд╣реЗрдВ рдЪреЗрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрдВред

рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП SwiftUI! рдХреЛрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╣реА рд╣рдореЗрдВ рддреБрд░рдВрдд рджреГрд╢реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рддрд░рдл рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рджреВрд╕рд░реЗ рдкрд░ рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╣рдореЗрд╢рд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЧрд▓рдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рдм рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдордиреЗ рдЗрд╕реЗ UIKit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рдордЭрдирд╛, рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдФрд░ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдУ, рдХреНрдпрд╛ рд╡рд╣ рдЕрджреНрднреБрдд рдирд╣реАрдВ рд╣реИ?

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ


рдЖрдЗрдП Xcode рдкреНрд░реЛрдЬреЗрдХреНрдЯ ( Shift-Command-N ) рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ, iOS new рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдРрдк рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, RGBullsEye рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ SwiftUI рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдЕрдм AppDelegate.swift рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ: AppDelegate.swift рдФрд░ SceneDelegate.swift , рдФрд░ SceneDelegate рдореЗрдВ рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реЛрддреА рд╣реИ:



рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, SceneDelegate, SwiftUI рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ:

window.rootViewController = UIHostingController(rootView: ContentView()) 

UIHostingController SwiftUI-view ContentView рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рддрд╛ рд╣реИред
рдиреЛрдЯ: UIHostingController рд╣рдореЗрдВ SwiftUI-view рдХреЛ рдПрдХ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕реНрдЯреЛрд░реА рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рд╣рдорд╛рд░реЗ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ UIViewController рд╕реЗ рдЗрд╕ рдкрд░ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдмрдирд╛рдПрдВред рддрдм рд╣рдо IBSegueAction рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдкрд░ segue рдХреЗ рд╕рд╛рде рдХрдВрдЯреНрд░реЛрд▓-рдбреНрд░реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ rootView - SwiftUI-view рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдВрдбреЛ ContentView рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ, рдЬреЛ рдХрд┐ ContentView.swift рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рджреГрд╢реНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ:

 struct ContentView: View { var body: some View { Text("Hello World") } } 

рдпрд╣ рдПрдХ ContentView ( рдирд┐рдХрд╛рдп ) рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдШреЛрд╖рдгрд╛ рд╣реИред рдЕрдм рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рд╣реИред

ContentView_Previews рдХреЗ рдареАрдХ рдиреАрдЪреЗ ContentView рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } 

рдпрд╣рд╛рдВ рд╣рдо рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд╣рд╛рдВ рд╣реИ?

рдХреЛрдб рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝рд╛ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╣реИ:



рд░рд┐рдЬреНрдпреВрдореЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ , рдПрдХ рдкрд▓ рд░реБрдХреЗрдВ рдФрд░ ...



рд╣рдорд╛рд░рд╛ UI рд╕реНрдХреЗрдЪ рдХрд░реЗрдВ


рдХреБрдЫ рдкрд░рд┐рдЪрд┐рдд рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ - рдпрд╣ Main.storyboard рдлрд╝рд╛рдЗрд▓ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдпреВрдЖрдИрдЖрдИ рдХреЛ SwiftUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреЛрдб рдореЗрдВ, рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЗрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ: рд╣рдо рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рд╕реИрдХрдбрд╝реЛрдВ рд▓рд╛рдЗрдиреЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрдиреА рд╣реИрдВред

SwiftUI рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИ: рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ UI рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ SwiftUI рдпрд╣ рд╕рдм рдХреБрд╢рд▓ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Apple рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдб рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реЛред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ - рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдб рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдк рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕реНрдЯрдмреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдХреЗрдЪ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд╛рда ("рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб") рдмрджрд▓реЗрдВ:

 Text("Target Color Block") 

рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред

рдЕрдм рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ рдЗрд╕ рджреГрд╢реНрдп рдкрд░ рдХрдорд╛рдВрдб-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ HStack рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ рдЪреБрдиреЗрдВ:



рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рднреА рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:

 HStack { Text("Target Color Block") } 

рдЯреЗрдХреНрд╕реНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ HStack рдХреЗ рдЕрдВрджрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рд╣рдо рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 HStack { Text("Target Color Block") Text("Guess Color Block") } 

рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЕрдм HStack рдХреЛ VStack рдкрд░ рд░рдЦрдХрд░ рд╕реНрд▓рд╛рдЗрдбрд░ рд╕реНрдЯрдмреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ HStack рдкрд░ рдХрдорд╛рдВрдб-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВрдЧреЗ:



VStack рдореЗрдВ рдПрдореНрдмреЗрдб рдЪреБрдиреЗрдВ; рдПрдХ рдирдпрд╛ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рддрд╣рдд рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВрдЧреЗред

HStack рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдПрдХ рдирдИ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓рдмрд╛рд░ рдкрд░ + рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╡рд░реНрдЯрд┐рдХрд▓ рд╕реНрдЯреИрдХ рдХреЛ рдПрдХ рдирдП рдкреГрд╖реНрда рдкрд░ рдЦреАрдВрдЪреЗрдВ:



рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХреЛрдб рдФрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЛрдиреЛрдВ рдмрджрд▓ рдЧрдП рд╣реИрдВ:



рдбреНрд░рд╛рдлреНрдЯ рдпреВрдЖрдИ рдкрд░ рдХрд╛рдо рдЦрддреНрдо рдХрд░реЗрдВ, рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗ:

 VStack { HStack { Text("Target Color Block") Text("Guess Color Block") } Text("Hit me button") VStack { Text("Red slider") Text("Green slider") Text("Blue slider") } } 

рдирдИ VStack рдореЗрдВ, рддреАрди рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдереЛрдбрд╝реЗ рд╕рдордп рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдФрд░ рд░рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рдмреАрдЪ рдПрдХ рдмрдЯрди рднреА рд╣реЛрдЧрд╛ред

рд╣рдо рдпреВрдЖрдИ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ


рдЕрдм рдЪрд▓реЛ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рдПрдХ HStack рдХреЛ рд░рдВрдЧреАрди рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдЖрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:

 HStack { // Target color block VStack { Rectangle() Text("Match this color") } // Guess color block VStack { Rectangle() HStack { Text("R: xxx") Text("G: xxx") Text("B: xxx") } } } 

рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рдЖрдпрдд рд╣реИред рд▓рдХреНрд╖реНрдп (рд▓рдХреНрд╖реНрдп) рд░рдВрдЧ рдмреНрд▓реЙрдХ рдореЗрдВ рдЖрдпрдд рдХреЗ рдиреАрдЪреЗ рдПрдХ рдкрд╛рда рджреГрд╢реНрдп рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЪрдпрдирд┐рдд рдПрдХ (рдЕрдиреБрдорд╛рди) рдореЗрдВ рддреАрди рдкрд╛рда рджреГрд╢реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╣рдо рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде 'xxx' рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред

рдЪрд░ '@State' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


SwiftUI рдореЗрдВ, рд╣рдо рдирд┐рдпрдорд┐рдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╣рдо UI рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо '@State' рдЬреИрд╕реЗ рдЪрд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рд░рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЪрдпрдирд┐рдд рд░рдВрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЪрд░ '@State' рдЪрд░ рд╣реЛрдВред

рд╢рд░реАрд░ рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рдкрд╣рд▓реЗ, Content ContentView рдХреЗ рдЕрдВрджрд░ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 let rTarget = Double.random(in: 0..<1) let gTarget = Double.random(in: 0..<1) let bTarget = Double.random(in: 0..<1) @State var rGuess: Double @State var gGuess: Double @State var bGuess: Double 

R, G рдФрд░ B рдХреЗ рдорд╛рди 0 рдФрд░ 1 рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рдд рд╣реИрдВред рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЪрдпрдирд┐рдд рдорд╛рдиреЛрдВ рдХреЛ 0.5 рд╕реЗ рднреА рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрдм рдЕрдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВред

рдЪрд▓реЛ рд╕рд╛рдордЧреНрд░реА ContentView_Previews рдкрд░ рдереЛрдбрд╝рд╛ рдХрдо рдЪрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП ContentView рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЪрдпрдирд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ ContentView () рдмрджрд▓реЗрдВ:

 ContentView(rGuess: 0.5, gGuess: 0.5, bGuess: 0.5) 

рдЬрдм рд╣рдо рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ рдЙрдирдХреЗ рдорд╛рди рдордзреНрдп рдореЗрдВ рд╣реЛрдВрдЧреЗред

рд╣рдореЗрдВ рджреГрд╢реНрдп рд╕рдорд╛рд░реЛрд╣ (рджреГрд╢реНрдп: _ConnectTo: рд╡рд┐рдХрд▓реНрдк :) - рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп () рдХреЛ рдмрджрд▓реЗрдВ : рджреГрд╢реНрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рджреГрд╢реНрдп рдореЗрдВ рдЗрдирд┐рд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

 window.rootViewController = UIHostingController(rootView: ContentView(rGuess: 0.5, gGuess: 0.5, bGuess: 0.5)) 

рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрд▓рд╛рдЗрдбрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реЛрдВрдЧреЗред

рдЕрдм рд▓рдХреНрд╖реНрдп рдЖрдпрдд рдореЗрдВ рдПрдХ рд░рдВрдЧ рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝реЗрдВ:

 Rectangle() .foregroundColor(Color(red: rTarget, green: gTarget, blue: bTarget, opacity: 1.0)) 

TheforegroundColor рд╕рдВрд╢реЛрдзрдХ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди RGB рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЖрдпрдд рджреГрд╢реНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕реА рддрд░рд╣, рдЕрдиреБрдорд╛рди рдЖрдпрдд рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:

 Rectangle() .foregroundColor(Color(red: rGuess, green: gGuess, blue: bGuess, opacity: 1.0)) 

0.5 рдкрд░ рдЖрд░, рдЬреА рдФрд░ рдмреА рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдПрдХ рдЧреНрд░реЗ рд░рдВрдЧ рдорд┐рд▓рддрд╛ рд╣реИред

рд░рд┐рдЬреНрдпреВрдореЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдкрд▓ рд░реБрдХреЗрдВред



рджреГрд╢реНрдп рдХреЛ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдмрдирд╛рдирд╛


рдкрд╣рд▓реЗ, рд╣рдо рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪреЗрдВрдЧреЗ рдФрд░ рдмрд╕ рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдмрдирд╛ рджреЗрдВрдЧреЗред рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЗ рд▓рд┐рдП VStack рдореЗрдВ , рдЗрд╕ HStack рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕реНрдЯ ("рд░реЗрдб рд╕реНрд▓рд╛рдЗрдбрд░") рдкреНрд▓рдЧ рдХреЛ рдмрджрд▓реЗрдВ :

 HStack { Text("0") .foregroundColor(.red) Slider(value: $rGuess) Text("255") .foregroundColor(.red) } 

рд╣рдордиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд░рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдореЗрдВ рд▓рд╛рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╕реНрд▓рд╛рдЗрдбрд░ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрдорд╛ 0 рд╕реЗ 1 рддрдХ рд╣реИ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред
рдиреЛрдЯ: рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд▓рд╛рдЗрдбрд░ 0 рд╕реЗ 1 рддрдХ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдмрд▓ '255' рд╣реИ рдЬреЛ рдХрд┐ 0 рд╕реЗ 255 рддрдХ рд╕реАрдорд╛ рдореЗрдВ RGB рдорд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЪрд░ рдХреЗ рд▓рд┐рдП $ рдЖрдЗрдХрди рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ ? рдФрд░! рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдФрд░ рдЕрдм рднреА $ ?

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╡рд╣ рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдФрд░ рдЕрд╕рдВрдЧрдд рд╣реИ, рд╡рд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред RGuess рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрдврд╝рд╛-рд▓рд┐рдЦрд╛ рдореВрд▓реНрдп рд╣реИред рд▓реЗрдХрд┐рди $ rGuess рдПрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИ , рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░ рдЪрдпрдирд┐рдд рд░рдВрдЧ рдХреА рдЖрдпрдд рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдпрдд рдХреЗ рддрд╣рдд рддреАрди рдкрд╛рда рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ:

 HStack { Text("R: \(Int(rGuess * 255.0))") Text("G: \(Int(gGuess * 255.0))") Text("B: \(Int(bGuess * 255.0))") } 

рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ $ рдЙрдкрд╕рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЕрджреНрдпрддрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ:



рд░рдВрдЧреАрди рдЖрдпрддрд╛рдХрд╛рд░ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд┐рдХреБрдбрд╝ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдмрд▓ рдЧрдбрд╝рдмрдбрд╝ рджрд┐рдЦрддреЗ рд╣реИрдВ - рд╡реЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдмрд╣реБрдд рджрдмрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЗрдП HStack рдореЗрдВ рдПрдХ рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝реЗрдВ - рдЧрджреНрджреА:

 HStack { Text("0") .foregroundColor(.red) Slider(value: $rGuess) Text("255") .foregroundColor(.red) } .padding() 

рдЕрдм рдмрд╣реБрдд рдмреЗрд╣рддрд░!



Hackack рд▓рд╛рд▓ рд╕реНрд▓рд╛рдЗрдбрд░ рдкрд░ рдХрдорд╛рдВрдб-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ , рдФрд░ рдПрдХреНрд╕реНрдЯреНрд░реЗрдХреНрдЯ рд╕рдмрд╡реНрдпреВ рдЪреБрдиреЗрдВ:



рдпрд╣ Refactor same Extract to Function рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди SwiftUI рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдПред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдХрдИ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ, рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдЕрдм рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред

рдкрд░рд┐рдгрд╛рдореА рджреГрд╢реНрдп ColorSlider рдХреЛ рдирд╛рдо рджреЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдирдП рджреГрд╢реНрдп рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЗ рд╕рд╛рдордиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 @Binding var value: Double var textColor: Color 

рдЕрдм $ rGuess рдХреЛ $ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ , рдФрд░ред рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде .red :

 Text("0") .foregroundColor(textColor) Slider(value: $value) Text("255") .foregroundColor(textColor) 

рдЖрдЗрдП VStack рдореЗрдВ ColorSlider () рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:

 ColorSlider(value: $rGuess, textColor: .red) 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд▓рд╛рд▓ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯрдмреНрд╕ рдХреЛ рд╣рд░реЗ рдФрд░ рдиреАрд▓реЗ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рд╕реЗ рдмрджрд▓реЗрдВред рд╡рд╣рд╛рдВ рд╕рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдбрд╛рд▓рдирд╛ рди рднреВрд▓реЗрдВ:

 ColorSlider(value: $gGuess, textColor: .green) ColorSlider(value: $bGuess, textColor: .blue) 

рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ :


рдиреЛрдЯ: рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рд░рд┐рдЬреНрдпреВрдореЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рд╢реЙрд░реНрдЯрдХрдЯ рдкрд╕рдВрдж рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж Option-Command-P рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред
рдФрд░ рдЕрдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛! рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ, рд▓рд╛рдЗрд╡ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:



рд▓рд╛рдЗрд╡ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣рдореЗрдВ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рдерд╛!

рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:



рдЕрджреНрднреБрдд! рд╣рдо рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░рдВрдЧ рдЪреБрдирд╛ рд╣реИ?

рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдПрдВ


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ContentView рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЪрд░ @ рдХреЗ рдмреАрдЪ рдФрд░
рд╢рд░реАрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 func computeScore() -> Int { let rDiff = rGuess - rTarget let gDiff = gGuess - gTarget let bDiff = bGuess - bTarget let diff = sqrt(rDiff * rDiff + gDiff * gDiff + bDiff * bDiff) return Int((1.0 - diff) * 100.0 + 0.5) } 

рдЕрдВрддрд░ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рддреАрди-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдореВрд▓реНрдпред рдПрдХ рдЕрдиреБрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдШрдЯрд╛рд╡ 1 рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдорд╛рди 0 рд╕реЗ 100 рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЕрдВрддрд░ рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рдЕрдиреБрдорд╛рди рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред

рдлрд┐рд░ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕реНрдЯ ("рд╣рд┐рдЯ рдореА рдмрдЯрди") рд╕реНрдЯрдм рдХреЛ рдмрджрд▓реЗрдВ:

 Button(action: { }) { Text("Hit Me!") } 

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

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо ContentView рдХрд╛ рдЕрд▓рд░реНрдЯ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдЯрд╛рдЗрдк рдмреВрд▓ рдХрд╛ '@State' рд╡реЗрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдлрд┐рд░ рд╣рдо рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЕрд▓рд░реНрдЯ рдПрдХреНрд╢рди рдмрдЯрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрд▓рд░реНрдЯ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ - рддреЛ рдореВрд▓реНрдп рдЭреВрда рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдЕрд▓рд░реНрдЯ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ '@State' рдЪрд░ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 @State var showAlert = false 

рдлрд┐рд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХреНрд╢рди рдмрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 self.showAlert = true 

рд╕реНрд╡рдпрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢реЛрдЕрд░реНрдЯрд░реНрдЯ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдмрдЯрди рдореЗрдВ рдЕрд▓рд░реНрдЯ рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝реЗрдВ, рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдмрдЯрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдРрд╕рд╛ рджрд┐рдЦреЗ:

 Button(action: { self.showAlert = true }) { Text("Hit Me!") } .alert(isPresented: $showAlert) { Alert(title: Text("Your Score"), message: Text("\(computeScore())")) } 

рд╣рдо $ showAlert рдХреЛ рдПрдХ рдмрдВрдзрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдЙрд╕ рдкрд▓ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрд▓рд░реНрдЯ рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рджреГрд╢реНрдп рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред

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

рд▓рд╛рдЗрд╡ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЪрд╛рд▓реВ рдХрд░реЗрдВ, рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╣рд┐рдЯ рдореА рдмрдЯрди рджрдмрд╛рдПрдВред рджреЗрдЦрд╛!



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



рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣рд╛рдВ рдЖрдк рддреИрдпрд╛рд░ рдорд╕реМрджрд╛ рдкреНрд░рдХрд╛рд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдиреЗ рдХреЗрд╡рд▓ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ UI рдФрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Xcode рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЖрднрд╛рд╕ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрдкрдиреЗ UI рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП '@State' рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ RGB рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдпрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рдЪреЗрдВрдЬ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрдкреНрдкрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдлреНрд▓реЛ рджреЗрдЦреЗрдВ

SwiftUI рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ SwiftUI рд╡реНрдпреВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

SwiftUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╣ / рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдореЗрд░рд╛ рдкреНрд░рдХрд╛рд╢рди рджреЗрдЦреЗрдВред

рдЕрдВрдд рдореЗрдВ, SwiftUI рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╕рд╛рдорд╛рди рд╣реИ !

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


All Articles