Published on

Maxsus komponentlar va qayta ishlatiladigan viewlar

Authors

Bir xil SwiftUI kodni uch yoki undan ko'p joyga nusxalaganingizni sezsangiz — uni qayta ishlatiladigan komponentga chiqarish vaqti keldi. Bu uch qoidasi: uch joyda bir pattern — standartlashtirishga arziydi.

LEGO g'ishtini tasavvur qiling. G'isht final modelda qayerda bo'lishini bilmaydi — faqat o'z shakli va rangini biladi. Buni qo'yganda tafsilotlarni belgilaysiz. Parameterized SwiftUI komponenti xuddi shunday ishlaydi.

Swift
StatCard.swift
import SwiftUI // Qayta ishlatiladigan stat karti — istalgan joyda ishlatiladigan struct StatCard: View { // Xususiyatlar komponentni call site da sozlash imkonini beradi let title: String let value: String let icon: String var accentColor: Color = .blue // Standart qiymat — ixtiyoriy var body: some View { VStack(alignment: .leading, spacing: 8) { // Injeksiya qilingan symbol nomi va rang bilan ikonka qatori Label(title, systemImage: icon) .font(.caption) .foregroundStyle(accentColor) // Asosiy qiymat, yaqqol ko'rsatilgan Text(value) .font(.title2.bold()) .foregroundStyle(.primary) } .padding() .background(.regularMaterial) .clipShape(RoundedRectangle(cornerRadius: 12)) } } // Komponentdan foydalanish — har xil ma'lumot, bir xil vizual tuzilma struct DashboardView: View { var body: some View { HStack { StatCard(title: "Qadam", value: "8,421", icon: "figure.walk", accentColor: .green) StatCard(title: "Kaloriya", value: "542", icon: "flame.fill", accentColor: .orange) StatCard(title: "Uyqu", value: "7s 20d", icon: "moon.fill", accentColor: .indigo) } .padding() } }
QatorVazifasi
struct StatCard: ViewYangi SwiftUI ko'rinish e'lon qiladi — Stage 1 dan beri bir xil pattern, farqi qayta ishlatish uchun mo'ljallangan.
let title: StringMajburiy xususiyat — StatCard yaratuvchi sarlavha uzatishi shart. Swift buni kompilyatsiyada tekshiradi.
var accentColor: Color = .blueStandart qiymatli ixtiyoriy xususiyat. Rang uzatilmasa ko'k ishlatiladi — call site ni toza saqlaydi.
.background(.regularMaterial)Muzli shisha effekti — yorug' va qorong'u rejimga avtomatik moslashadi. Qo'shimcha ish kerak emas.

Komponent patternlari

// @ViewBuilder — chaqiruvchiga istalgan ko'rinishni uzatish imkoni
struct CardContainer<Content: View>: View {
    let content: Content

    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }

    var body: some View {
        content
        .padding()
        .background(.regularMaterial)
        .clipShape(RoundedRectangle(cornerRadius: 12))
    }
}

// Foydalanish — istalgan ko'rinish qavs ichiga
CardContainer {
    Text("Bu yerga istalgan narsa")
}
CardContainer {
    VStack {
        Image(systemName: "star.fill")
        Text("Sevimli")
    }
}
// Custom ViewModifier — modifikatorlar to'plamini birlashtirish
struct PrimaryButtonStyle: ViewModifier {
    func body(content: Content) -> some View {
        content
        .font(.headline)
        .foregroundStyle(.white)
        .padding(.horizontal, 24)
        .padding(.vertical, 12)
        .background(.blue)
        .clipShape(Capsule())
    }
}

// Extension — o'rnatilgan modifier sintaksida chaqirish
extension View {
    func primaryButton() -> some View {
        modifier(PrimaryButtonStyle())
    }
}

// Foydalanish — har qanday ko'rinishga
Button("Saqlash") { }
.primaryButton()

Text("Belgilash")
.primaryButton()

Tezkor ma'lumotnoma

PatternIshlatish holati
struct MeningKarti: ViewBir xil UI pattern ≥3 joyda — parametrlashtiring
@ViewBuilder contentChaqiruvchi istalgan ko'rinishni uzatishi kerak
ViewModifier protokoliModifikatorlar to'plamini birlashtirish
extension View { func ... }Modifier ni o'rnatilgan kabi chaqirish
Xcode → Extract SubviewKo'rinishni avtomatik struct ga ajratadi

🎯 Topshiriq: qayta ishlatiladigan karta komponenti

Uch xususiyatli — title: String, subtitle: String, icon: StringInfoCard komponenti yarating. Kamida uch joyda har xil ma'lumot bilan ishlating. Keyin PrimaryButtonStyle ViewModifier yarating va uni uch xil tugmaga qo'llang. Dizaynni bir joyda o'zgartiring — hamma joyda yangilanishini tasdiqlang.

Buy mea coffee