рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реНрд╡рд┐рдлреНрдЯ 5.1 рдореЗрдВ

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

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

рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рдЖрдк:

  • рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдирд╛;
  • рдорд╛рдирдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдордЭреЗрдВ;
  • рдорд╛рдирдХ рд╕реНрд╡рд┐рдлреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВ;
  • рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВред

рд╢реБрд░реВ рдХрд░рдирд╛


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

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

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

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░ рдФрд░ рдореЛрдЯрд░рд╕рд╛рдЗрдХрд┐рд▓рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕ MotorVehicle рдмрдирд╛рддреЗ рд╣реИрдВ ред рдХрд╛рд░ рдФрд░ рдореЛрдЯрд░рд╕рд╛рдЗрдХрд┐рд▓ MotorVehicle рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧреАред рдЙрд╕реА рддрд░рд╣, рд╣рдо рдПрдпрд░рдХреНрд░рд╛рдлреНрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ , рдЬрд┐рд╕рд╕реЗ рд╣рдо рдкреНрд▓реЗрди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ ред

рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди - рдмрдо! - рдЖрдкрдХреЗ рдЦреЗрд▓ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ XXX рд╢рддрд╛рдмреНрджреА рдореЗрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХреБрдЫ рдХрд╛рд░реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдбрд╝ рд╕рдХрддреА рд╣реИрдВ ред

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

рдФрд░ рдЗрд╕ рднрдпрд╛рдирдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЛ рдХреНрдпрд╛ рдмрдЪрд╛рдПрдЧрд╛? рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдорджрдж рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рд╣реИ!

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ?


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

рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ


Xcode рдЪрд▓рд╛рдПрдВ, рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдмрдирд╛рдПрдВ, рдЗрд╕реЗ SwiftProtocols.playground рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

protocol Bird {
  var name: String { get }
  var canFly: Bool { get }
}

protocol Flyable {
  var airspeedVelocity: Double { get }
}


рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб-рд╢рд┐рдлреНрдЯ-рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░реЗрдВ ред

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

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

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

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдм рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рдкреНрд░рдХрд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИред

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


рдЗрд╕ рдХреЛрдб рдХреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реЗрдВ:

struct FlappyBird: Bird, Flyable {
  let name: String
  let flappyAmplitude: Double
  let flappyFrequency: Double
  let canFly = true

  var airspeedVelocity: Double {
    3 * flappyFrequency * flappyAmplitude
  }
}


рдпрд╣ рдХреЛрдб рдПрдХ рдирдП FlappyBird рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд░реНрдб рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдлрд╝реНрд▓рд╛рдПрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреЛрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдЗрд╕рдХреА airspeedVelocity рд╕рдВрдкрддреНрддрд┐ flappy рдлрд╝реНрд░рд┐рдХреНрд╡реЗрдВрд╕реА рдФрд░ flappy рдПрдореНрдкреНрд▓реАрдЯреНрдпреВрдб рдХрд╛ рдПрдХ рдХрд╛рдо рд╣реИред CanFly рдкреНрд░реЙрдкрд░реНрдЯреА рд╕рд╣реА рд░рд╣рддреА рд╣реИред

рдЕрдм рджреЛ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:

struct Penguin: Bird {
  let name: String
  let canFly = false
}

struct SwiftBird: Bird, Flyable {
  var name: String { "Swift \(version)" }
  let canFly = true
  let version: Double
  private var speedFactor = 1000.0
  
  init(version: Double) {
    self.version = version
  }

  // Swift is FASTER with each version!
  var airspeedVelocity: Double {
    version * speedFactor
  }
}


рдкреЗрдВрдЧреБрдЗрди рдПрдХ рдкрдХреНрд╖реА рд╣реИ рд▓реЗрдХрд┐рди рдЙрдбрд╝ рдирд╣реАрдВ рд╕рдХрддрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреЛ рдЙрдбрд╝рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ !

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

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

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

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдмрд░реНрдб рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦреЗрдВ:

extension Bird {
  // Flyable birds can fly!
  var canFly: Bool { self is Flyable }
}


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



рддрдмрд╛рджрд▓реЛрдВ рдХреЛ рдХрд░рддреЗ рд╣реИрдВ


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

enum UnladenSwallow: Bird, Flyable {
  case african
  case european
  case unknown
  
  var name: String {
    switch self {
    case .african:
      return "African"
    case .european:
      return "European"
    case .unknown:
      return "What do you mean? African or European?"
    }
  }
  
  var airspeedVelocity: Double {
    switch self {
    case .african:
      return 10.0
    case .european:
      return 9.9
    case .unknown:
      fatalError("You are thrown from the bridge of death!")
    }
  }
}


рдЙрдкрдпреБрдХреНрдд рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ, UnladenSwallow рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ - рдмрд░реНрдб рдФрд░ рдлреНрд▓рд╛рдИрдПрдмрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдЗрд╕ рддрд░рд╣, canFly рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛


рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ UnladenSwallow , рдмрд░реНрдб рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ canFly рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ, UnladenSwallow.unknown рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

extension UnladenSwallow {
  var canFly: Bool {
    self != .unknown
  }
}

рдЕрдм рдХреЗрд╡рд▓ .african рдФрд░ .european рдХреИрдирдлрд▓реА рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ред рдЗрд╕рдХреА рдЬрд╛рдВрдЪ - рдкрдбрд╝рддрд╛рд▓ рдХрд░реЗрдВ! рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

UnladenSwallow.unknown.canFly         // false
UnladenSwallow.african.canFly         // true
Penguin(name: "King Penguin").canFly  // false

рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВред

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

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


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

protocol Bird: CustomStringConvertible {
  var name: String { get }
  var canFly: Bool { get }
}

