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

рд╡рд┐рд╖рдп рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ, рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


  • рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
  • рдХреИрд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдХреИрд╕реЗ рд╡рд┐рдзрд┐ рдкреНрд░реЗрд╖рдг рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░


рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


protocol Drawable { func draw() } struct Point: Drawable { var x, y: Int func draw() { ... } } struct Line: Drawable { var x1, x2, y1, y2: Int func draw() { ... } } var drawbles = [Drawable]() for d in drawbles { d.draw() } 

  1. рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рд╣реИред
  2. рд╣рдо рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкреНрд╡рд╛рдЗрдВрдЯ рдФрд░ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЕрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдбреНрд░реЙрдмрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ)

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


рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдореБрдЦреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд (рддрджрд░реНрде): "рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ - рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди"

рд╡рд░реНрдЪреБрдЕрд▓-рдЯреЗрдмрд▓ рдХреЗ рдмрд┐рдирд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг


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


рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд░рд╛рд╕рдд, рд╕рд╛рде рд╣реА рддрд░реАрдХреЛрдВ рдХреЗ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдлрд┐рд░, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓-рдЯреЗрдмрд▓ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЧрддрд┐рд╢реАрд▓ рдбрд┐рд╕реНрдкреИрдЪ рдХрд╛рдо рдХреИрд╕реЗ рдХрд░реЗрдЧрд╛? рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдХреЛ d.draw () рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛?


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

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЧрд╡рд╛рд╣ рддрд╛рд▓рд┐рдХрд╛


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


рдЗрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЧрд╡рд╛рд╣ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛" рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рд╢реНрди рд╢реЗрд╖ рд╣реИрдВ:


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

 MemoryLayout.size(ofValue: Line(...)) // 32 bits MemoryLayout.size(ofValue: Point(...)) // 16 bits 

рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдХрдВрдЯреЗрдирд░


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



рдпрд╣ 5 рдорд╢реАрди рд╢рдмреНрдж рд▓реЗрддрд╛ рд╣реИ (x64 рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо 5 * 8 = 40 рдмрд┐рдЯреНрд╕ рдореЗрдВ)ред рдЗрд╕реЗ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИ:


рдореВрд▓реНрдп рдмрдлрд╝рд░ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рди
vwt - рд╕реВрдЪрдХ рд╕рд╛рдХреНрд╖реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП
pwt - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рд╛рдХреНрд╖реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╕реВрдЪрдХ


рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рднреА рддреАрди рднрд╛рдЧреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


рд╕рд╛рдордЧреНрд░реА рдмрдлрд░


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


 let point: Drawable = Point(...) 

рдмрд┐рдВрджреБ () 2 рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдореВрд▓реНрдп рдмрдлрд░ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ - рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдбрд╛рд▓ рджреЗрдЧрд╛:



 let line: Drawable = Line(...) 

рд▓рд╛рдЗрди () 4 рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореВрд▓реНрдп рдмрдлрд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдХрд╛рд░реНрдпрдХреНрд░рдо рдвреЗрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдореВрд▓реНрдп рдмрдлрд░ рдореЗрдВ рдЗрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:



ptr рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди () рдвреЗрд░ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:



рдЬреАрд╡рди рдЪрдХреНрд░ рддрд╛рд▓рд┐рдХрд╛


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


  1. рдСрдмреНрдЬреЗрдХреНрдЯ (рдмрд┐рдВрджреБ (...) рдХреЛ рдбреНрд░рд╛рдПрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ) рдмрдирд╛рддреЗ рд╕рдордп, T.Zh рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд┐рдзрд┐ред рдпрд╣ рд╡рд╕реНрддреБред рдЖрд╡рдВрдЯрд┐рдд рд╡рд┐рдзрд┐ рдпрд╣ рддрдп рдХрд░реЗрдЧреА рдХрд┐ рд╡рд╕реНрддреБ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрд╣рд╛рдБ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдорд╛рди рдмрдлрд░ рдореЗрдВ рдпрд╛ рдвреЗрд░ рдкрд░), рдФрд░ рдпрджрд┐ рдЗрд╕реЗ рд╣реАрдк рдкрд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛
  2. рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рди рдкрд░ рд░рдЦреЗрдЧреАред
  3. рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд┐рдирд╛рд╢ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╕рднреА рд▓рд┐рдВрдХ рдХрд╛рдЙрдВрдЯ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛, рдпрджрд┐ рдХреЛрдИ рд╣реЛ
  4. рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рдж, рдбреАрд▓рд▓реЛрдХреЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛, рдпрджрд┐ рдХреЛрдИ рд╣реЛ

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛


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


рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдХрдВрдЯреЗрдирд░ - рдЙрддреНрддрд░


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рджреЛ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджрд┐рдП:


  1. рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХреНрдЬрд╝рд┐рд╕реНрдЯреЗрдВрд╢рд┐рдпрд▓ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. рдпрджрд┐ рд╕рд░рдгреА рдХрд╛ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ, рддреЛ рдЗрд╕ рд╕рд░рдгреА рдХрд╛ рдХреЛрдИ рднреА рддрддреНрд╡ 5 рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рддрддреНрд╡ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореВрд▓реНрдп рдмрдлрд░ рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдвреЗрд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореВрд▓реНрдп рдмрдлрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ 5 рдорд╢реАрди рд╢рдмреНрдж (40 рдмрд┐рдЯреНрд╕) рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

 let line: Drawable = Line(...) MemoryLayout.size(ofValue: line) // 40 bits let drawables: [Drawable] = [Line(...), Point(...), Line(...)] MemoryLayout.size(ofValue: drawables._content) // 120 bits 

рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдХрдВрдЯреЗрдирд░ - рдЙрджрд╛рд╣рд░рдг


рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 func drawACopy(local: Drawable) { local.draw() } let val: Drawable = Line(...) drawACopy(val) 

рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рди рдХрдВрдЯреЗрдирд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 struct ExistContDrawable { var valueBuffer: (Int, Int, Int) var vwt: ValueWitnessTable var pwt: ProtocolWitnessTable } 

рдЫрджреНрдо рдХреЛрдб


рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ, рдбреНрд░реЙрд╕реНрдХреЛрдкреА рдлрд╝рдВрдХреНрд╢рди ExistContDrawable рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ:


 func drawACopy(val: ExistContDrawable) { ... } 

рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдПрдВ, рдкреНрд░рд╛рдкреНрдд рддрд░реНрдХ рд╕реЗ рдЙрд╕рдХреЗ рдлрд╝реАрд▓реНрдб рднрд░реЗрдВ:


 func drawACopy(val: ExistContDrawable) { var local = ExistContDrawable() let vwt = val.vwt let pwt = val.pwt local.type = type local.pwt = pwt ... } 

рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА (рдмрдлрд░ рдпрд╛ рдвреЗрд░ рдореЗрдВ)ред рд╣рдо рдШрд╛рдЯреА рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕рд╛рдордЧреНрд░реА рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП vwt.allocate рдФрд░ vwt.copy рдХрд╣рддреЗ рд╣реИрдВ:


 func drawACopy(val: ExistContDrawable) { ... vwt.allocateBufferAndCopy(&local, val) } 

рд╣рдо рдбреНрд░реЙ рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдЯреВ рд╕реЗрд▓реНрдл рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░реЛрдЬреЗрдХреНрдЯрдмрдлрд░ рд╡рд┐рдзрд┐ рдпрд╣ рддрдп рдХрд░реЗрдЧреА рдХрд┐ рд╕реНрд╡ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ - рдмрдлрд░ рдореЗрдВ рдпрд╛ рдвреЗрд░ рдкрд░ - рдФрд░ рд╕рд╣реА рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рдПрдВ):


 func drawACopy(val: ExistContDrawable) { ... pwt.draw(vwt.projectBuffer(&local)) } 

рд╣рдо рд╕реНрдерд╛рдиреАрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╕реЗ рд╕рднреА рд╣рд┐рдк рд▓рд┐рдВрдХ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рд╣рдо рдбреНрд░реЙрдЖрд╕реНрдХреЛрдкреА (рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо) рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ:


 func drawACopy(val: ExistContDrawable) { ... vwt.destructAndDeallocateBuffer(&local) } 

рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдХрдВрдЯреЗрдирд░ - рдЙрджреНрджреЗрд╢реНрдп


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


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


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


рдЕрд╕реНрддрд┐рддреНрд╡ рдХрдВрдЯреЗрдирд░ - рд╕рдВрдЧреНрд░рд╣реАрдд рдЧреБрдг


рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдкреНрд░рдХрд╛рд░ рдЪрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдРрд╕реЗ рдЪрд░ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


 struct Pair { init(_ f: Drawable, _ s: Drawable) { first = f second = s } var first: Drawable var second: Drawable } var pair = Pair(Line(), Point()) 

рдЬреЛрдбрд╝реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рдЗрди рджреЛрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЬреЛрдбрд╝реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреНрдпрд╛ рд╣реИ? рдЗрд╕рдореЗрдВ рджреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдХрдВрдЯреЗрдирд░ рд╣реЛрддреЗ рд╣реИрдВ - рдПрдХ рдкрд╣рд▓реЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдПред рд░реЗрдЦрд╛ рдмрдлрд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЙрд╕реЗ рдвреЗрд░ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдмрд┐рдВрджреБ рдмрдлрд╝рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реИред рдпрд╣ рдкреЗрдпрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 pair.second = Line() 

рдЕрдм, рджреВрд╕рд░реЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рднреА рдвреЗрд░ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдлрд░ рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 let aLine = Line(...) let pair = Pair(aLine, aLine) let copy = pair 

рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдореЛрд░реА рд╕реНрдЯреЗрдЯрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛:



рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдвреЗрд░ рдкрд░ 4 рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЪрд▓реЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:


  1. рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрди рдмрдирд╛рдПрдВ

 class LineStorage: Drawable { var x1, y1, x2, y2: Double func draw() {} } 

  1. рд╣рдо рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкреЗрдпрд░ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ

 let lineStorage = LineStorage(...) let pair = Pair(lineStorage, lineStorage) let copy = pair 

рд╣рдо рдвреЗрд░ рдкрд░ рдПрдХ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП 4 рд╕рдВрдХреЗрдд рдорд┐рд▓рддреЗ рд╣реИрдВ:



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


рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рднрдВрдбрд╛рд░рдг рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ (рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ)


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ рд╕рдВрд░рдЪрдирд╛ рд╣реИ (рдвреЗрд░ рдкрд░ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рдЗрд╕реЗ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ)ред рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрджрд▓рддреЗ рд╕рдордп рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 struct BetterLine: Drawable { private var storage: LineStorage init() { storage = LineStorage((0, 0), (10, 10)) } func draw() -> Double { ... } mutating func move() { if !isKnownUniquelyReferenced(&storage) { storage = LineStorage(self.storage) } // storage editing } } 

  1. рдмреЗрдЯрд░рд▓рд╛рдЗрди рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рднрдВрдбрд╛рд░рдг рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдвреЗрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдХреЗрд╡рд▓ рдореВрд╡ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреЙрдЗрдВрдЯ рд╣реИред рдпрджрд┐ рдЕрдзрд┐рдХ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реИрдВ, рддреЛ рдпрд╣ рдмреЗрдЯрд░рд▓рд╛рдЗрди рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмреЗрдЯрд░рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрдВрдбрд╛рд░рдг рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 let aLine = BetterLine() let pair = Pair(aLine, aLine) let copy = pair copy.second.x1 = 3.0 

рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:



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


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ - рд╕рд╛рд░рд╛рдВрд╢


  1. рдЫреЛрдЯреЗ рдореВрд▓реНрдп ред рдпрджрд┐ рд╣рдо рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рд▓реЗрддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рдмрдлрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ:

  • рдвреЗрд░ рдкрд░ рдХреЛрдИ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛
  • рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдирд╣реАрдВ
  • рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдмрд╣реБрд░реВрдкрддрд╛ (рдЧрддрд┐рд╢реАрд▓ рднреЗрдЬрдиреЗ)

  1. рдорд╣рд╛рди рдореВрд▓реНрдпред рдпрджрд┐ рд╣рдо рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдмрдлрд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ:

  • рдвреЗрд░ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╕реНрдерд╛рди
  • рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдЕрдЧрд░ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред

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

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

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


All Articles