рд╣рдо SwiftUI рдореЗрдВ рджреЗрдЦреЗрдВ, рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП

рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдПрдХ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рд╡реНрдпреВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╣рдо рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд HomeView рд╣реИ, рдЬреЛ рдПрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ ProfileView , рдЕрдЧрд░ LogInManager рд╣реИ loggedInUser ред рд╣рдо рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рдХрдерди:

struct HomeView: View {
    @ObservedObject var loginManager: LoginManager

    var body: some View {
        VStack {
            if let user = loginManager.loggedInUser {
                ProfileView(user: user)
            }

            ...
        }
    }
}

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

рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдмрд┐рд▓реНрдбрд░реЛрдВ , рд╣рдо рдПрдХ HStack рдпрд╛ VStack рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордирдорд╛рдирд╛ рдХреЛрдб рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рд╣рдо рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдХрд▓реЗрдВрдЧреЗ?

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

struct ProfileView: View {
    var user: User?

    var body: some View {
        guard let user = user else {
            // We have to use 'AnyView' to perform type erasure here,
            // in order to give our 'body' a single return type:
            return AnyView(EmptyView())
        }

        return AnyView(VStack {
            Text(user.name)
            ...
        })
    }
}

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

struct HomeView: View {
    @ObservedObject var loginManager: LoginManager

    var body: some View {
        VStack {
            loginManager.loggedInUser.map { user in
                ProfileView(user: user)
            }
            ...
        }
    }
}

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

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

рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдЕрдирд╡реИрдк рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ @ViewBilder рдЯреИрдЧ рдмрдВрдж рд╣реИ:

struct Unwrap<Value, Content: View>: View {
    private let value: Value?
    private let contentProvider: (Value) -> Content

    init(_ value: Value?,
         @ViewBuilder content: @escaping (Value) -> Content) {
        self.value = value
        self.contentProvider = content
    }

    var body: some View {
        value.map(contentProvider)
    }
}

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

struct HomeView: View {
    @ObservedObject var loginManager: LoginManager

    var body: some View {
        VStack {
            Unwrap(loginManager.loggedInUser) { user in
                HStack {
                    Text("Logged in as:")
                    ProfileView(user: user)
                }
            }
            ...
        }
    }
} 

All Articles