extension CustomStringConvertible where Self: Bird {
  var description: String {
    canFly ? "I can fly" : "Guess I'll just sit here :["
  }
}

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

рдЯрд╛рдЗрдк рдХрд░реЗрдВ ред рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ "рдореИрдВ рдЙрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ"ред

рд╕реНрд╡рд┐рдлреНрдЯ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓


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

рдЗрд╕ рдХреЛрдб рдХреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

let numbers = [10, 20, 30, 40, 50, 60]
let slice = numbers[1...3]
let reversedSlice = slice.reversed()

let answer = reversedSlice.map { $0 * 10 }
print(answer)

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд▓рд╛рдЗрд╕ рдПрд░реЗ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрд░реЗрд╕реНрд▓реАрд╕ред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ "рдЖрд╡рд░рдг" рд╣реИ рдЬреЛ рд╕рд░рдгреА рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрд┐рдд рдкреНрд░рддрд┐рд▓реЛрдо рдПрдХ рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрд┐рдд рд╡рд┐рдХреНрд╖реЗрдкрдг <ArraySlice> рд╣реИред

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

рддреБрдореНрд╣рд╛рд░реЗ рдкреНрд░рд╛рдкреНрддрд╛рдВрдХ рдкрд░


рдЕрдм рддрдХ, рд╣рдордиреЗ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ рдЬреЛ рдмрд░реНрдб рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ:

class Motorcycle {
  init(name: String) {
    self.name = name
    speed = 200.0
  }

  var name: String
  var speed: Double
}

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

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдбрд╛рд▓реЗрдВ


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

// 1
protocol Racer {
  var speed: Double { get }  // speed is the only thing racers care about
}

// 2
extension FlappyBird: Racer {
  var speed: Double {
    airspeedVelocity
  }
}

extension SwiftBird: Racer {
  var speed: Double {
    airspeedVelocity
  }
}

extension Penguin: Racer {
  var speed: Double {
    42  // full waddle speed
  }
}

extension UnladenSwallow: Racer {
  var speed: Double {
    canFly ? airspeedVelocity : 0.0
  }
}

extension Motorcycle: Racer {}

// 3
let racers: [Racer] =
  [UnladenSwallow.african,
   UnladenSwallow.european,
   UnladenSwallow.unknown,
   Penguin(name: "King Penguin"),
   SwiftBird(version: 5.1),
   FlappyBird(name: "Felipe", flappyAmplitude: 3.0, flappyFrequency: 20.0),
   Motorcycle(name: "Giacomo")]

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

рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реЛред

рдЙрдЪреНрдЪрддрдо рдЧрддрд┐


рд╣рдо рд╕рд╡рд╛рд░реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

func topSpeed(of racers: [Racer]) -> Double {
  racers.max(by: { $0.speed < $1.speed })?.speed ?? 0.0
}

topSpeed(of: racers) // 5100

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

рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдирд╛


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

рдЯреЙрдкрд╕реНрдкреАрдб рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓реЗрдВ:

// 1
func topSpeed<RacersType: Sequence>(of racers: RacersType) -> Double
    /*2*/ where RacersType.Iterator.Element == Racer {
  // 3
  racers.max(by: { $0.speed < $1.speed })?.speed ?? 0.0
}

  1. RacersType рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
  2. рдЬрд╣рд╛рдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реЗрд╕рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░ рд╕реНрд╡рдпрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рджреЗрдЦреЗрдВ:

topSpeed(of: racers[1...3]) // 42

рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ ArraySlice рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред

рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ "рддреЗрдЬ" рдмрдирд╛рдирд╛


рд╕реАрдХреНрд░реЗрдЯ: рдЖрдк рдФрд░ рднреА рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдмрд╣реБрдд рдиреАрдЪреЗ рдЬреЛрдбрд╝реЗрдВ:

extension Sequence where Iterator.Element == Racer {
  func topSpeed() -> Double {
    self.max(by: { $0.speed < $1.speed })?.speed ?? 0.0
  }
}

racers.topSpeed()        // 5100
racers[1...3].topSpeed() // 42

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

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


рд╕реНрд╡рд┐рдлреНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдпрд╛ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

protocol Score {
  var value: Int { get }
}

struct RacingScore: Score {
  let value: Int
}

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

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

protocol Score: Comparable {
  var value: Int { get }
}

struct RacingScore: Score {
  let value: Int
  
  static func <(lhs: RacingScore, rhs: RacingScore) -> Bool {
    lhs.value < rhs.value
  }
}

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

рдкрд░рд┐рдХреНрд╖рдг:

RacingScore(value: 150) >= RacingScore(value: 130) // true

рд╡рд╕реНрддреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛


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

рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ:

protocol Cheat {
  mutating func boost(_ power: Double)
}

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдХреИрд╕реЗ? рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред

рдЕрдм рдПрдХ Chift рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ SwiftBird рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдПрдВ:

extension SwiftBird: Cheat {
  mutating func boost(_ power: Double) {
    speedFactor += power
  }
}

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

рдЗрд╕рдХреА рдЬрд╛рдВрдЪ - рдкрдбрд╝рддрд╛рд▓ рдХрд░реЗрдВ!
var swiftBird = SwiftBird(version: 5.0)
swiftBird.boost(3.0)
swiftBird.airspeedVelocity // 5015
swiftBird.boost(3.0)
swiftBird.airspeedVelocity // 5030

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


рдпрд╣рд╛рдВ рдЖрдк рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЖрдкрдиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрд╡рд┐рдлреНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЧрд╛рдЗрдб рдорд┐рд▓реЗрдЧрд╛ ред

рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ WWDC рд╡реНрдпрд╛рдЦреНрдпрд╛рди рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред

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

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


All Articles