SwiftUI рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдкрдирд╛рдирд╛ред рднрд╛рдЧ 1

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

SwiftUI рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╣реИ, рдЬреЛ рдПрдкреНрдкрд▓ рдиреЗ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдШреЛрд╖рдгрд╛ рдХреА WWDC 2019 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдмрд╣реБрдд рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рд╣реИ, рдЗрд╕рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рддреЗрдЬ рдФрд░ рд╕реБрдВрджрд░ рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред



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

рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд┐рд░реНрдл рдПрдХ рдкрд░рд┐рдЪрдп рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ, рдирд┐рдореНрди рднрд╛рдЧреЛрдВ рдкрд░ рдЬрд╛рдПрдВ:
рднрд╛рдЧ 2 (UIKit рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ)
рднрд╛рдЧ 3 (рдпрд╣рд╛рдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ)
рднрд╛рдЧ 4 (рдпрд╣рд╛рдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ)

рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рдорд┐рд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░реБрдХреЗрдВ рдХреБрдЫ рдорд┐рдирдЯ)

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

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

struct NewsListView: View{
    @State var data: [NewsItemMock]
    
    var body: some View {
        NavigationView{
        List(data) { item in
            NavigationLink(destination:NewsItemView(item:item)) {
            NewsItemRow(data: item)
            }
        }
    }
}

SwiftUI, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдмрд┐рд▓реНрдбрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдШреЛрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ ViewBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрдВрддреНрд░ рд╕реНрд╡рд┐рдлреНрдЯ 5.1 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдФрд░ рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдХреНрд▓реЛрдЬрд░-рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореВрд▓ рд╡рд╕реНрддреБред ViewBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрд▓рд╛рдЗрдб рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ AddSubview рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрджрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХреНрд░рдо рдореЗрдВ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм SwiftUI рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдореВрд▓ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:


