рд╕реНрдЯреЗрдЯрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдЯреЗрдмрд▓реНрд╕

рдЫрд╡рд┐

рд╣рдо рд╕рднреА рдХреЛ рдЕрдХреНрд╕рд░ рд╕реНрдерд┐рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд╡реЗ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реНрдХреНрд░реАрди, "рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ" рд╕реНрдХреНрд░реАрди, рдФрд░ рдХрдИ рдЕрдиреНрдп рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдиреМрд╕рд┐рдЦрд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд╛рд╕ рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЧреИрд░-рд╕реНрдХреЗрд▓реЗрдмрд▓, рдЕрдирдореНрдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдХрдЯ рдХреЗ рдиреАрдЪреЗ - рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реЛ


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

рдЫрд╡рд┐

рд╕рдорд╕реНрдпрд╛


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ: рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ ViewController рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ UITableViewDelegate рдФрд░ UITableViewDatasource рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХрдХреНрд╖реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХрдо рд╕реЗ рдХрдо - рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде 5 рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  1. рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдкреИрдорд╛рдирд╛
  2. рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрднрд░
  3. рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИ
  4. рдкреБрди: рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХрдореА
  5. рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рдирд┐рд░реНрдгрдп


рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдзрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:

  1. рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ ( рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ ) рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рд╣рдЯрд╛рдирд╛
  2. UITableViewDelegate рдФрд░ UITableViewDataSource рдкрд░ рдХрд╕реНрдЯрдо рдЖрд╡рд░рдг
  3. рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛
  4. рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмрдирд╛рдирд╛

рдкрд╣рд▓реЗ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдлрд┐рд░ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдпрд╣ рд╕рдм рд╣реБрдб рдХреЗ рддрд╣рдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдХрд╛рд░реНрдп рджреЛ рдкрд╛рда рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдЦрд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдПрдХ рдирд┐рдпрдорд┐рдд TextTableViewCell UILabel рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ред
рдЕрдЧрд▓рд╛, рдПрдХ рд╕реНрдерд┐рд░ рддрд╛рд▓рд┐рдХрд╛ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ UIViewController рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рдмрдирд╛рдПрдВ:

class ViewControllerConstructor: StaticConstructorContainer { typealias ModelType = <#type#> } 

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

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

 protocol Fonted { var font: UIFont? { get } } protocol FontedConfigurable { func configure(by model: Fonted) } protocol Titled { var title: String? { get } } protocol TitledConfigurable { func configure(by model: Titled) } protocol Subtitled { var subtitle: String? { get } } protocol SubtitledConfigurable { func configure(by model: Subtitled) } protocol Imaged { var image: UIImage? { get } } protocol ImagedConfigurable { func configure(by model: Imaged) } 

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

рд╣рдорд╛рд░рд╛ рд╕реЗрд▓ ( рдкрд╛рда рдХреЗ рд╕рд╛рде ) рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рдкрд╛рда рдХрд╛ рдлрд╝реЙрдиреНрдЯ, рдкрд╛рда рд╕реНрд╡рдпрдВ, рдкрд╛рда рдХрд╛ рд░рдВрдЧ, рд╕реЗрд▓ рдХрд╛ рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдорди рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ред

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

 enum CellModel: Titled { case firstText case emptyMiddle case secondText var title: String? { switch self { case .firstText: return " - " case .secondText: return " - " default: return nil } } } 

рдЪреВрдВрдХрд┐ рдордзреНрдп (рдЦрд╛рд▓реА рд╕реЗрд▓) рдореЗрдВ рдХреЛрдИ рд▓реЗрдмрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдордиреЗ C рд╕реЗрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

 class ViewControllerConstructor: StaticConstructorContainer { typealias ModelType = CellModel var models: [CellModel] //        ,    func cellType(for model: CellModel) -> Self.StaticTableViewCellClass.Type { //      ,    } func configure(cell: UITableViewCell, by model: CellModel) { //      ,   ,      } func itemSelected(item: CellModel) { //  didSelect,     } } 

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░рд╛ рд╕рднреА рдХреЛрдб рд╣реИред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рддреИрдпрд╛рд░ рд╣реИред рдЖрдЗрдП рдбреЗрдЯрд╛ рднрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

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

 extension TextTableViewCell: TitledConfigurable { func configure(by model: Titled) { label.text = model.title } } 

рднрд░рд╛ рд╣реБрдЖ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 class ViewControllerConstructor: StaticConstructorContainer { typealias ModelType = CellModel var models: [CellModel] = [.firstText, .emptyMiddle, .secondText] func cellType(for model: CellModel) -> StaticTableViewCellClass.Type { switch model { case .emptyMiddle: return EmptyTableViewCell.self case .firstText, .secondText: return TextTableViewCell.self } } func configure(cell: UITableViewCell, by model: CellModel) { cell.selectionStyle = .none } func itemSelected(item: CellModel) { switch item { case .emptyMiddle: print("  ") default: print("  ...") } } } 

рдмрд╣реБрдд рдХреЙрдореНрдкреИрдХреНрдЯ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рджрд░рдЕрд╕рд▓, рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рд╕рднреА рдХреЛ ViewController'e рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

 class ViewController: UIViewController { private let tableView: UITableView = { let tableView = UITableView() return tableView }() private let constructor = ViewControllerConstructor() private lazy var delegateDataSource = constructor.delegateDataSource() override func viewDidLoad() { super.viewDidLoad() constructor.setup(at: tableView, dataSource: delegateDataSource) } } 

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

рд╣рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдм рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдПрдВ рдФрд░ рд╕рдордЭреЗрдВ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ:

  1. рдпрджрд┐ рд╣рдо рдПрдХ рдирдпрд╛ рд╕реЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЪрд░ рдХреЛ рдмрджрд▓рдХрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд▓рдЪреАрд▓реА рдЯреЗрдмрд▓ рдкреНрд░рдгрд╛рд▓реА рд╣реИ
  2. рд╣рдо рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рдФрд░ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рдиред
  3. рд╣рдордиреЗ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рдХрд░ рджреА рд╣реИред рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рддрдм рднреА рдХрдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рд╕реНрдерд┐рд░ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛрдВред
  4. рд╣рдо UIViewController рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд╛рдП
  5. рд╣рдордиреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рдгреА рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрд░реНрдХ рдирд╣реАрдВ рдЯреВрдЯреЗрдЧрд╛ред

рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдбред

рдпрд╣ рдЕрдВрджрд░ рд╕реЗ рдмрд╛рд╣рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдкреВрд░рд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реА рдХрдХреНрд╖рд╛рдПрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред

рдЖрдЗрдП рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╣реА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ:
 protocol StaticConstructorContainer { associatedtype ModelType var models: [ModelType] { get } func cellType(for model: ModelType) -> StaticTableViewCellClass.Type func configure(cell: UITableViewCell, by model: ModelType) func itemSelected(item: ModelType) } 

рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред

рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ :

 extension StaticConstructorContainer { typealias StaticTableViewCellClass = StaticCell & NibLoadable func delegateDataSource() -> StaticDataSourceDelegate<Self> { return StaticDataSourceDelegate<Self>.init(container: self) } func setup<T: StaticConstructorContainer>(at tableView: UITableView, dataSource: StaticDataSourceDelegate<T>) { models.forEach { (model) in let type = cellType(for: model) tableView.register(type.nib, forCellReuseIdentifier: type.name) } tableView.delegate = dataSource tableView.dataSource = dataSource dataSource.tableView = tableView } } 

рд╕реЗрдЯрдЕрдк рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрдкрдиреЗ ViewController рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдерд╛, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд╕реМрдВрдкрддрд╛ рд╣реИ ред

рдФрд░ рдбреЗрд▓рд┐рдЧреЗрдЯрдбрд╛рдЯрд╛ рд╕реЛрд░реНрд╕ () рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ UITableViewDataSource рдФрд░ UITableViewDelegate рдмрдирд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:

 class StaticDataSourceDelegate<Container: StaticConstructorContainer>: NSObject, UITableViewDelegate, UITableViewDataSource { private let container: Container weak var tableView: UITableView? init(container: Container) { self.container = container } func reload() { tableView?.reloadData() } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { let type = container.cellType(for: container.models[indexPath.row]) return type.estimatedHeight ?? type.height } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let type = container.cellType(for: container.models[indexPath.row]) return type.height } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return container.models.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let model = container.models[indexPath.row] let type = container.cellType(for: model) let cell = tableView.dequeueReusableCell(withIdentifier: type.name, for: indexPath) if let typedCell = cell as? TitledConfigurable, let titled = model as? Titled { typedCell.configure(by: titled) } if let typedCell = cell as? SubtitledConfigurable, let subtitle = model as? Subtitled { typedCell.configure(by: subtitle) } if let typedCell = cell as? ImagedConfigurable, let imaged = model as? Imaged { typedCell.configure(by: imaged) } container.configure(cell: cell, by: model) return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let model = container.models[indexPath.row] container.itemSelected(item: model) } } 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдКрдБрдЪрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдлрд╝реЛрд░рдСрд░реЛрдЕрдЯ , рдирдореНрдмрд░рдСрдлрд░реНрд╕рдЗрдиреНрд╕реЗрдХреНрд╢рди , рдбреЗрдбрдЗрд▓реЗрдХреНрдЯреНрд░реЛрдЖрдЯ , рд╡реЗ рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╕реЗрд▓рдлреЛрд░рд░реЙрд╡ рд╣реИ ред

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

рдЗрд╕рд╕реЗ рддрд░реНрдХ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рддреГрддреАрдп-рдкрдХреНрд╖ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖ, рдЖрдк рдпрд╣рд╛рдВ рдкреВрд░рд╛ рдХреЛрдб рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

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

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


All Articles