Published on

Swift-da Sort, Filter va Map β€” massiv ma'lumotlarini boshqarish

Authors

Ma'lumotlarni ilovaga yuklagandan keyin, ularni to'g'ridan-to'g'ri ekranda ko'rsatmasdan avval β€” tartiblash, filtrlash yoki boshqa turga o'zgartirish juda keng tarqalgan amaliyot. Bu videoda uchta asosiy usul ko'rib chiqiladi: sorted, filter va map.


Model va ViewModel

struct UserModel: Identifiable {
    let id: String = UUID().uuidString
    let name: String
    let points: Int
    let isVerified: Bool
}

class ArrayModificationViewModel: ObservableObject {

    @Published var dataArray: [UserModel] = []
    @Published var filteredArray: [UserModel] = []
    @Published var mappedArray: [String] = []

    init() {
        getUsers()
        updateFilteredArray()
    }

    func getUsers() {
        let users: [UserModel] = [
            UserModel(name: "Nick",    points: 5,   isVerified: true),
            UserModel(name: "Chris",   points: 0,   isVerified: false),
            UserModel(name: "Joe",     points: 20,  isVerified: true),
            UserModel(name: "Emily",   points: 50,  isVerified: false),
            UserModel(name: "Amanda",  points: 100, isVerified: true),
            UserModel(name: "Lisa",    points: 35,  isVerified: false),
            UserModel(name: "Tom",     points: 75,  isVerified: true),
            UserModel(name: "Sara",    points: 10,  isVerified: false),
            UserModel(name: "Mark",    points: 60,  isVerified: true),
            UserModel(name: "Jessica", points: 45,  isVerified: true),
        ]
        self.dataArray.append(contentsOf: users)
    }

    func updateFilteredArray() {
        // ...
    }
}

1. sorted() β€” tartiblash

// To'liq yozuv β€” boshlovchilar uchun tushunarli
filteredArray = dataArray.sorted { user1, user2 in
    return user1.points > user2.points
    // user1 user2 dan ko'p ball bo'lsa β€” user1 oldinga chiqadi
    // Natija: 100 β†’ 75 β†’ 60 β†’ 50 ... (yuqoridan pastga)
}

// Qisqartma yozuv β€” tajribali dasturchilar ko'proq shu usulni ishlatadi
filteredArray = dataArray.sorted { $0.points > $1.points }
// $0 β€” birinchi element, $1 β€” ikkinchi element
// Natija xuddi shu: eng ko'p balldan eng kamagacha

// Teskari tartib β€” eng kamdan eng ko'pga
filteredArray = dataArray.sorted { $0.points < $1.points }

2. filter() β€” filtrlash

// Faqat tasdiqlangan foydalanuvchilar
filteredArray = dataArray.filter { user in
    return user.isVerified
}

// Qisqartma yozuv
filteredArray = dataArray.filter { $0.isVerified }

// Tasdiqlangan emaslari
filteredArray = dataArray.filter { !$0.isVerified }

// 50 dan ko'p ball bo'lganlar
filteredArray = dataArray.filter { $0.points > 50 }

// 50 dan kam ball bo'lganlar
filteredArray = dataArray.filter { $0.points < 50 }

// Ismida "i" harfi bo'lganlar (kichik-katta harfga sezgir)
filteredArray = dataArray.filter { $0.name.contains("i") }
// Nick, Chris, Emily, Lisa β€” mos keladi

3. map() β€” turni o'zgartirish

map() β€” massivdagi har bir elementni boshqa turga aylantiradi. Masalan, [UserModel] massivini [String] massiviga o'zgartirish:

// To'liq yozuv
mappedArray = dataArray.map { user in
    return user.name
}

// Qisqartma yozuv
mappedArray = dataArray.map { $0.name }

// Natija: ["Nick", "Chris", "Joe", ...]

Map qachon kerak bo'ladi?

  • Ma'lumotlar bazasidan kelgan ma'lumot UserModel formatida emas, uni konvertatsiya qilish kerak
  • Bir xil ekrannn turli model turlari uchun qayta ishlatish β€” foydalanuvchilar uchun ham, kitoblar uchun ham ismlar ro'yxati ko'rsatish

4. compactMap() β€” optional bilan xavfsiz ishlash

Agar model xususiyati optional bo'lsa va nil qiymatlarni o'tkazib yuborish kerak bo'lsa:

struct UserModel: Identifiable {
    let id: String = UUID().uuidString
    let name: String?  // optional β€” ba'zi foydalanuvchilar ism kiritmagan
    let points: Int
    let isVerified: Bool
}

// Oddiy map β€” nil bo'lsa majburiy qiymat berish kerak
mappedArray = dataArray.map { user in
    return user.name ?? "Noma'lum"  // nil bo'lsa "Noma'lum" yoziladi
}

// compactMap β€” nil bo'lsa o'tkazib yuboradi, massivga qo'shilmaydi
mappedArray = dataArray.compactMap { $0.name }
// 10 foydalanuvchidan 2 tasi nil bo'lsa β†’ 8 ta nom qaytariladi

compactMap β€” optional xususiyatlarni ishlashda nil elementlarni avtomatik o'tkazib yuboradi.


Zanjirlab birlashtirish

Eng kuchli imkoniyat β€” uchala amalni ketma-ket birlashtirish:

// Alohida-alohida (tushunarliroq)
let sorted = dataArray.sorted { $0.points > $1.points }
let filtered = sorted.filter { $0.isVerified }
let mapped = filtered.compactMap { $0.name }
mappedArray = mapped

// Zanjirlab β€” professional kod
mappedArray = dataArray
    .sorted { $0.points > $1.points }   // 1. Eng ko'p balldan tartibla
    .filter { $0.isVerified }            // 2. Faqat tasdiqlanganlari
    .compactMap { $0.name }              // 3. Faqat ismlarni qaytarish

Natija: tasdiqlangan foydalanuvchilarning ismlari, eng ko'p balldan kamiga qarab tartiblangan.


Qisqartma yozuv tushuntirishi

// $0 β€” closure-ga uzatilgan birinchi argument
// $1 β€” closure-ga uzatilgan ikkinchi argument

// sorted uchun:
.sorted { $0.points > $1.points }
// $0 = user1, $1 = user2 β€” ikkala element taqqoslanadi

// filter uchun:
.filter { $0.isVerified }
// $0 = har bir element β€” shartga mos kelganlar qoldiriladi

// map/compactMap uchun:
.map { $0.name }
// $0 = har bir element β€” o'sha elementdan qiymat qaytariladi

Xulosa

AmalVazifasiNatija turi
sorted { }Massivni tartiblaydiBir xil tur
filter { }Shartga mos elementlarBir xil tur, kamroq element
map { }Turni o'zgartiradiBoshqa tur, teng element soni
compactMap { }Turni o'zgartiradi, nil o'tkazadiBoshqa tur, kamroq element

Bu uchta amal real ilovalarda deyarli har doim ishlatiladi. Ma'lumotlar bazasidan kelgan xom ma'lumotlarni ekranda ko'rsatishga tayyor holga keltirish uchun zarur vositalar.

Buy mea coffee