рдбреЗрдЯрд╛ рдУрд░рд┐рдПрдВрдЯреЗрдб рдХрдВрдмрд╛рдЗрди
рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдо "рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░" рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред
рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд░рдг, рд╣рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдореВрд▓реНрдпреЛрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдСрдкрд░реЗрдЯрд░ (рдХреА рдПрдХ рдзрд╛рд░рд╛ рдореЙрдбрд▓рд┐рдВрдЧ delay
) рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛ редрдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдХреБрдЫ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдПрдВрдЧреЗ, Codeable
рдФрд░ рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрдВрдмрд╛рдЗрди рдкреНрд░рдХрд╛рд╢рдХ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред
рд╕рдВрдЪрд╛рд▓рдХ рдкреНрд░рдХрд╛рд░
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдореЙрдбрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдореМрдЬреВрдж рд╣реИрдВредReactiveX рд╕рд╛рдЗрдЯ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрднрдЧ 10 рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рддреЛрдбрд╝рддреА рд╣реИ: рдирд┐рд░реНрдорд╛рдг, рдкрд░рд┐рд╡рд░реНрддрди, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ, рд╕рдВрдпреЛрдЬрди, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рд╕рд╣рд╛рдпрдХ, рд╕рд╢рд░реНрдд, рдЧрдгрд┐рддреАрдп / рд╕рдореБрдЪреНрдЪрдп, рдмреИрдХрд╕реНрдкреЗрд╕, рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп-рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдФрд░ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп (рдЯреВ) рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ ReactiveX рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИредрдиреЛрдЯ: рдЖрдк RxSwift рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпрдХреНрд╖ RxSwift рдореЗрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдкреНрд░рдХрд╛рд╢рдХ рдХрдореНрдмрд╛рдЗрди рдореЗрдВред
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ delay
, рдЬреЛ рд╕рд╣рд╛рдпрдХ ( utility
) рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдЖрдЬ рд╣рдо рджреЛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ ( filtering
) рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ ред
рдлрд╝рд┐рд▓реНрдЯрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╡рд╛рд╣ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рдпрд╛ рдХреБрдЫ (рдпрд╛ рдХреЛрдИ рдирд╣реАрдВ) рдХреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЧреЗ рдХреА рдУрд░ рдмрдврд╝рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИредdropFirst
dropFirst
рдкрд╣рд▓реЗ n
рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ ред рд╣рдо Operator
рдЕрдкрдиреА рд╕рд╛рджрдЧреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдмрд╕ рдЗрд╕реЗ рдЕрдкрдиреА рджреБрд╢реНрдордиреА рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ редenum Operator {
case delay(seconds: Double)
case dropFirst(count: Int)
}
рд╣рдо рдЗрд╕ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗрд╕ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдХрд╛рд╢рдХ рдореЗрдВ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВредextension Operator {func applyPublisher<T>(_ publisher: AnyPublisher<T, Never>) -> AnyPublisher<T, Never> {
switch self {
case .dropFirst(let count):
return publisher.dropFirst(count).eraseToAnyPublisher()
}}}
рдЕрдм рдСрдкрд░реЗрдЯрд░ dropFirst
рдХреЛ рдСрдкрд░реЗрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмрдЪрдд dropFirst
рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ delay
ред рд╢рд╛рдпрдж рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕рд╣рд╛рдпрдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рдЗрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗрдВ, рдПрдХ рдФрд░ рдмрдпрд╛рди рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВредрдлрд╝рд┐рд▓реНрдЯрд░
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд dropFirst
, рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдорд╛рдирджрдВрдб рд╣реИрдВ, рдСрдкрд░реЗрдЯрд░ filter
рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓рд╛ рд╣реИред рд╣рдо рдПрдХ рдмрдВрдж рдХреЛ рдХреИрд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлреИрд▓рд╛рддреЗ рд╣реИрдВ?filter(_:)
рджрд┐рдП рдЧрдП рдХреНрд▓реЛрдЬрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
developer.apple.com
рдЖрдЗрдП рд╡рд┐рдзрд┐ рдкрд░ filter
рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ редfunc filter(_ isIncluded: @escaping (Self.Output) -> Bool) -> Publishers.Filter<Self>
рдЗрд╕рдХрд╛ рд╕рдорд╛рдкрди isIncluded
рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИредрдХреНрдпрд╛ рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рдХреБрдЫ рднреА рд╣реИ рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИ? рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ?NSPredicate рдХреЗ рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ
рдЬрд╡рд╛рдм рд╣реИ NSPredicate
ред рдпрджрд┐ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдорд╛рди рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ NSPredicate
рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редрдЖрдЗрдП рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ filter
рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ редenum Operator {
case delay(seconds: Double)
case dropFirst(count: Int)
case filter(expression: String)
}
рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рднрд╛рд╡реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП %d !=3
рдпрд╛ %@ != тАЬDтАЭ
; рдЗрд╕рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕реА рддрд░рд╣, рд╣рдореЗрдВ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ filter
рдХреЛ рдкреНрд░рдХрд╛рд╢рдХ рдХреЗ рдкрд╛рд╕ рд▓реЗ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП редextension Operator {
func applyPublisher<T>(_ publisher: AnyPublisher<T, Never>) -> AnyPublisher<T, Never> {
switch self {
case .filter(let expression):
return publisher.filter { value in
NSPredicate(format: expression,
argumentArray: [value])
.evaluate(with: nil) }.eraseToAnyPublisher()
}}}
рдЬреИрд╕рд╛ рдХрд┐ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рд╣рдо NSPredicate
рдкреНрд░рдХрд╛рд╢рдХ рд╕реЗ рднреЗрдЬреЗ рдЧрдП рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднреЗрдЬрддреЗ рд╣реИрдВ редрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ NSPredicate
рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрдм рднреА рдЬрдм рдорд╛рди рдЯреБрдкрд▓реНрд╕ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЖрдо рд╣реИред рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ рдЬрдм рд╣рдо рд╕рдВрдпреБрдХреНрдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЗрд╕ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрдердиреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдЪреНрдЪ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ 3 рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓реЗ рдПрдкрд┐рд╕реЛрдб рдореЗрдВ: рд╕реЗрд╡рд┐рдВрдЧ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдСрдкрд░реЗрдЯрд░реНрд╕, рдореИрдк рдПрдВрдб рд╕реНрдХреИрди
рдЬреАрдЖрдИрдПрдл рдбреЗрдореЛ рдореЗрдВ, рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рд╕реВрдЪреА рдмрд╣реБрдд рдЦрд╛рд▓реА рд╣реИред рдЕрдЧрд▓реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рднрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ: рдкрд░рд┐рд╡рд░реНрддрди рдСрдкрд░реЗрдЯрд░, map
рдФрд░ scan
редрдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЗрд╕ рд╕рдВрдпреЛрдЬрди-рдЬрд╛рджреВ-рд╕реНрд╡рд┐рдлреБрдИ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрдВрдмрд╛рдЗрдВрдб-рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВредрд╣рдо рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рджрд┐рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред