рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рднрд╛рдЧ 3

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдЕрдВрддрд┐рдо рд▓реЗрдЦред


рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред


рдЕрдирд╕рд░реНрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг


protocol Drawable { func draw() } func drawACopy(local: Drawable) { local.draw() } let line = Line() drawACopy(line) let point = Point() drawACopy(point) 

рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХреЛрдбред drawACopy рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИ - рд╡рд╣ рд╕рдмред


рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг


рдЖрдЗрдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреЗрдЦреЗрдВ:


 func drawACopy<T: Drawable>(local: T) { local.draw() } ... 

рд▓рдЧрддрд╛ рд╣реИ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рд╣рдо рдЕрднреА рднреА рдХреЗрд╡рд▓ drawACopy рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ drawACopy рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╣реБрдб рдХреЗ рддрд╣рдд рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдкред
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:


  1. рд╕реНрдереИрддрд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛ (рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)
  2. рдХреЙрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд╛рд░ (рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЯреА рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 func foo<T: Drawable>(local: T) { bar(local) } func bar<T: Drawable>(local: T) { ... } let point = Point(...) foo(point) 

рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рддрдм рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо foo рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд░рд┐рдПрдмрд▓ point рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ - рдпрд╣ рд╕рд┐рд░реНрдл рдкреЙрдЗрдВрдЯ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, T: foo рдлрдВрдХреНрд╢рди рдореЗрдВ рдбреНрд░реЙрдПрдмрд▓ рдЯрд╛рдЗрдк рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЙрд╕ рд╕рдордп рд╕реЗ рдЦреБрд▓рдХрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╣рдо рдЗрд╕ рдлрдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреЙрдЗрдВрдЯ рдЯрд╛рдЗрдк рдХрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ: T = рдкреНрд╡рд╛рдЗрдВрдЯред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдиреЗ рд╕рднреА рдЕрджреНрднреБрдд рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ foo рдХреЙрд▓ рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рдирд╛ред


 This: ```swift let point = Point(...) foo<T = Point>(point) Becomes this: ```swift bar<T = Point>(point) 

рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде foo рдХреЙрд▓ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреА: рдбреНрд░реЙрдПрдмрд▓ рдмрд╛рд░ рдХреЛ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рд╡рд┐рдзрд┐ = рдХреЙрд▓ рдХреЗ рд╕рд╛рде foo рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ - рдЯрд╛рдЗрдк рдЯреА = рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рд░ рд╡рд┐рдзрд┐ред


рдЬреЗрдиреЗрд░рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


 func drawACopy<T: Drawable>(local: T) { local.draw() } drawACopy(Point(...)) 

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, drawACopy рд╕реНрд╡рд┐рдлреНрдЯ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ (рдЬрд┐рд╕рдореЗрдВ рдЯреА рдкрджреНрдзрддрд┐ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдФрд░ рдПрдХ рдЬреАрд╡рди рдЪрдХреНрд░ рддрд╛рд▓рд┐рдХрд╛ (рдЬрд┐рд╕рдореЗрдВ рдЯреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реНрдпреВрдбреЛрдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 func drawACopy<T: Drawable>(local: T, pwt: T.PWT, vwt: T.VWT) {...} drawACopy(Point(...), Point.pwt, Point.vwt) 

VWT рдФрд░ PWT рдЯреА рдореЗрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ (рд╕рдВрдмрджреНрдзрддрд╛) рд╣реИрдВ - рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдо (рдЯрд╛рдЗрдкреЗрд▓рд┐рдпрд╕), рдХреЗрд╡рд▓ рдмреЗрд╣рддрд░ред Point.pwt рдФрд░ Point.vwt рд╕реНрдерд┐рд░ рдЧреБрдг рд╣реИрдВред


рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯреА рдкреНрд╡рд╛рдЗрдВрдЯ рд╣реИ, рдЯреА рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХрдВрдЯреЗрдирд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкрд┐рдЫрд▓реЗ drawACopy рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ drawACopy (рд╕реНрдерд╛рдиреАрдп: drawACopy ), рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рди рдХрдВрдЯреЗрдирд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рд╣рдордиреЗ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреАред


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


рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рдЬреАрд╡рди рдЪрдХреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдпрд╛ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд?


рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рддреЗрдЬреА рд╕реЗ рд╣реЛрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдлрд╝рдВрдХреНрд╢рди func foo<T: Drawable>(arg: T) рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЬреИрд╕реЗ рд╕рдордХрдХреНрд╖ fun foo(arg: Drawable) рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬ рд╣реИ?


рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд░реВрдк рджреЗрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕реЗ "рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ:


рдлрд┐рд░ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдХреЛрдб рд╣реИ:


 func drawACopy<T: Drawable>(local: T) { local.draw() } drawACopy(Point(...)) drawACopt(Line(...)) 

рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо drawACopy рдХреЛ рдЯрд╛рдЗрдк рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдПрдЧрд╛ - drawACopyOfPoint (рд╕реНрдерд╛рдиреАрдп: рдкреНрд╡рд╛рдЗрдВрдЯ), рдФрд░ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:


 func drawACopyOfPoint(local: Point) { local.draw() } func drawACopyOfLine(local: Line) { local.draw() } drawACopy(Point(...)) drawACopt(Line(...)) 

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд░реВрдб рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рдХреНрдпрд╛ рдШрдЯ рд╕рдХрддрд╛ рд╣реИ:


 Point(...).draw() Line(...).draw() 

рдпреЗ рд╕рднреА рдЯреНрд░рд┐рдХ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рднреА рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - drawACopy рд╡рд┐рдзрд┐ рдореЗрдВ drawACopy рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ (рдЯреА) рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдЧреБрдг


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛ рдпреБрдЧреНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 struct Pair { let fst: Drawable let snd: Drawable } let pair = Pair(fst: Line(...), snd: Line(...)) 

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


рдкреЗрдпрд░ рдХрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 struct Pair<T: Drawable> { let fst: T let snd: T } 

рдЬрд┐рд╕ рд╕рдордп рд╕реЗ рдЯреА рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░ fst рдФрд░ snd рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрди рджреЛ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рддреНрд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ - fst рдФрд░ snd ред


рдореЗрдореЛрд░реА рдХреА рд╡рд┐рд╢реЗрд╖ рдорд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ:


рдЬрдм рд╣рдо Pair fst рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░ fst рдФрд░ snd fst рд╣реИрдВред рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдбреНрд░рд╛рдмрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ 10 рдХреЗрдмреА рдореЗрдореЛрд░реА рдХрд╛ рд╣реЛред рдпрд╣реА рд╣реИ, рд╕реНрд╡рд┐рдлреНрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдХрдВрдЯреЗрдирд░ред рдЗрд╕ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИ, рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ рднреА рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг):


 let pair = Pair(Point(...), Point(...)) 

рдЯрд╛рдЗрдк рдЯреА рдЕрдм рдкреНрд╡рд╛рдЗрдВрдЯ рд╣реИред рдкреНрд╡рд╛рдЗрдВрдЯ рдПрди рдореЗрдореЛрд░реА рдХреЗ рдПрди рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреЗрдпрд░ рдореЗрдВ рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдорд┐рд▓рддреЗ рд╣реИрдВред рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдореЛрд░реА рдХреА 2 * N рд░рд╛рд╢рд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╣рд╛рдВ pair рдмрдирд╛рдПрдЧрд╛ред


рдЗрд╕рд▓рд┐рдП, рдЬреЛрдбрд╝реА рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдвреЗрд░ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рдВрдЯрди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдореЗрдореЛрд░реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдЬреНрдЮрд╛рдд рд╣реИред


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


1. рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХреЛрдб - рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░


рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐:


  • рдирдХрд▓ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдЖрд╡рдВрдЯрди рдирд╣реАрдВ
  • рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб - рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ
  • рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдирд╣реАрдВ
  • рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдкреНрд░реЗрд╖рдг

2. рд╡рд┐рд╢рд┐рд╖реНрдЯреАрдХреГрдд рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб - рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░


рдЗрд╕рдХреА рдПрдХ рдФрд╕рдд рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐:


  • рддрддреНрдХрд╛рд▓ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддрд┐ рдвреЗрд░ рдЖрд╡рдВрдЯрди
  • рдПрдХ рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рд╣реИ
  • рдЖрднрд╛рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛

3. рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб - рдЫреЛрдЯреЗ рдореВрд▓реНрдп


  • рдХреЛрдИ рдвреЗрд░ рдЖрд╡рдВрдЯрди рдирд╣реАрдВ - рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рдореВрд▓реНрдп рдмрдлрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ
  • рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдирд╣реАрдВ (рдХреНрдпреЛрдВрдХрд┐ рдвреЗрд░ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ)
  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реА рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐

4. рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб - рдмрдбрд╝реЗ рдореВрд▓реНрдп


  • рд╣реАрдк рдкрд░ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ - рдорд╛рди рдмрдлрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ
  • рдПрдХ рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рд╣реИ
  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг

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


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


  • рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ - рдЕрд░реНрде рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде
  • рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ - рдкрд╣рдЪрд╛рди
  • рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб - рд╕реНрдереИрддрд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛
  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ - рдЧрддрд┐рд╢реАрд▓ рдмрд╣реБрд░реВрдкрддрд╛

рдмрдбрд╝реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдФрд░ рдордд рднреВрд▓реЛ - рд╕рд╣реА рдЙрдкрдХрд░рдг рдЪреБрдирдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдЖрдкрдХреА рд╣реИред
рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрди рд▓реЗрдЦреЛрдВ рдиреЗ рдЖрдкрдХреА рдорджрдж рдХреА рд╣реИ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдереЗред


рд╕реМрднрд╛рдЧреНрдп рд╣реИ

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


All Articles