- Published on
SwiftUI-da Custom Model yaratish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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] | |
|---|---|---|
| Saqlash | Faqat bitta qiymat | Ko'p xususiyat |
| Kengaytirish | Qiyin | Yangi let qo'shish yetarli |
| ForEach | id: \.self kerak | Identifiable bilan avtomatik |
| Haqiqiy ilovada ishlatish | Kam holatlarda | Doim β 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!