рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрднреНрдпрд╛рд╕



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

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рдкрд░рд┐рднрд╛рд╖рд╛


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

Swift рд╡рд░реНрд▓реНрдб рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдорд╛рди рдкреВрд░реНрдг рдкреНрд░рддрд┐рднрд╛рдЧреА рд╣реИрдВ, рдФрд░ mutation рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ value TYPES рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдФрд░ enum рдПрдиреНрдпреВрдорд░реЗрд╢рди рдЬреЛ рдореНрдпреВрдЯреЗрдмрд┐рд▓рд┐рдЯреА ( mutation рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред ) рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдФрд░ рдХрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, Swift рдкреВрд░реНрдг рдЕрд░реНрдереЛрдВ рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЗ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдвреВрдВрдврддрд╛ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо Swift рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдЕрд░реНрдерд╛рдд, "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░") рдФрд░ рдпрд╣ рд╕рдордЭрдХрд░ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреИрд╕реЗ рдЖрд░рд╛рдо рд╕реЗ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


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

 //Imperative Approach var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for i in 0..<numbers.count { let timesTen = numbers[i] * 10 numbers[i] = timesTen } print(numbers) //[10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

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

  1. рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
  2. рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдПрдХ рдФрд░ thread numbers рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
  3. рдпрджрд┐ рдЖрдк numbers рд╕рд░рдгреА рдореЗрдВ рдореВрд▓ рдорд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
  4. рдпрд╣ рдХреЛрдб рдХреИрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдЕрдм рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ " рдХрд╛рд░реНрдпрд╛рддреНрдордХ " рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:

 //Functional Approach let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] extension Array where Element == Int { func timesTen() -> [Int] { var output = [Int]() for num in self { output.append(num * 10) } return output } } let result = numbers.timesTen() print(numbers) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(result) //[10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, рд╣рдо рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдмрд╛рд░ рд╣рдорд╛рд░реЗ numbers рдРрд░реЗ, let рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рд╣рдордиреЗ numbers рд╕рд░рдгреА рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ timesTen() рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Array рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди extension рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рд╣рдо рдЕрднреА рднреА рд▓реВрдк рдХреЗ for рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ output рдирд╛рдордХ рдПрдХ рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЪрд░ рдХрд╛ рджрд╛рдпрд░рд╛ рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░рд╛ рдЗрдирдкреБрдЯ рддрд░реНрдХ self timesTen() рд╡реИрд▓реНрдпреВ рдмрд╛рдп рд╡реИрд▓реНрдпреВ ( by value ) рдореЗрдВ рдЙрддреНрддреАрд░реНрдг рд╣реЛрддрд╛ рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд╕рдорд╛рди рд╕реНрдХреЛрдк output ред timesTen() рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдХрдВрд╕реЛрд▓ рдкрд░ рдореВрд▓ numbers рд╕рд░рдгреА рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕рд░рдгреА result рджреЛрдиреЛрдВ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЕрдкрдиреЗ 4 рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред

1. рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо numbers рд╕рд░рдгреА рдореЗрдВ numbers рдХреЛ 10 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓реВрдк рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рддрд░рд╣ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, " " timesTen() рдкрджреНрдзрддрд┐ рдореЗрдВ "рд▓рд┐рдкрдЯрд╛" рд╣реИред рдмрд╢рд░реНрддреЗ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╣реАрдВ рдФрд░ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереА, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ numbers.timesTen() рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред numbers.timesTen() рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред рдРрд╕рд╛ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рдХрд┐ рдЗрд╕ рдХреЛрдб рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдбрд┐рдХреНрд▓реЗрд░реЗрдЯрд┐рд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдРрд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдХрд░реНрд╖рдХ рдХреНрдпреЛрдВ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рдХреЛрдб рдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрдВрдкреАрд░рд┐рдпрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдзрд┐рдХ "рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ" рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рд╢рд╛рдирджрд╛рд░ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддреА рд╣реИ! (рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдзрд╛рд░рдгрд╛ рдХреЗрд╡рд▓ рдкреВрд░реНрд╡-рд╕рддреНрдпрд╛рдкрд┐рдд рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ)ред

2. рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдПрдХ рдФрд░ thread numbers рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдерд▓рдЧ рдЬрдЧрд╣ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЬрдЯрд┐рд▓ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рджреЛ threads рдПрдХ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрдореНрдкреАрд░рд┐рдпрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рдЕрдиреНрдп thread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ numbers рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕ рдХреНрд░рдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ threads numbers рд╕рд░рдгреА рддрдХ threads ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ race condition рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдЖрд╡реЗрджрди рдХреА рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдХреЛрдИ "рджреБрд╖реНрдкреНрд░рднрд╛рд╡" рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, output рдкрджреНрдзрддрд┐ рдХрд╛ output рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб ( threads ) рдХреА numbers рд╕рд░рдгреА рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, ALWAYS рдХреЛ рд╕рдорд╛рди рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдерд┐рд░ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдЧрд╛ред

3. рдпрджрд┐ рдЖрдк numbers рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓ рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

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

4. рдЗрд╕ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рддрдирд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

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

рд▓рд╛рдн рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢


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

  • рдпрд╣ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИ
  • рдпрд╣ race condition рдФрд░ рдЧрддрд┐рд░реЛрдз рдЬреИрд╕реЗ рдзрд╛рдЧреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ
  • рдпрд╣ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдЖрдЗрдП, Swift рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реАрдЦрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп "рдЕрднрд┐рдиреЗрддрд╛" рдХрд╛рд░реНрдп рд╣реИрдВ, рдФрд░ рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдп


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

рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Swift рдореЗрдВ рдЕрдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ - рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реИрдВ: map , filter , reduce , forEach , flatMap , compactMap , sorted , рдЖрджрд┐ред рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ map , filter рдФрд░ reduce ред рд╡реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╕рдВрд▓рдЧреНрди" рд╣реИрдВред рд╡реЗ Collection рд╕рд╣рд┐рдд рд╕рднреА Sequence рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ Swift рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ Array , рдПрдХ Dictionary рдФрд░ рдПрдХ Set рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред Swift 5 , рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдп рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдП TYPE - Result рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

map(_:)


Swift map(_:) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Array рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ map(_:) рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдореВрд▓ рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╕рд░рдгреА рдХрд╛ рдПрдХ рд╕рд░рдгреА рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдорд╛рди, рд╕рд╛рде рд╣реАред

 //Functional Approach let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] func timesTen(_ x:Int) -> Int { return x * 10 } let result = numbers.map (timesTen) print(numbers) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(result) //[10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди timesTen (_:Int) , рдЬреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ Int рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдХреЛ 10 рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдЙрдЪреНрдЪ-рдСрд░реНрдбрд░ map(_:) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд░рдгреА рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред numbers ред result рд╕рд░рдгреА рдореЗрдВ рд╣рдореЗрдВ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред

рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ map(_:) рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдлрд╝рдВрдХреНрд╢рди (рдЗрдирдкреБрдЯ) рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (Int) -> Int ред рдЗрд╕рд▓рд┐рдП, рд╣рдо map(_:) рдореЗрдВ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ map(_:) - рдХреНрд▓реЛрдЬрд╝рд░ - рдХрд┐рд╕реА рднреА рд░реВрдк рдореЗрдВ, рдЬрд┐рдирдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реНрдХ рдирд╛рдо $0 , $1 , рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

 //Functional Approach let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let result = numbers.map { $0 * 10 } print(numbers) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(result) //[10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

рдпрджрд┐ рд╣рдо рдПрдХ Array рд▓рд┐рдП map(_ :) рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦреЗрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ:

 func map<T>(_ transform: (Element) -> T) -> [T] { var returnValue = [T]() for item in self { returnValue.append(transform(item)) } return returnValue } 

рдпрд╣ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХреЛрдб рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдПрдХ рдбреЗрд╡рд▓рдкрд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ Apple рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдПрдХ Swift рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЙрдЪреНрдЪ-рдХреНрд░рдо map(_:) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ Apple рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо, рдбреЗрд╡рд▓рдкрд░реНрд╕, map(_:) рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ map(_:) рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ transform рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдмреЗрд╣рддрд░ рдФрд░ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

 //Functional Approach let possibleNumbers = ["1", "2", "three", "///4///", "5"] let mapped = possibleNumbers.map {str in Int(str) } print (mapped) // [Optional(1), Optional(2), nil, nil, Optional(5)] 

рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдореВрд▓ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ possibleNumbers , рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП { str in Int(str) } ред рд╣рдо map(_:) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ map(_:) рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ Optional рдХрд╛ рдПрдХ mapped рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:



рд╣рдо рдЕрдкрдиреЗ рд╕рд░рдгреА possibleNumbers рддрддреНрд╡реЛрдВ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рднрд╛рдЧ рдХреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, String рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ Int рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдСрдкреНрдЯрд┐рдХреНрд╕ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореВрд▓реНрдп рд╣реИрдВ:

 print (mapped) // [Optional(1), Optional(2), nil, nil, Optional(5)] 

compactMap(_ :)


рдпрджрд┐ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ Optional рдорд╛рди рд╣реИ, рддреЛ рдпрд╣ рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрд░реНрде рдореЗрдВ рд╕рдорд╛рди рд╣реИ - compactMap(_ :) , рдЬреЛ map(_:) рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ map(_:) , рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ Optional рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ nil рдорд╛рди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред



рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ compactMapped рдЯрд╛рдЗрдк рдХреА рдПрдХ рд╕рд░рдгреА compactMapped [Int] , рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдЫреЛрдЯреА рд╣реИ:

 let possibleNumbers = ["1", "2", "three", "///4///", "5"] let compactMapped = possibleNumbers.compactMap(Int.init) print (compactMapped) // [1, 2, 5] 



рдЬрдм рднреА рдЖрдк init?() рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ init?() compactMap(_ :) рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп, рдЖрдкрдХреЛ compactMap(_ :) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 // Validate URLs let strings = ["https://demo0989623.mockable.io/car/1", "https://i.imgur.com/Wm1xcNZ.jpg"] let validateURLs = strings.compactMap(URL.init) // Separate Numbers and Operations let mathString: String = "12-37*2/5+44" let numbers1 = mathString.components(separatedBy: ["-", "*", "+", "/"]).compactMap(Int.init) print(numbers1) // [12, 37, 2, 5, 44] 

рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди compactMap(_ :) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░рдг рд╣реИрдВред Swift "рдкреНрдпрд╛рд░" Optional рдореВрд▓реНрдпреЛрдВ, рд╡реЗ рди рдХреЗрд╡рд▓ " failable " failable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ init?() failable , рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХреЗ as? рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ as? "рдХрд╛рд╕реНрдЯрд┐рдВрдЧ" :

 let views = [innerView,shadowView,logoView] let imageViews = views.compactMap{$0 as? UIImageView} 

... рдФрд░ try? рдЬрдм рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ред рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ Apple рдЪрд┐рдВрддрд┐рдд рд╣реИ рдХрд┐ try? рдХрд╛ рдЙрдкрдпреЛрдЧ try? рдмрд╣реБрдд рдмрд╛рд░ рдбрдмрд▓ Optional рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ 5 рдореЗрдВ рдЕрдм try? рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдПрдХ Optional рд╕реНрддрд░ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ try? ред

рдЙрдЪреНрдЪ рдХреНрд░рдо рд╡рд╛рд▓реЗ flatMap(_ :) рдирд╛рдо рдкрд░ рдПрдХ рдФрд░ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рд╣реИред

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

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ view рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдПрдХ рдЯреВрдЯреА рд╣реБрдИ рд░реЗрдЦрд╛ рдмрдирддреА рд╣реИ:



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



рдХрд┐рд╕реА рдЦрдВрдб рдХреЗ рдордзреНрдп рдмрд┐рдВрджреБ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╡рд░реНрддрдорд╛рди рдФрд░ рдЕрдЧрд▓рд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдВрдХреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡рд░реНрддрдорд╛рди рдФрд░ рдЕрдЧрд▓рд╛ - zip (_:, _:) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд┐рдВрджреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред points.dropFirst() :

 let pairs = zip (points,points.dropFirst()) let averagePoints = pairs.map { CGPoint(x: ($0.x + $1.x) / 2, y: ($0.y + $1.y) / 2 )} 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди map(_:) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд┐рдбрдкреЙрдЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

filter (_:)


Swift , рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди filter (_:) рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП map(_:) рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА Sequence рджреГрд╢реНрдпреЛрдВ рдХреЛ filter (_:) рд╕рд╛рде filter (_:) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ! filter (_:) рд╡рд┐рдзрд┐ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ, рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд рд╣реИ, рдФрд░ рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рд╕рдВрддреБрд╖реНрдЯ рд╣реИ, рддреЛ рддрддреНрд╡ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ "рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди" рдПрдХ рдПрдХрд▓ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ - Sequence рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдПрдХ рддрддреНрд╡ - рдФрд░ рдПрдХ Bool рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзреЗрдпред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Array рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди filter (_:) рд╡рд┐рдзреЗрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореВрд▓ рд╕рд░рдгреА рдХреЗ рдЙрди рддрддреНрд╡реЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рдФрд░ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рд╡рд┐рдзреЗрдп рдлрд╝рдВрдХреНрд╢рди true рджреЗрддрд╛ true ред

 //Functional Approach let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let filted = numbers.filter{$0 % 2 == 0} //[2, 4, 6, 8, 10] 