          VStack {
            HStack {
                VStack(alignment: .leading,spacing: 10) {
                    HeaderText(text: data.title ?? "")
                    SubheaderText(text: data.description ?? "")
                    SmallText(text: data.publishedAt?
                                   .formatToString("dd.MM.yyyy") ?? "")
                }
               ThumbImage(withURL: data.urlToImage ?? "")
             }

3 рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдФрд░ рдПрдХ рдЫрд╡рд┐ рдХреЗ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд:


рд╣рд╛рд▓рд╛рдВрдХрд┐ SwiftUI рдПрдХ UIViewController рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ UIHostingController рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рджреГрд╢реНрдп рдкрд╛рд░рд┐рдд рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирдИ рддрдХрдиреАрдХ UIKit рдкрд░ рдПрдХ рдРрдб-рдСрди рд╣реИ:


@available(iOS 13.0, tvOS 13.0, *)
open class UIHostingController<Content> : UIViewController where Content : View {

    public var rootView: Content

    public init(rootView: Content)


рд╡реИрд╕реЗ, рд╕рднреА SwiftUI рдирд┐рдпрдВрддреНрд░рдг UIKit рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, VStack, HStack рдХреНрд░рдорд╢рдГ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ UIStackView рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╣реИрдВред рд╕реВрдЪреА рдпреВрдЖрдИрдЯреЗрдмрд▓ рд╡реНрдпреВ рд╣реИ, рдЯреЗрдХреНрд╕реНрдЯ рдпреВрдмрд┐рд▓рдм рд╣реИ, рдмрдЯрди рдпреВрдЖрдИрдмреЗрдЯрди рд╣реИ, рдЗрдореЗрдЬ рдпреВрдЖрдИрдЖрдИрдПрдордЬреЗрдЬ рд╣реИ, рдЖрджрд┐ред

рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЙрдкрд▓рдмреНрдз рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрддреНрд╡реЛрдВ рдХреЛ рдХреБрдЫ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде UIStackView рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рдЕрдВрджрд░ рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреГрд╢реНрдп рднрд╛рдЧ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП UI рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рддрдВрддреНрд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рд╕реНрд╡рд┐рдлреНрдЯ рдпреВрдЖрдИ рдПрдХ рдЧреИрд░-рдШрдЯрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдврд╛рдВрдЪрд╛ рд╣реИред рдЙрдиред рдЗрд╕рдореЗрдВ рджреЗрдЦреЗрдВ рдХреБрдЫ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рди рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдоред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реАрдзреЗ UI рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ, рдЖрдк рд╕реАрдзреЗ рдЗрд╕ рдпрд╛ рдЙрд╕ рджреГрд╢реНрдп рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝ рдпрд╛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧреБрдг рдпрд╛ рд░рд╛рдЬреНрдп рдЪрд░ рдЬреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдкреНрд░реЙрдкрд░реНрдЯреА рд░реИрдкрд░ (рдкреНрд░реЙрдкрд░реНрдЯреА рд░реИрдкрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпреВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ ред



рдореБрдЦреНрдп рдкреНрд░рдпреБрдХреНрдд рд╕рдВрдкрддреНрддрд┐ рдЖрд╡рд░рдг рд╣реИрдВ:

1редрд░рд╛рдЬреНрдп - рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред


struct NewsItemRow: View {
    @State var title: String
    @State var  description: String
    @State var dateFormatted: String 
    @State var imageUrl: String 
    
    var body: some View {
        VStack {
            HStack {
                VStack(alignment: .leading,spacing: 10) {
                    HeaderText(text: title)
                    SubheaderText(text: description)
                    SmallText(text: dateFormatted)
                }
              ThumbImage(withURL: imageUrl)
            }
         }
     }

2. @ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ - рдХрдордЬреЛрд░ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдорд╛рди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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


struct FirstView: View {
    @State var isPresented: Bool = true
    
    var body: some View {
        NavigationView {
            NavigationLink(destination:
            SecondView(isPresented: self.$isPresented)) {
                Text("Some")
            }
        }
    }
}

struct SecondView: View {
    @Binding var isPresented: Bool
    
    var body: some View {
        Button("Dismiss") {
            self.$isPresented = false
        }
    }
}

3. @EnvironmentObject - рджреГрд╢реНрдп

4 рдХреЗ рдмреАрдЪ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ ред @ObjectBinding, @ObservableObject - рд╕рдВрдпреЛрдЬрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


class NewsItemModel: ObservableObject,IModel {
   @Published var title: String
   @Published var  description: String
   @Published var dateFormatted: String 
   @Published var imageUrl: String 
}

рд╣рдо рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

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

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


struct NewsItemView: View {
@State var isFavorite: Bool 
....

рд╣рдо рдмрдЯрди рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЯреНрд░рд┐рдЧрд░ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ:

struct NewsItemView: View{
    @State var isFavorite: Bool 
   
    var body: some View {
    NavigationView {
    VStack {
        Text("Some content")
       }
    }
     .navigationBarItems(trailing: Button(action: {
            self.isFavorite = !self.isFavorite
        }){
            Image(self.isFavorite ? "favorite" : "unfavorite")
           .frame(width: 20, height: 20, alignment: .topTrailing)
        })
   }
        

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:



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

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?

рдкреВрд░реА рддрд░рд╣ рд╕реЗ Xib рдФрд░ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рд╕реЗ рдмрдВрдзреЗ рдмрд┐рдирд╛ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рд╕реЗ рд╕рд░рд▓ UI рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

рдФрд░ рдХреБрдЫ рдФрд░ рдХреЗ рд▓рд┐рдП, рдирд╣реАрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдорд╛рдирдХ UIKit UISearchView, UICollectionView, рдФрд░ рддреАрд╕рд░реЗ-рднрд╛рдЧ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

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

рддреЛ, рдЖрдкрдХреЛ рдорд╛рдирдХ iOS рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдХреГрдкрдпрд╛ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

All Articles