рд╕реНрд╡рд┐рдлреНрдЯ 4.1: рдХреНрдпреЛрдВ Apple рдиреЗ рдлреНрд▓реИрдЯ рдореИрдк рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рдореИрдк рдХрд░ рджрд┐рдпрд╛

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

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



рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ рдХрд┐ flatMap рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ flatMap ред flatMap рд╡рд┐рдзрд┐ рдПрдХ рд╕реВрдЪреА рдФрд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддреА рд╣реИ (рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ), рдЗрд╕реЗ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХрд▓ (рдЪрдкрдЯрд╛) рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд░рд▓ map рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдкрд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред



рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдПрдХ map рдФрд░ flatMap map ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрд╡рд┐рдлреНрдЯ 4.1 рдореЗрдВ рдЖрдк рдЕрдм flatMap рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рднреА рдПрдХ рдкрд╛рд╕ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдм рдПрдХ compactMap рд╡рд┐рдзрд┐ рд╣реИред

рдкрд╣рд▓реЗ рддреЛ рдирд╡рд╛рдЪрд╛рд░ рдХреЗ рд╕рд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ flatMap рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХреНрдпреЛрдВ рдкреЗрд╢ рдХрд░реЗрдВ? рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред

рд╕рдВрд╕реНрдХрд░рдг 4.1 рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдиреЗ flatMap рд▓рд┐рдП рдУрд╡рд░рд▓реЛрдб рдХреЗ рддреАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди flatMap :

 1. Sequence.flatMap<S>(_: (Element) -> S) -> [S.Element],  S : Sequence 2. Optional.flatMap<U>(_: (Wrapped) -> U?) -> U? 3. Sequence.flatMap<U>(_: (Element) -> U?) -> [U] 

рдЖрдЗрдП рддреАрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред

Sequence.flatMap <S> (_: (рддрддреНрд╡) -> S) -> [S.Element], рдЬрд╣рд╛рдВ S: рдЕрдиреБрдХреНрд░рдо


рдкрд╣рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрдВрдж рдЙрд╕ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдПрдХ рддрддреНрд╡ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИред
flatMap рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯреЗ рдЕрдВрддрд┐рдо рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЗрди рд╕рднреА рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ flatMap ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] let flattened = array.flatMap { $0 } // [1, 2, 3, 4, 5, 6, 7, 8, 9] 

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

Optional.flatMap <U> (_: (рд▓рд┐рдкрдЯрд╛) -> U?) -> U?


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

 let a: Int? = 2 let transformedA = a.flatMap { $0 * 2 } // 4 let b: Int? = nil let transformedB = b.flatMap { $0 * 2 } // nil 

рдЕрдиреБрдХреНрд░рдо .flatMap <U> (_: (рддрддреНрд╡) -> U?) -> [U]


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

 let array = [1, 2, 3, 4, nil, 5, 6, nil, 7] let arrayWithoutNils = array.flatMap { $0 } // [1, 2, 3, 4, 5, 6, 7] 

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

 let array = [1, 2, 3, 4, 5, 6] let transformed = array.flatMap { $0 } // same as array.map { $0 } 

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

 struct Person { let name: String } let people = [Person(name: тАЬFooтАЭ), Person(name: тАЬBarтАЭ)] let names = array.flatMap { $0.name } 

рд╕рдВрд╕реНрдХрд░рдг 4.0 рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ, рд╣рдореЗрдВ [тАЬFooтАЭ, тАЬBarтАЭ] рд░реВрдкрд╛рдВрддрд░рдг рдорд┐рд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 4.0 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕рдВрдЧреНрд░рд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рддреАрд╕рд░реЗ рдУрд╡рд░рд▓реЛрдб рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ flatMap рдХрд╛ рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛, рдФрд░ рд╣рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдПрдХ "рдЪрдкрдЯрд╛" рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛: [тАЬFтАЭ, тАЬoтАЭ, тАЬoтАЭ, тАЬBтАЭ, тАЬaтАЭ, тАЬrтАЭ]

flatMap рдХреЙрд▓ рдХрд░рддреЗ flatMap рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХреЛ рддреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо Array<Character>.Type рд╣реИред рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд Array<String>.Type рдирд╣реАрдВ - Array<String>.Type ред

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


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

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


All Articles