рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рд╕рд╣реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЪрдпрди

рдлрд┐рд░ рд╕реЗ рдирдорд╕реНрдХрд╛рд░ред рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдЕрдиреБрд╡рд╛рдж рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкрд╛рдареНрдпрдХреНрд░рдо "iOS- рдбреЗрд╡рд▓рдкрд░" рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред




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

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

рд▓рдХреАрд░ рдХрд╛ рдлрдХреАрд░ рд╣реЛрдирд╛


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЖрд░реЗрдЦрдг рдореЗрдВ рдПрдХ Canvas рдкрд░ рд░рдЦреЗ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдЬрдм рд╣рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдХреЛ рдПрдХ рдЫрд╡рд┐ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо DrawingContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ DrawingContext - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 struct Canvas { var shapes: [Shape] func render() -> Image { let context = DrawingContext() shapes.forEach(context.draw) return context.makeImage() } } 

рдЬрдм рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рднреА рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рд╕рд░рдгреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддреА рд╣реИред Arrays рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрд╣реБрдд рдХреБрд╢рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдСрд░реНрдбрд░ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХреЗ рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд░реЗрдВрдбрд░рд┐рдВрдЧ рдСрд░реНрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

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

 extension Canvas { mutating func remove(_ shape: Shape) { guard let index = shapes.firstIndex(of: shape) else { return } shapes.remove(at: index) } } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЗрддрдиреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА рдХреИрдирд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдЕрдбрд╝рдЪрди рдмрди рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрдХреГрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдордп рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ firstIndex рд░реИрдЦрд┐рдХ (O (N)) рд╣реИред

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

рдЧрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ


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

рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Canvas рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 struct Canvas { var shapes: Set<Shape> func render() -> Image { let context = DrawingContext() shapes.forEach(context.draw) return context.makeImage() } mutating func remove(_ shape: Shape) { shapes.remove(shape) } } 

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

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛


рдЪрд▓реЛ рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо Dictionary Canvas рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрдИрдбреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдЖрдХреГрддрд┐ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреА shapes рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдкрд╣реБрдБрдЪ рд╕реНрддрд░ рдХреЛ private рдмрджрд▓рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдирдП add рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВред рдФрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдЖрдВрдХрдбрд╝рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рднреА рдЕрдкрдиреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 struct Canvas { private var shapes = [Shape]() private var indexes = [Shape.ID : Int]() func render() -> Image { let context = DrawingContext() shapes.forEach(context.draw) return context.makeImage() } mutating func add(_ shape: Shape) { let index = shapes.count indexes[shape.id] = index shapes.append(shape) } } 

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

 extension Canvas { mutating func remove(_ shape: Shape) { guard let index = indexes[shape.id] else { return } shapes.remove(at: index) indexes[shape.id] = nil } } 

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

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

рддреЛ, рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдЖрдЗрдП рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ :

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

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

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

рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдмрдирд╛рдПрдВ


рдЖрдЗрдП рдПрдХ List рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╕реВрдЪреА рдореЗрдВ рдкрд╣рд▓реЗ рдФрд░ рдЕрдВрддрд┐рдо рдиреЛрдб рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧреАред рд╣рдо рдЗрди рджреЛрдиреЛрдВ рдЧреБрдгреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд╣рд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдПрдВрдЧреЗ:

 struct List<Value> { private(set) var firstNode: Node? private(set) var lastNode: Node? } 

рдЕрдЧрд▓рд╛, рдЪрд▓реЛ рдЕрдкрдирд╛ Node рдкреНрд░рдХрд╛рд░ (рдиреЛрдб) рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдиреЛрдбреНрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рдФрд░ рдореВрд▓реНрдп рд╕реЗ рдирд╣реАрдВ ред рд╣рдорд╛рд░реА рд╕реВрдЪреА рдХреЛ рджреЛрдЧреБрдирд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рдЙрд╕рдХреЗ рдЕрдЧрд▓реЗ рдкрдбрд╝реЛрд╕реА рдФрд░ рдкрд┐рдЫрд▓реЗ рджреЛрдиреЛрдВ рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдПрдХ рдорд╛рди рднреА рд╕рдВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ - рдЗрд╕ рддрд░рд╣:

 extension List { class Node { var value: Value fileprivate(set) weak var previous: Node? fileprivate(set) var next: Node? init(value: Value) { self.value = value } } } 

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

 extension List: Sequence { func makeIterator() -> AnyIterator<Value> { var node = firstNode return AnyIterator { //   ,    ,    : let value = node?.value node = node?.next return value } } } 

рдЪреВрдБрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд╣рдо рдХрд╕реНрдЯрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП AnyIterator рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, IteratorProtocol рдПрдХ рдореИрдЪ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдЖрд╡реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдХреЗ, рд╣рдорд╛рд░реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝реЗрдВред рд╣рдо append рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде List рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдиреЛрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдиреЛрдб рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣:

 extension List { @discardableResult mutating func append(_ value: Value) -> Node { let node = Node(value: value) node.previous = lastNode lastNode?.next = node lastNode = node if firstNode == nil { firstNode = node } return node } } 

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

 extension List { mutating func remove(_ node: Node) { node.previous?.next = node.next node.next?.previous = node.previous //  ┬л ┬╗,        ,    : if firstNode === node { firstNode = node.next } if lastNode === node { lastNode = node.previous } } } 

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

 struct Canvas { private var shapes = List<Shape>() private var nodes = [Shape.ID : List<Shape>.Node]() func render() -> Image { let context = DrawingContext() shapes.forEach(context.draw) return context.makeImage() } mutating func add(_ shape: Shape) { nodes[shape.id] = shapes.append(shape) } mutating func remove(_ shape: Shape) { guard let node = nodes.removeValue(forKey: shape.id) else { return } shapes.remove(node) } } 

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

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


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

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

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

рдЕрдЧрд░ рдЖрдк рдХреЛрдИ рдкреНрд░рд╢реНрди, рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдореБрдЭреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореБрдЭреЗ рдИрдореЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles