Published on

Swift-da Access Control β€” Private va Public

Authors

Agar siz shu yerga yetib kelgan bo'lsangiz β€” endi tashlamang! Kursning eng qiyin qismi ortda qoldi. Optional-lar, struct-lar, class-lar β€” bularning hammasi Swift dasturlashning asosi, va siz ularni o'tdingiz. Bundan keyingi videolar osonroq va qiziqarliroq bo'ladi, chunki biz ekranlar yaratishni boshlaymiz.

Bu videoda Access Control β€” ya'ni kirish darajalarini ko'rib chiqamiz. O'tgan videolarda private kalit so'zini bir necha marta ishlatdim, lekin uni to'liq tushuntirmadim. Keling, endi batafsil o'rganaylik.


Access Control nima va nima uchun kerak?

Oddiy qilib aytganda, Access Control β€” bu ma'lumotlarga kim kirishi va kim o'zgartirishi mumkinligini boshqarish.

Yolg'iz loyihada ishlayotganda bu unchalik muhim ko'rinmaydi β€” siz ilovangizda nima bo'layotganini o'zingiz bilasiz. Lekin tajriba oshgan sari va loyihalar kattalashgan sari bu juda muhim bo'lib qoladi.

Tajribali dasturchi biror narsa private yoki public deb belgilanganda, u darhol shu ma'lumot qanday yangilanishi mumkinligini tushunadi. Kodni o'qish, ko'rib chiqish yoki xatolarni topishda bu juda katta yordam beradi.

Asosiy qoida: Imkon qadar hamma narsani iloji boricha private qiling.


Misol uchun model yaratish

enum MovieGenre {
    case comedy
    case action
    case horror
}

struct MovieModel {
    let title: String
    let genre: MovieGenre
    let isFavorite: Bool

    func updateFavoriteStatus(newValue: Bool) -> MovieModel {
        return MovieModel(
            title: title,
            genre: genre,
            isFavorite: newValue
        )
    }

    mutating func updateStatus(to newValue: Bool) {
        // mutating versiya
    }
}

Bu yerda:

  • MovieGenre β€” enum, chunki barcha janrlarni kodni yozayotganda bilamiz
  • MovieModel β€” struct, chunki bu sof ma'lumot modeli
  • MovieManager β€” class, chunki u ma'lumotlarni boshqaradi va o'zgartiradi

Uch xil kirish darajasi

class MovieManager {

    // 1. Public (ochiq) β€” belgilanmagan, lekin public hisoblanadi
    var movie1 = MovieModel(title: "Avatar", genre: .action, isFavorite: false)

    // 2. Private (yopiq) β€” class ichidan ham o'qib, ham o'zgartiriladi
    private var movie2 = MovieModel(title: "Step Brothers", genre: .comedy, isFavorite: false)

    // 3. Private(set) β€” tashqaridan o'qish mumkin, lekin faqat class ichidan o'zgartiriladi
    private(set) var movie3 = MovieModel(title: "Avengers", genre: .action, isFavorite: false)

    func updateMovie3(isFavorite: Bool) {
        movie3 = movie3.updateFavoriteStatus(newValue: isFavorite)
    }
}

Har bir darajaning farqi

let manager = MovieManager()

// --- 1. PUBLIC ---
// Tashqaridan ham o'qish, ham o'zgartirish mumkin
let someValue = manager.movie1                                   // βœ… o'qish
manager.movie1 = manager.movie1.updateFavoriteStatus(newValue: true) // βœ… o'zgartirish
// Lekin bu "juda ochiq" β€” yaxshi amaliyot emas

// --- 2. PRIVATE ---
// Tashqaridan na o'qish, na o'zgartirish mumkin
let value2 = manager.movie2       // ❌ xato β€” tashqaridan o'qib bo'lmaydi
manager.movie2 = ...              // ❌ xato β€” tashqaridan o'zgartirib bo'lmaydi
// Faqat class ichidagi funksiyalar orqali ishlatiladi

// --- 3. PRIVATE(SET) β€” eng yaxshi amaliyot ---
// Tashqaridan o'qish mumkin, o'zgartirish mumkin emas
let value3 = manager.movie3       // βœ… o'qish β€” ishlaydi
manager.movie3 = ...              // ❌ xato β€” tashqaridan o'zgartirib bo'lmaydi
manager.updateMovie3(isFavorite: true) // βœ… funksiya orqali o'zgartirish β€” ishlaydi

Nega private(set) eng yaxshi amaliyot?

private(set) ishlatganda:

  • Ma'lumotni tashqaridan o'qish mumkin β€” bu ko'pincha kerak
  • Ma'lumotni faqat class ichidan o'zgartirish mumkin β€” bu xavfsizlik
  • Class o'z ichidagi ma'lumotlarni o'zi boshqaradi β€” bu clean code

Tasavvur qiling, ilovangizda 50 ta fayl bor. Agar movie3 private(set) bo'lsa, uni faqat MovieManager ichida o'zgartirilishini bilasiz β€” 50 ta faylni tekshirmasdan. Bu kodni o'qishni va xatolarni topishni nihoyatda osonlashtiradi.


Struct ichida ham xuddi shunday

struct MovieModel {
    let title: String
    let genre: MovieGenre
    private(set) var isFavorite: Bool

    // Tashqaridan o'zgartirish uchun funksiya
    mutating func updateFavoriteStatus(newValue: Bool) {
        isFavorite = newValue
    }
}

Swift-da barcha kirish darajalar

Hozircha eng ko'p ishlatiladigan uchta bilish yetarli:

DarajaMa'nosi
(belgilanmagan)Public ga teng β€” hamma joydan o'qib va o'zgartirib bo'ladi
privateFaqat shu class/struct ichida ishlaydi
private(set)Tashqaridan o'qish mumkin, o'zgartirish β€” faqat ichidan

Boshqa darajalar ham bor β€” open, internal, fileprivate β€” lekin ular asosan o'z framework-ingizni yozayotganda kerak bo'ladi. Hozircha ularga vaqt sarflamasangiz ham bo'ladi.


Xulosa va asosiy qoida

// Yomon amaliyot β€” hamma narsa ochiq
var movie1 = MovieModel(...)

// Yaxshi amaliyot β€” faqat kerak bo'lganda ochiq
private(set) var movie3 = MovieModel(...)

// Qoida: iloji boricha hamma narsani private qiling
// Bu kodingizni o'qishni va xatolarni topishni osonlashtiradi

Kod yozishda private belgilashni odat qilib oling. Bu nafaqat yaxshi uslub, balki professional dasturchilarning asosiy talabi.

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

Buy mea coffee