Published on

SwiftUI-da Custom Model yaratish

Authors

Bu videoda biz Custom Model β€” ya'ni o'zimizning ma'lumot turini yaratishni o'rganamiz. Shu paytgacha faqat String, Bool, Int kabi oddiy turlarni ishlatdik. Lekin haqiqiy ilovalarda har bir ma'lumot nuqtasida ko'proq axborot bo'ladi β€” faqat ism emas, balki username, followers soni, verified holati va boshqalar.


Muammo β€” oddiy String yetarli emas

// Hozircha shunday qilganmiz
@State var users: [String] = ["Nick", "Emily", "Samantha", "Chris"]

// Lekin aslida har bir foydalanuvchining:
// - display name
// - username
// - followers soni
// - verified holati
// va boshqa ma'lumotlari ham bor
// Bularni String massiviga siqib bo'lmaydi

Custom Model yaratish

Struct yordamida o'zimizning ma'lumot turini yaratamiz. MVVM arxitekturasida bunday turlar Model deb ataladi:

struct UserModel: Identifiable {
    let id: String = UUID().uuidString  // avtomatik noyob ID
    let displayName: String
    let userName: String
    let followerCount: Int
    let isVerified: Bool
}

Identifiable β€” bu protokol. Uni qo'llash uchun modelga id xususiyati kerak. Identifiable qo'llanilganda ForEach loop-da id: parametrsiz ishlash mumkin.

UUID().uuidString β€” har safar yangi noyob ID yaratadi. Ma'lumotlar bazasidan yuklaganda esa o'sha yerdan kelgan ID ishlatiladi.


Model massivi yaratish

@State var users: [UserModel] = [
    UserModel(
        displayName: "Nick",
        userName: "nick123",
        followerCount: 100,
        isVerified: true
    ),
    UserModel(
        displayName: "Emily",
        userName: "itsemily1995",
        followerCount: 55,
        isVerified: false
    ),
    UserModel(
        displayName: "Samantha",
        userName: "ninja_sam",
        followerCount: 350,
        isVerified: false
    ),
    UserModel(
        displayName: "Chris",
        userName: "chrish2009",
        followerCount: 88,
        isVerified: true
    ),
]

ForEach ichida modeldan foydalanish

Identifiable protokoli bo'lgani uchun ForEach id: parametrisiz ishlaydi:

// Identifiable bo'lmagan model β€” id kerak
ForEach(users, id: \.id) { user in ... }

// Identifiable bo'lgan model β€” id shart emas
ForEach(users) { user in
    Text(user.displayName)
    Text(user.userName)
    Text("\(user.followerCount)")
}

To'liq misol β€” foydalanuvchilar ro'yxati

struct ModelBootcamp: View {

    @State var users: [UserModel] = [
        UserModel(displayName: "Nick",     userName: "nick123",      followerCount: 100, isVerified: true),
        UserModel(displayName: "Emily",    userName: "itsemily1995", followerCount: 55,  isVerified: false),
        UserModel(displayName: "Samantha", userName: "ninja_sam",    followerCount: 350, isVerified: false),
        UserModel(displayName: "Chris",    userName: "chrish2009",   followerCount: 88,  isVerified: true),
    ]

    var body: some View {
        NavigationView {
            List {
                ForEach(users) { user in
                    HStack(spacing: 15) {
                        // Profil rasmi o'rniga doira
                        Circle()
                            .frame(width: 35, height: 35)

                        // Ism va username
                        VStack(alignment: .leading) {
                            Text(user.displayName)
                                .font(.headline)

                            Text("@\(user.userName)")
                                .foregroundColor(.gray)
                                .font(.caption)
                        }

                        Spacer()

                        // Verified belgisi
                        if user.isVerified {
                            Image(systemName: "checkmark.seal.fill")
                                .foregroundColor(.blue)
                        }

                        // Followers soni
                        VStack {
                            Text("\(user.followerCount)")
                                .font(.headline)

                            Text("followers")
                                .foregroundColor(.gray)
                                .font(.caption)
                        }
                    }
                    .padding(.vertical, 10)
                }
            }
            .listStyle(InsetGroupedListStyle())
            .navigationTitle("Foydalanuvchilar")
        }
    }
}

Identifiable protokoli β€” tushuntirish

// Identifiable qo'llanilmagan holat
struct UserModel {
    let displayName: String
}

// ForEach-da id ko'rsatish shart
ForEach(users, id: \.displayName) { user in ... }

// βœ… Identifiable qo'llanilgan holat
struct UserModel: Identifiable {
    let id: String = UUID().uuidString
    let displayName: String
}

// ForEach-da id shart emas β€” toza va qulay
ForEach(users) { user in ... }

String massivi vs Custom Model

[String][UserModel]
SaqlashFaqat bitta qiymatKo'p xususiyat
KengaytirishQiyinYangi let qo'shish yetarli
ForEachid: \.self kerakIdentifiable bilan avtomatik
Haqiqiy ilovada ishlatishKam holatlardaDoim β€” users, posts, products...

Xulosa

Haqiqiy ilovalarda deyarli har doim custom model kerak:

// Foydalanuvchilar
struct UserModel: Identifiable { ... }

// Postlar
struct PostModel: Identifiable { ... }

// Mahsulotlar
struct ProductModel: Identifiable { ... }

Model yaratish juda oson β€” Struct + Identifiable + UUID. Keyingi videolarda bu modellarni MVVM arxitekturasi bilan birga yanada kuchliroq ishlatishni o'rganamiz.

Rahmat, men Nick, bu Swiftful Thinking va keyingi videoda ko'rishguncha!

Buy mea coffee