рдпрд╣рд╛рдВ, рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди filter (_:) numbers рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИ ( $0 рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рддрддреНрд╡ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рддреЛ numbers рд╕рд░рдгреА рдХреЗ рддрддреНрд╡ рдирдП filted рд╕рд░рдгреА рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред рд╣рдордиреЗ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рд╕реЗ рдПрдЪрдУрд╡реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрднрд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди filter (_:) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ filter (_:) рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ 20 рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП < 4000 :

 let fibonacci = sequence(first: (0, 1), next: { ($1, $0 + $1) }) .prefix(20).map{$0.0} .filter {$0 % 2 == 0 && $0 < 4000} print (fibonacci) // [0, 2, 8, 34, 144, 610, 2584] 

рд╣рдореЗрдВ рдЯрд┐рдмрд▓реНрд╕ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд┐рдмреЛрдирд╛рдЪреА рдЕрдиреБрдХреНрд░рдо рдХреЗ рджреЛ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ: n-th рдФрд░ (n + 1) -he:

 (0, 1), (1, 1), (1, 2), (2, 3), (3, 5) тАж 

рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо prefix (20) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдХреНрдХреАрд╕рд╡реЗрдВ рддрддреНрд╡ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ map {$0.0 } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдард┐рдд рдЯрдкрд▓ рдХреЗ 0 рддрддреНрд╡ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ 0 рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛:

 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,... 

рд╣рдо map {$0.1 } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдард┐рдд рдЯрдкрд▓ рдХрд╛ 1 рддрддреНрд╡ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ 1 рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛:

 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,... 

рд╣рдореЗрдВ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди filter {$0 % 2 == 0 && $0 < 4000} рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рджрд┐рдП рдЧрдП рд╡рд┐рдзреЗрдп рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдХреНрд░рдо рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧреА [Int] :

 [0, 2, 8, 34, 144, 610, 2584] 

Collection рд▓рд┐рдП filter (_:) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдореБрдЭреЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рддрдм рдЖрдИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ CollectionView images рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд images рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рдФрд░ рдЖрдк Drag & Drop рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ images рдХрд╛ рдПрдХ рдкреВрд░рд╛ "рдкреИрдХ" рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рдбрдВрдкрд┐рдВрдЧ" рд╕рд╣рд┐рдд рд╣рд░ рдЬрдЧрд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрдЪрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред "



рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, "рдХрдЪрд░рд╛ removedIndexes " рдореЗрдВ рдбрдВрдк рдХрд┐рдП рдЧрдП removedIndexes рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд░рдгреА рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрдХ рдирдпрд╛ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдХрд░ рдЙрди рд╕рднреА рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рд░рдгреА рдореЗрдВ removedIndexes ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ images рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ images рдирдХрд▓ рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрди рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП filter (_:) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 var images = [6, 22, 8, 14, 16, 0, 7, 9] var removedIndexes = [2,5,0,6] var images1 = images .enumerated() .filter { !removedIndexes.contains($0.offset) } .map { $0.element } print (images1) // [22, 14, 16, 9] 

enumerated() рд╡рд┐рдзрд┐ offset рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдФрд░ рд╕рд░рдгреА element рдорд╛рдиреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдЯреНрдпреВрдкрд▓реНрд╕ рдХрд╛ рдПрдХ рдХреНрд░рдо рд▓реМрдЯрд╛рддреА рд╣реИредрдлрд┐рд░ рд╣рдо filterрдЯреНрдпреВрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ , рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрд┐рдирдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ $0.offsetрд╕рд░рдгреА рдореЗрдВ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИрдВ removedIndexesред рдЕрдЧрд▓рд╛ рдХрджрдо, рд╣рдо рдЯрдкрд▓ рд╕реЗ рдореВрд▓реНрдп рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ $0.elementрдФрд░ рд╣рдореЗрдВ рдЬрд┐рд╕ рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ images1ред

reduce (_:, _:)


рд╡рд┐рдзрд┐ reduce (_:, _:)рднреА рдЙрдкрд▓рдмреНрдз map(_:)рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ filter (_:)ред рд╡рд┐рдзрд┐ reduce (_:, _:)" SequenceрдПрдХрд▓ рд╕рдВрдЪрдп рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо" рдврд╣ рдЬрд╛рддреА рд╣реИ рдФрд░ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╢реБрд░реБрдЖрддреА рд╕рдВрдЪрдп рдореВрд▓реНрдп рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ SequenceрдирдП рд╕рдВрдЪрдп рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рддрддреНрд╡ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрдп рдореВрд▓реНрдп рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ ред

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

 let sum = Array (1...100).reduce(0, +) 

рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рддреБрдЪреНрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИ reduce (_:, _:)- рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рдЧрд┐рдирдирд╛ Arrayред

     1 0 1 0 +1 = 1 2 1 2 2 + 1 = 3 3 3 3 3 + 3 = 6 4 6 4 4 + 6 = 10 . . . . . . . . . . . . . . . . . . . 100 4950 100 4950 + 100 = 5050 

рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, reduce (_:, _:)рд╣рдо рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 let fibonacci = sequence(first: (0, 1), next: { ($1, $0 + $1) }) .prefix(20).map{$0.0} .filter {$0 % 2 == 0 && $0 < 4000} print (fibonacci) // [0, 2, 8, 34, 144, 610, 2584] print(fibonacci.reduce(0,+)) // 3382 

рд▓реЗрдХрд┐рди рдПрдХ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ reduce (_:, _:)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ UIScrollView- "рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп" рдХреНрд╖реЗрддреНрд░ рдХрд╛ contentSizeрдЖрдХрд╛рд░ - рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ subviews:

 let scrollView = UIScrollView() scrollView.addSubview(UIView(frame: CGRect(x: 300.0, y: 0.0, width: 200, height: 300))) scrollView.addSubview(UIView(frame: CGRect(x: 100.0, y: 0.0, width: 300, height: 600))) scrollView.contentSize = scrollView.subviews .reduce(CGRect.zero,{$0.union($1.frame)}) .size // (500.0, 600.0) 

рдЗрд╕ рдбреЗрдореЛ рдореЗрдВ, рд╕рдВрдЪрдп рдореВрд▓реНрдп рд╣реИ GCRect, рдФрд░ рд╕рдВрдЪрдп рдСрдкрд░реЗрд╢рди unionрдЖрдпрддреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИ рдЬреЛ frameрд╣рдорд╛рд░реЗ рд╣реИрдВ subviewsред

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

 // Separate Tuples let arr = [("one", 1), ("two", 2), ("three", 3), ("four", 4)] let (arr1, arr2) = arr.reduce(([], [])) { ($0.0 + [$1.0], $0.1 + [$1.1]) } print(arr1) // ["one", "two", "three", "four"] print(arr2) // [1, 2, 3, 4] 

рд╕реНрд╡рд┐рдлреНрдЯ 4.2рдиреЗ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреА reduce (into:, _:)ред рд╡рд┐рдзрд┐ рдХреЗ reduce (into:, _:)рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ рджрдХреНрд╖рддрд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ reduce (:, :)рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдорд┐рд▓рд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:COW (copy-on-write) ArrayDictionary



 // Remove duplicates let arrayInt = [1,1,2,6,6,7,2,9,7].reduce(into: []) { !$0.contains($1) ? $0.append($1) : () } // [1, 2, 6, 7, 9] 

... рдпрд╛ рд╕рд░рдгреА рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрд┐рдирддреА рдХрд░рддреЗ рд╕рдордп:

 // Count equal elements in array let arrayIntCount = [1,1,2,2,6,6,7,2,9,7].reduce(into: [:]) { counts, letter in counts[letter, default: 0] += 1 } // [6: 2, 9: 1, 1: 2, 2: 3, 7: 2] 

flatMap (_:)


рдЗрд╕ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдбреЗрдореЛ рджреЗрдЦреЗрдВред

 let maybeNumbers = ["42", "7", "three", "///4///", "5"] let firstNumber = maybeNumbers.map (Int.init).first 

рдпрджрд┐ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рддреЗ рд╣реИрдВ Playground, рддреЛ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ firstNumberрд╕рдорд╛рди рд╣реИ 42:



рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ PlaygroundрдЕрдХреНрд╕рд░ рд╕рдЪ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░ firstNumberред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ firstNumberрдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ Optional:



рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ map (Int.init)рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдпрд╣ OptionalTYPE рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИ [Int?], рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдкрдВрдХреНрддрд┐ StringрдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ IntрдФрд░ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ Int.int"рдЧрд┐рд░ рд░рд╣рд╛ рд╣реИ" ( failable) рд╣реИред рдлрд┐рд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЧрдарди рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рд▓реЗрдиреЗ firstрд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП Arrayрд╣реИ, рдЬреЛ рднреА рдЙрддреНрдкрд╛рджрди рд░реВрдкреЛрдВOptional, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╣рдо рд╕рд░рдгреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбрдмрд▓ рд╣реИ Optional, рдЬреЛ рд╣реИ Int??ред

рд╣рдореЗрдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд░рдЪрдирд╛ Optionalрдорд┐рд▓реА рд╣реИ OptionalрдЬрд┐рд╕рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рд╕реНрддрд░реЛрдВ рдореЗрдВ "рдЧреЛрддрд╛" рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХреЛрдИ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрддрд░ рдХреЛ рдФрд░ OptionalрднреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдбрдмрд▓ рдиреЗрд╕реНрдЯреЗрдб рд╕реЗ рдмрд╛рд╣рд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ Optionalрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЛрдЭ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рдЧрд╣рди рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Swiftред

  • if let , ; ┬л┬╗ ┬л┬╗ Optional , тАФ ┬л┬╗ Optional :

  • if case let ( pattern match ) :



    ?? :

  • , switch :


рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд ( generic) рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдРрд╕реА рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ , рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ mapред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП Arrayред

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

 let multilineString = """  ,  ,   ;     , тАФ  ,   :  тАФ   ,   .   ,   ,   .    .  ,        ,  ┬л ┬╗  .  ,  ,   ! """ let words = multilineString.lowercased() .split(separator: "\n") .map{$0.split(separator: " ")} 

рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП words, рд╣рдо рдкрд╣рд▓реЗ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрд░рдХреЗрд╕ (рдмрдбрд╝реЗ) рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдЫреЛрдЯрд╛ (рдЫреЛрдЯрд╛) рдмрдирд╛рддреЗ рд╣реИрдВ lowercased(), рдлрд┐рд░ рд╣рдо рдкрд╛рда рдХреЛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП split(separatot: "\n")рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ map {$0.split(separator: " ")}рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдПрд░реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ:

 [["", ",", "", ","], ["", "", ";", "", "", "", "", ",", "тАФ"], ["", ",", "", "", ":"], ["", "тАФ", "", "", ",", "", "", "."], ["", "", ",", "", "", ","], ["", "", ".", "", ""], ["", ".", "", ",", ""], ["", "", "", ""], ["", "", ",", "", "┬л", "┬╗"], ["", ".", "", ","], ["", ",", "", "", "!"]] 

... рдФрд░ wordsрдПрдХ рдбрдмрд▓ Array:



рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╣рдо рдбреЗрдЯрд╛ рдХреА рдПрдХ "рдиреЗрд╕реНрдЯреЗрдб" рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рдирд╣реАрдВ рдерд╛ Optional, рдФрд░ Arrayред рдпрджрд┐ рд╣рдо wordsрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдкрд╛рда рдХреЗ рдкрддреНрд░ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдбрдмрд▓ рдХреЗ рд╕рд░рдгреА рдХреЛ "рд╕реАрдзрд╛" рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ArrayрдФрд░ рдЗрд╕реЗ рдПрдХрд▓ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ Arrayред рдпрд╣ OptionalрдЗрд╕ рдЦрдВрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдбрдмрд▓ рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ flatMap:

 let maybeNumbers = ["42", "7", "three", "///4///", "5"] let firstNumber = maybeNumbers.map (Int.init).first 

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, Swiftрд╣рдореЗрдВ рдЬрдЯрд┐рд▓ рд╡рд╛рдХреНрдп рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдкрдбрд╝реЗрдЧрд╛ред Swiftрд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИ ArrayрдФрд░ Optionalред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рд╣реИ flatMap! рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ map, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ "рд╕рдВрд▓рдЧреНрдирдХ" рдХреЗ рдмрд╛рдж рдХреЗ "рд╕реАрдзреЗ" рд╕реЗ рдЬреБрдбрд╝реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ mapред рдФрд░ рдЗрд╕реАрд▓рд┐рдП рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ flatMap, рдпрд╣ "рд╕реАрдзрд╛" ( flattens) рдкрд░рд┐рдгрд╛рдо рд╣реИ mapред

рдЖрдЗрдП рд▓рд╛рдЧреВ flatMapрдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ firstNumber:



рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХрд▓ рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рд╛ Optionalред рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП

рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк flatMapрдХрд╛рдо рдХрд░рддрд╛ рд╣реИ Arrayред рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ, wordsрд╣рдо рдмрд╕ рдХреЗ mapрд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВflatMap:



... рдФрд░ рд╣рдореЗрдВ wordsрдмрд┐рдирд╛ рдХрд┐рд╕реА "рдиреЗрд╕реНрдЯрд┐рдВрдЧ" рдХреЗ рдХреЗрд╡рд▓ рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИ :

 ["", ",", "", ",", "", "", ";", "", "", "", "", ",", "тАФ", "", ",", "", "", ":", "", "тАФ", "", "", ",", "", "", ".", "", "", ",", "", "", ",", "", "", ".", "", "", "", ".", "", ",", "", "", "", "", "", "", "", ",", "", "┬л", "┬╗", "", ".", "", ",", "", ",", "", "", "!"] 

рдЕрдм рд╣рдо рд╢рдмреНрджреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ words, рд▓реЗрдХрд┐рди рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ flatMapрд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ words, рддреЛ рд╣рдо, рд╢рд╛рдпрдж, рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред



рд╣рдореЗрдВ [Character]рдЕрдкрдиреЗ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ рдирд┐рд╣рд┐рдд рдЕрдХреНрд╖рд░реЛрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ "рдиреЗрд╕реНрдЯреЗрдб" рд╕рд░рдгреА рдирд╣реАрдВ, рдПрдХ рдПрдХрд▓ рдорд┐рд▓рддрд╛ рд╣реИ :

 ["", "", "", "", "", "", "", "", "", "", "", "", ",", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ",", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ";", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ...] 

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рддреНрд░реЛрдВ StringрдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдФрд░, рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрдж рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдмрд╛рд░ рдлрд┐рд░ "рдиреЗрд╕реНрдЯрд┐рдВрдЧ" рдХреЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЖрддреЗ рд╣реИрдВ ред рд╢рд╛рдпрдж рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВред рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВредCollection[Character]flatMapflattenCharacters


рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛: рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛


TASK рез


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

 let wordsString = words.reduce ("",+).filter { "" .contains($0)} //  

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╡реЗ рд╕рднреА рдкрддреНрд░ рдорд┐рд▓реЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдЪрд▓реЛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА keyрдЕрдХреНрд╖рд░ рд╣реИ, рдФрд░ рдореВрд▓реНрдп valueрдкрд╛рда рдореЗрдВ рдЗрд╕рдХреА рдШрдЯрдирд╛ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╣реИред

рд╣рдо рдЗрд╕реЗ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓реА рд╡рд┐рдзрд┐Swift 4.2 рдПрдХ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдирдИ рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ рдЬреЛ рдЗрд╕рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИ reduce (into:, _:)ред letterCountрд╣рдорд╛рд░реЗ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреА рдШрдЯрдирд╛ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИ :

 let letterCount = wordsString.reduce(into: [:]) { counts, letter in counts[letter, default: 0] += 1} print (letterCount) // ["": 1, "": 18, "": 2, "": 2, "": 5, "": 7, "": 17, "": 4, "": 23, ...] 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдорд┐рд▓реЗрдЧрд╛ letterCount [Character : Int]рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ keyрдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдг рд╣реИрдВ, рдФрд░ рдорд╛рди рдХреЗ рд░реВрдк valueрдореЗрдВ рдЗрди рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред

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

 let letterCountDictionary = Dictionary(grouping: wordsString ){ $0}.mapValues {$0.count} letterCount == letterCountDictionary // true 

рд╣рдо рд╢рдмреНрджрдХреЛрд╢ рдХреЛ letterCountрд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ :

 let lettersStat = letterCountDictionary .sorted(by: <) .map{"\($0.0):\($0.1)"} print (lettersStat) // [":17", ":5", ":18", ":4", ":8", ":35", ":3", ":4", ":18", ":5", ":2", ":10", ":4", ":26", ":34", ":5", ":7", ":23", ":25", ":4", ":2", ":3", ":4", ":2", ":1", ":14", ":2", ":4"] 

рд▓реЗрдХрд┐рди рд╣рдо рд╕реАрдзреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Dictionary, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЖрджреЗрд╢рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди sorted (by:)рдХреЛ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ Dictionary, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдЕрдиреБрдХреНрд░рдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд╛рдорд┐рдд рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рдЫрд╛рдВрдЯреЗрдЧрд╛, рдЬрд┐рд╕реЗ mapрд╣рдо [":17", ":5", ":18", ...]рд╕рдВрдмрдВрдзрд┐рдд рдЕрдХреНрд╖рд░ рдХреА рдШрдЯрдирд╛ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП рддрд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ ред

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдмрд╛рд░ sorted (by:)рдмрд╕ " <" рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзреЗрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдлрд╝рдВрдХреНрд╢рди sorted (by:)рдЗрдирдкреБрдЯ рдкрд░ рдПрдХрдорд╛рддреНрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ "рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди" рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рдЖрд╕рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдФрд░ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рд┐рдЯрд░реНрдиtrue) рдпрд╛ рдирд╣реАрдВ (рд░рд┐рдЯрд░реНрди false)ред рд╣рдо рдЗрд╕ "рддреБрд▓рдирд╛рддреНрдордХ рдлрд╝рдВрдХреНрд╢рди" sorted (by:)рдХреЛ рдПрдХ рдЕрдирд╛рдо рдмрдВрдж рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВ :

 sorted(by: {$0.key < $1.key} 

рдФрд░ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд░ " <" рджреЗ рд╕рдХрддреЗ рд╣реИрдВ , рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рднреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдФрд░ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдЫрдВрдЯрдиреА рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ keyред

рдЕрдЧрд░ рд╣рдо рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ valueрдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ рдХреМрди рд╕реЗ рдЕрдХреНрд╖рд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ sorted (by:):

 let countsStat = letterCountDictionary .sorted(by: {$0.value > $1.value}) .map{"\($0.0):\($0.1)"} print (countsStat ) //[":35", ":34", ":26", ":25", ":23", ":18", ":18", ":17", ":14", ":10", ":8", ":7", ":5", ":5", ":5", ":4", ":4", ":4", ":4", ":4", ":4", ":3", ":3", ":2", ":2", ":2", ":2", ":1"] 

рдЕрдЧрд░ рд╣рдо рдПрдХ рдмрд╣реБ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╣реБ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рдкрддреНрд░ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ...

 let multilineString = """  ,  ,   ;     , тАФ  ,   :  тАФ   ,   .   ,   ,   .    .  ,        ,  ┬л ┬╗  .  ,  ,   ! """ let words = multilineString.lowercased() .split(separator: "\n") .flatMap{$0.split(separator: " ")} let wordsString = words.reduce ("",+).filter { "" .contains($0)} let letterCount = wordsString.reduce(into: [:]) { counts, letter in counts[letter, default: 0] += 1} let lettersStat = letterCountDictionary .sorted(by: <) .map{"\($0.0):\($0.1)"} print (lettersStat) // [":17", ":5", ":18", ":4", ":8", ":35", ":3", ":4", ":18", ":5", ":2", ":10", ":4", ":26", ":34", ":5", ":7", ":23", ":25", ":4", ":2", ":3", ":4", ":2", ":1", ":14", ":2", ":4"] let countsStat = letterCountDictionary .sorted(by: {$0.value > $1.value}) .map{"\($0.0):\($0.1)"} print (countsStat ) //[":35", ":34", ":26", ":25", ":23", ":18", ":18", ":17", ":14", ":10", ":8", ":7", ":5", ":5", ":5", ":4", ":4", ":4", ":4", ":4", ":4", ":3", ":3", ":2", ":2", ":2", ":2", ":1"] 

... рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рд░реНрдЧ рдореЗрдВ рдореМрд▓рд┐рдХ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рднреА рд╡реЗрд░рд┐рдПрдмрд▓ (рдХреЛрдИ var, рдХреЗрд╡рд▓ let)рдФрд░ рд╡рд░реНрддрдорд╛рди (рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдХрд╛рд░реНрдп) рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ, рдХреИрд╕реЗ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рд╕рднреА рдХреЗ рдирд╛рдо:

split- рд╡рд┐рднрд╛рдЬрди,
map- рдкрд░рд┐рд╡рд░реНрддрд┐рдд
flatMapрдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд - рд╕рдВрд░реЗрдЦрдг, (рдШреЛрдВрд╕рд▓реЗ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрддрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛)
filter-, рдлрд┐рд▓реНрдЯрд░
sorted- рдЫрдБрдЯрд╛рдИ,
reduce- рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

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

рдЗрд╕ рдбреЗрдореЛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛, рдкрд░реАрдХреНрд╖рдгрд╢реАрд▓рддрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдкрд╛рда рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдкреАрдЫрд╛ рдХрд░рддреЗ рд╣реИрдВред рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, CollectionрдкреНрд░рджрд░реНрд╢рди рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ filter(_:)рдФрд░, рдФрд░ рдлрд┐рд░ - firstред
Swift 4 рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирдП рдлреАрдЪрд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддреЗрдЬ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВред

1. рдЙрдкрдпреЛрдЧ contains, рдирд╣реАрдВfirst( where: ) != nil


рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдПрдХ рд╕рдВрдЧреНрд░рд╣ CollectionрдореЗрдВ рд╣реИ, рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ containsред

рд╕рд╣реА рдХреЛрдб

 let numbers = [0, 1, 2, 3] numbers.contains(1) 

рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдХреЛрдб

 let numbers = [0, 1, 2, 3] numbers.filter { number in number == 1 }.isEmpty == false numbers.first(where: { number in number == 1 }) != nil 

2. рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ isEmpty, countрд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ


рдЪреВрдВрдХрд┐ рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ countрд╕рднреА рддрддреНрд╡реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╣реА рдХреЛрдб

 let numbers = [] numbers.isEmpty 

рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдХреЛрдб

 let numbers = [] numbers.count == 0 

3. рдХреЗ Stringрд╕рд╛рде рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВisEmpty


рд╕реНрдЯреНрд░рд┐рдВрдЧ StringрдЗрди SwiftрдХреИрд░реЗрдХреНрдЯрд░реНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ [Character]ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ StringрдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ isEmptyред

рд╕рд╣реА рдХреЛрдб

 myString.isEmpty 

рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдХреЛрдб

 myString == "" myString.count == 0 

4. рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬреЛ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ


рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧреНрд░рд╣ рдкрд░ Iterating рдкрд╣рд▓реА рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ, рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ filterрдмрд╛рдж рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ first, рд▓реЗрдХрд┐рди рдЧрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╣реИ first (where:)ред рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИред рд╡рд┐рдзрд┐ filterрдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧреА, рдЪрд╛рд╣реЗ рд╡рд╣ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рд╕реЗ рдорд┐рд▓реЗ рдпрд╛ рдирд╣реАрдВред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИ last (where:)ред

рд╕рд╣реА рдХреЛрдб

 let numbers = [3, 7, 4, -2, 9, -6, 10, 1] let firstNegative = numbers.first(where: { $0 < 0 }) 

рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдХреЛрдб

 let numbers = [0, 2, 4, 6] let allEven = numbers.filter { $0 % 2 != 0 }.isEmpty 

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

TASK 2


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



рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдореЗрдВ 4 рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВ, рдЬреЛ рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:

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

рдЦреЗрд▓ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдпSET: рдЯреЗрдмрд▓ рдкрд░ рд░рдЦреЗ рдЧрдП 12 рдХрд╛рд░реНрдбреЛрдВ рдореЗрдВ рд╕реЗ, рдЖрдкрдХреЛ SET3 рдХрд╛рд░реНрдбреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ (рдПрдХ рд╕реЗрдЯ) рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ , рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд┐рдиреНрд╣ рдпрд╛ рддреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛ рдпрд╛ рд╕рднреА 3 рдХрд╛рд░реНрдбреЛрдВ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛред рд╕рднреА рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА 3 рдХрд╛рд░реНрдб рдкрд░ рдкрд╛рддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рд╕рднреА 3 рдХрд╛рд░реНрдб рдкрд░ рдПрдХ рд╣реА рдпрд╛ рдЕрд▓рдЧ рд░рдВрдЧ рдпрд╛ рддреЛ рдПрдХ рд╣реА рдпрд╛ рдЕрд▓рдЧ, рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрддрдиреЗ рдкрд░ ...

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХрд╛рд░реНрдб рдореЙрдбрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рд░реБрдЪрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВ SET struct SetCardрдФрд░ рдХрд▓рди рд╡рд┐рдзрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ SETрдХреЗ рд▓рд┐рдП 3 рдирдХреНрд╢реЗ isSet( cards:[SetCard]):

 struct SetCard: Equatable { let number: Variant // number - 1, 2, 3 let color: Variant // color - 1, 2, 3 (, , , ) let shape: Variant // symbol - 1, 2, 3 (, , , ) let fill: Variant // fill - 1, 2, 3 (, , , ) enum Variant: Int, CaseIterable { case v1 = 1 case v2 case v3 } static func isSet(cards: [SetCard]) -> Bool { guard cards.count == 3 else {return false} let sums = [ cards.reduce(0, { $0 + $1.number.rawValue }), cards.reduce(0, { $0 + $1.color.rawValue }), cards.reduce(0, { $0 + $1.shape.rawValue }), cards.reduce(0, { $0 + $1.fill.rawValue }) ] return sums.reduce(true, { $0 && ($1 % 3 == 0) }) } } 

рдореЙрдбрд▓ рдкреНрд░рддреНрдпреЗрдХ рд╕реБрд╡рд┐рдзрд╛ - рд╕рдВрдЦреНрдпрд╛ number , рдкреНрд░рддреАрдХ рдкреНрд░рдХрд╛рд░ shape , рд░рдВрдЧ color рдФрд░ рднрд░рдиреЗ fill - рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рд╕реНрддреБрдд VariantрддреАрди рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди рд╣реЛрдиреЗ var1, var2рдФрд░ var33 рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ rawValue- 1,2,3ред рдЗрд╕ рд░реВрдк рдореЗрдВ, rawValueрдЗрд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд╣рдо рдХреБрдЫ рд╕рдВрдХреЗрдд рд▓реЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, colorрддреЛ 3 рдХрд╛рд░реНрдб рдХреЗ rawValueрд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЬреЛрдбрд╝рдХрд░ colors, рд╣рдо рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрджрд┐ colorsрд╕рднреА 3 рдХрд╛рд░реНрдб рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдпреЛрдЧ рд╕рдорд╛рди рд╣реЛрдЧрд╛ 3, 6рдпрд╛ 9, рдпрджрд┐ рд╡реЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ, рддреЛ рдпреЛрдЧ рд╣реЛрдЧрд╛ рдмрд░рд╛рдмрд░ 6ред рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрд╕рд░реА рд░рд╛рд╢рд┐ рдХреЗ rawValueрд▓рд┐рдП рдЧреБрдгрд╛ рд╣реИcolorsрд╕рднреА 3 рдХрд╛рд░реНрдбред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ 3 рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд рд╣реИ SETред 3 рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SETрдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП SetCard- рдорд╛рддреНрд░рд╛ number, рдкреНрд░рддреАрдХ рдкреНрд░рдХрд╛рд░ shape, рд░рдВрдЧ colorрдФрд░ рднрд░рдирд╛ fill- рдЙрдирдХреА рд░рд╛рд╢рд┐ rawValue3 рдХреА рдмрд╣реБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред

рдЗрд╕рд▓рд┐рдП, рдореЗрдВ staticрд╡рд┐рдзрд┐, isSet( cards:[SetCard])рд╣рдо рдкрд╣рд▓реА рд╕рд░рдгреА рдЧрдгрдирд╛ sumsрд░рдХрдо рдХреЗ rawValueрд╕рднреА 4 рдкреНрд░рджрд░реНрд╢рди рдирдХреНрд╢рд╛ рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА 3 рдирдХреНрд╢реЗ рдХреЗ рд▓рд┐рдП reduceрдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд░рд╛рдмрд░ 0рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдЬрдорд╛ {$0 + $1.number.rawValue}, {$0 + $1.color.rawValue}, {$0 + $1.shape.rawValue}, { {$0 + $1.fill.rawValue}ред рд╕рд░рдгреА рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ sums3 рдХрд╛ рдПрдХ рдмрд╣реБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рд╕реЗ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВreduce, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ trueрддрд╛рд░реНрдХрд┐рдХ рдлрд╝рдВрдХреНрд╢рди " AND" рдХреЗ рд╕рдорд╛рди рдФрд░ рд╕рдВрдЪрдп рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп {$0 && ($1 % 3) == 0}ред рд╕реНрд╡рд┐рдлреНрдЯ 5 рдЕрд▓рдЧ рд╕рдорд╛рд░реЛрд╣ рдХреА рдмрд╣реБрд▓рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХреА isMultiply(of:)рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрдЬрд╛рдп %рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╢реЗрд╖ред рдпрд╣ рднреА рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛: { $0 && ($1.isMultiply(of:3) }ред

рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдб 3 SetCardрдХрд╛рд░реНрдб рд╣реИрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб SET" рдХрд╛рд░реНрдпрд╛рддреНрдордХ " рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдФрд░ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ Playground:



рдЗрд╕ рдЧреЗрдо рдореЙрдбрд▓ рдкрд░ SETрдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ ( UI) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╣рд╛рдВ , рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ ред

рд╢реБрджреНрдз рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдФрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡


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

рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп Swiftрд╕рд╛рдЗрдЯ рдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ point.free рдХреЗ рдкрд╣рд▓реЗ рдПрдкрд┐рд╕реЛрдб рдореЗрдВ " рдХрд╛рд░реНрдп " рдФрд░ " рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ " рд╣реИ, рдЬреЛ рдореЗрдВ рд░реВрд╕реА рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд " рд╡рд┐рдХрд▓реНрдк " рдФрд░ "рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕" ред

рд╕рдорд╛рд░реЛрд╣ рд░рдЪрдирд╛


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

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

 var integerArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 4, 5] func unique(_ array: [Int]) -> [Int] { return array.reduce(into: [], { (results, element) in if !results.contains(element) { results.append(element) } }) } func even(_ array: [Int]) -> [Int] { return array.filter{ $0%2 == 0} } func square(_ array: [Int]) -> [Int] { return array.map{ $0*$0 } } var array = square(even(unique(integerArray))) // it returns [4, 16, 36, 64] 

рдпрд╣ рдХреЛрдб рд╣рдореЗрдВ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреА рдкрдардиреАрдпрддрд╛ рдЗрддрдиреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХреНрд░рдо (рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ) рдЙрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬрд┐рд╕рдХреЗ рд╣рдо рдЖрджреА рд╣реИрдВ (рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ) рдФрд░ рдпрд╣рд╛рдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╣рдореЗрдВ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЛ рдкрд╣рд▓реЗ рдХрдИ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рдЕрдВрддрд░рддрдо рднрд╛рдЧ рддрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП inegerArray, рдлрд┐рд░ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрд╛рд╣рд░реА рдХреЗ рд▓рд┐рдП unique, рдлрд┐рд░ рд╣рдо рдПрдХ рдФрд░ рд╕реНрддрд░ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди even, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди squareред

рдФрд░ рдпрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ >>>рдФрд░ рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреА "рд░рдЪрдирд╛" рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИ |>, рдЬреЛ рд╣рдореЗрдВ integerArrayрдлрд╝рдВрдХреНрд╢рди рдХреЗ "рдХрдиреНрд╡реЗрдпрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓ рд╕рд░рдгреА рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реБрдП, рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ :

 var array1 = integerArray |> unique >>> even >>> square 

рд▓рдЧрднрдЧ рд╕рднреА рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рд╖рд╛рдУрдВ рд╡рд┐рд╢реЗрд╖ F#, ElixirрдФрд░ Elm"рд░рдЪрдирд╛" рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдХреЗ рд░реВрдк рдореЗрдВ Swiftрд╡рд╣рд╛рдБ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░реЛрдВ 'рд░рдЪрдирд╛ "рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ >>>рдФрд░ |>, рд▓реЗрдХрд┐рди рд╣рдо рдорджрдж рд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Generics, рд╕рд░реНрдХрд┐рдЯ ( closure) рдФрд░ infixрдСрдкрд░реЗрдЯрд░:

 precedencegroup ForwardComposition{ associativity: left higherThan: ForwardApplication } infix operator >>> : ForwardComposition func >>> <A, B, C>(left: @escaping (A) -> B, right: @escaping (B) -> C) -> (A) -> C { return { right(left($0)) } } precedencegroup ForwardApplication { associativity: left } infix operator |> : ForwardApplication func |> <A, B>(a: A, f: (A) -> B) -> B { return f(a) } 

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

 var integerArray1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 4, 5] let b = integerArray1.map( { $0 + 1 } >>> { $0 * 3 } >>> String.init) print (b) // ["6", "9", "12", "15", "18", "21", "24", "27", "30", "6", "15", "18"] 

рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдкрд╣рд▓реА рдмрд╛рд░, рдЬрдм рдпрд╣ Swift2014 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ , рддреЛ рд╕рднреА рдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА "рд░рдЪрдирд╛" рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рдЧ рд▓рд┐рдпрд╛ рдФрд░ рдЙрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬреИрд╕реЗ рдХрд┐ JSONрдЕрд╕реАрдо рдиреЗрд╕реНрдЯреЗрдб рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ if letред рдореИрдВрдиреЗ рдЦреБрдж рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ JSON рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╕реЗ рдкреНрд░рд╕рдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрд░реНрдЧреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдерд╛ ред

рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░реНрд╕ SwiftрдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЧрдП рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдЙрдиреНрдореБрдЦ рддрдХрдиреАрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХрд╛ред JSONрдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ "рдбрд┐рд▓реАрд╡рд░" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПрдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд CodableрдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ Swift: рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ String, Int, URL, Array, Dictionary, рдЖрджрд┐

 struct Blog: Codable { let id: Int let name: String let url: URL } 

JSONрдЙрд╕ рдкреНрд░рд╕рд┐рджреНрдз рд▓реЗрдЦ рдХреЗ рдбреЗрдЯрд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж ...
 [ { "id" : 73, "name" : "Bloxus test", "url" : "http://remote.bloxus.com/" }, { "id" : 74, "name" : "Manila Test", "url" : "http://flickrtest1.userland.com/" } ] 

... рдлрд┐рд▓рд╣рд╛рд▓ рдЖрдкрдХреЛ рдмреНрд▓реЙрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ blogs:

 let blogs = Bundle.main.path(forResource: "blogs", ofType: "json") .map(URL.init(fileURLWithPath:)) .flatMap { try? Data.init(contentsOf: $0) } .flatMap { try? JSONDecoder().decode([Blog].self, from: $0) } print ("\(blogs!)") // [id: 73 name: Bloxus test url: http://remote.bloxus.com/, // id: 74 name: Manila Test url: http://flickrtest1.userland.com/] 

рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП "рд░рдЪрдирд╛" рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд░ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рднреВрд▓ рдЧрдпрд╛ рд╣реИ JSON, рдЕрдЧрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред

рдпрджрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рддреЛ рд╣рдо JSONрдбреЗрдЯрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдореЙрдбрд▓ рдореЗрдВ "рдЕрдкрд▓реЛрдб" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ JSONрдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╣реИ user.jsonрдФрд░ рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ Resources.ред рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╣реИ:

 { "email": "blob@pointfree.co", "id": 42, "name": "Blob" } 

рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рд╕реЗ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рд╡рд╛рд▓рд╛ Codable рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ :Userjson

 struct User: Codable { let email: String let id: Int let name: String init?(json: Data) { if let newValue = try? JSONDecoder().decode(User.self, from: json) { self = newValue } else { return nil } } } 

рд╣рдо рдмрд╣реБрдд рд╣реА newUserрд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :

 let newUser = Bundle.main.path(forResource: "user", ofType: "json") .map(URL.init(fileURLWithPath:)) .flatMap { try? Data.init(contentsOf: $0) } .flatMap { User.init(json: $0) } 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, newUserрдПрдХ TYPE рд╣реЛрдЧрд╛ Optional, рдЕрд░реНрдерд╛рддреН User?:



рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ ResourcesрдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╣реИ invoices.jsonрдФрд░ рдЗрд╕рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЪрд╛рд▓рд╛рди рдкрд░ рдбреЗрдЯрд╛ рд╣реИред

 [ { "amountPaid": 1000, "amountDue": 0, "closed": true, "id": 1 }, { "amountPaid": 500, "amountDue": 500, "closed": false, "id": 2 } ] 

рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдордиреЗ рдХрд┐рдпрд╛ рдерд╛ Userред рдЖрдЗрдП рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЪрд╛рд▓рд╛рди рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ struct Invoice...

 struct Invoice: Codable { let amountDue: Int let amountPaid: Int let closed: Bool let id: Int } 

... рдФрд░ рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд JSONрдЪрд╛рд▓рд╛рдиреЛрдВ рдХреА рд╕рд░рдгреА рдХреЛ рдбреАрдХреЛрдб рдХрд░реЗрдВ invoices, рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП рдФрд░ рддрд░реНрдХ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░реЗрдВ decode:

 let invoices = Bundle.main.path(forResource: "invoices", ofType: "json") .map( URL.init(fileURLWithPath:) ) .flatMap { try? Data.init(contentsOf: $0) } .flatMap { try? JSONDecoder().decode([Invoice].self, from: $0) } 

invoicesрд╣реЛрдЧрд╛ [Invoice]?:



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

 struct UserEnvelope { let user: User let invoices: [Invoice] } 

рджреЛ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп if let...

 if let newUser = newUser, let invoices = invoices { } 

... рдЪрд▓реЛ if letрдПрдХ рд╕рд╣рд╛рдпрдХ Genericрдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдбрдмрд▓ рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ zipрдЬреЛ рджреЛ OptionalрдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ OptionalрдЯреБрдкрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ :

 func zip<A, B>(_ a: A?, _ b: B?) -> (A, B)? { if let a = a, let b = b { return (a, b) } return nil } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд░ рдХреЛ рдХреБрдЫ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ newUserрдФрд░ invoices, рд╣рдо рдмрд╕ рдЕрдкрдиреЗ рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрдирд╛рддреЗ zipрд╣реИрдВ, рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ UserEnvelope.initрдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛!

 let userEnv = zip( Bundle.main.path(forResource: "user", ofType: "json") .map(URL.init(fileURLWithPath:)) .flatMap { try? Data.init(contentsOf: $0) } .flatMap { User.init(json: $0) }, Bundle.main.path(forResource: "invoices", ofType: "json") .map(URL.init(fileURLWithPath:)) .flatMap { try? Data.init(contentsOf: $0) } .flatMap { try? JSONDecoder().decode([Invoice].self, from: $0) } ).flatMap (UserEnvelope.init) print ("\(userEnv!)") // UserEnvelope(user: id: 42 name: Blob , // invoices: [id: 1 amountDue: 0 amountPaid: 1000 closed: true, // id: 2 amountDue: 500 amountPaid: 500 closed: false]) 

рдПрдХ рдПрдХрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ JSONрдПрдХ рдЬрдЯрд┐рд▓ рдПрдХ рдХреЛ рдбреЗрдЯрд╛ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкреВрд░реНрдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ редstruct UserEnvelope

  • zip , , . user , JSON , invoices , JSON . .
  • map , , ┬л┬╗ .
  • flatMap , , , .

рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ (DSL) рдХрд╛ рд╕рдВрдЪрд╛рд▓рди zip, рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ mapрдФрд░ flatMapрдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ ред

рд╣рдо рдЗрд╕ рдбреЗрдореЛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдкреЙрдЗрдВрдЯрдлреНрд░реА ..co рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред

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

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


рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реБрд╡рд┐рдзрд╛рдУрдВ рджрд┐рдпрд╛ Swf, рдмреЙрдХреНрд╕ "рдХреА рдЯреА┬л рдмрд╛рд╣рд░ рдЙрдЪреНрдЪ рдХреНрд░рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд map, flatMap, reduce, filterрдФрд░ рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп Sequence, OptionalрдФрд░ Resultред рд╡реЗ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ "рд╡рд░реНрдХрд╣реЙрд░реНрд╕" рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, ,рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдореВрд▓реНрдп - рд╕рдВрд░рдЪрдирд╛рдПрдВ structрдФрд░ рдЧрдгрдирд╛рдПрдВ рд╡рд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ enumред рдПрдХ iOSрдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕ рдЯреВрд▓ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд░ рдПрдХрддреНрд░ рдХреА рдЧрдИ рд╕рднреА рдХрд╝реМрдо Playground, рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ Github ред рдпрджрд┐ рдЖрдкрдХреЛ рд▓реЙрдиреНрдЪ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ Playground, рддреЛ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

"рд▓реЙрдиреНрдЪрд┐рдВрдЧ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░" рдФрд░ "рд░рдирд┐рдВрдЧ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб" рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕рдХреЛрдб рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб "рдлреНрд░реАрдЬ" рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред

рд╕рдВрджрд░реНрдн:

Functional Programming in Swift: An Introduction.
An Introduction to Functional Programming in Swift.
The Many Faces of Flat-Map: Part 3
Inside the Standard Library: Sequence.map()
Practical functional programming in Swift

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


All Articles