Published on

Swiftda Access Control

Authors

Swiftda kirish nazorati classlar, structlar, enumlar, propertylar, metodlar, initializerlar va subscriptlarning qayerdan ko'rinishini (visibility) belgilash uchun ishlatiladi. Masalan,

class Vehicle {

  public func method1() {...}
  private func method2() {...}
}

Bu yerda:

  • method1() β€” public, ya'ni boshqa classlar tomonidan murojaat qilinishi mumkin
  • method2() β€” private, ya'ni boshqa classlar tomonidan murojaat qilinishi mumkin emas

public va private kalit so'zlariga e'tibor bering. Bular Swiftdagi kirish nazorati hisoblanadi.

Access Control turlari

Swiftda to'rtta kirish nazorati mavjud:

NazoratTa'rif
publice'lonlar hamma joydan murojaat qilinishi mumkin
privatee'lonlar faqat e'lon qilingan class yoki struct ichidan murojaat qilinishi mumkin
fileprivatee'lonlar faqat joriy swift fayli ichidan murojaat qilinishi mumkin
internale'lonlar faqat e'lon qilingan modul ichidan murojaat qilinishi mumkin (standart)

public Access Control

Swiftda metodlar, propertylar, classlar va hokazo public deb e'lon qilinganda, ularga istalgan joydan murojaat qilishimiz mumkin.

public access modifikatori hech qanday ko'lam chekloviga ega emas. Masalan,

class Animal {

  // public property
  public var legCount: Int = 0     // oyoqlar soni

  // public metod
  public func display() {
    print("Men hayvonman.")
    print("Jami oyoqlar:", legCount)
  }
}

// obyekt yaratish
var obj = Animal()

// public propertyga murojaat va qiymat berish
obj.legCount = 4

// public metodga murojaat
obj.display()

Natija:

Men hayvonman.
Jami oyoqlar: 4

Yuqoridagi misolda ikkita public ma'lumot a'zosi bilan Animal nomli class yaratdik: legCount va display().

Keyin Animal classining obj nomli obyektini yaratdik. Keyin obj.legCount va obj.display() kodlari yordamida to'g'ridan-to'g'ri public ma'lumot a'zolariga murojaat qildik.

private Access Control

Tur a'zosini private deb e'lon qilganimizda, unga faqat bir xil class yoki struct ichidan murojaat qilish mumkin. Masalan,

class Student {

  // private property
  private var name = "Tim Cook"     // ism

  // private metod    
  private func display() {
    print("Student classidan salom")
  }
}

// Student classidan obyekt yaratish
var student1 = Student()
    
// name propertyga murojaat
print("Ism:", student1.name)

// display() metodiga murojaat 
student1.display()

Yuqoridagi misolda name propertysi va display() metodi bilan Student nomli class yaratdik. Quyidagi qatorlarga e'tibor bering:

// name propertyga murojaat
print("Ism:", student1.name)

// display() metodiga murojaat
student1.display()

name va display() private deb belgilangani uchun ularga Student tashqarisidan murojaat qila olmaymiz. Bu yerda kod quyidagi xatolarni beradi:

error: 'name' is inaccessible due to 'private' protection level
error: 'display' is inaccessible due to 'private' protection level

fileprivate Access Control

Tur a'zosini fileprivate deb e'lon qilganimizda, unga faqat e'lon qilingan manba fayli ichidan murojaat qilish mumkin. Masalan,

class Student {

  // fileprivate property
  fileprivate var name = "Tim Cook"     // ism

  // fileprivate metod    
  fileprivate func display() {
    print("Student classidan salom")
  }
}

// Student classidan obyekt yaratish
var student1 = Student()
    
// name propertyga murojaat
print("Ism:", student1.name)

// display metodiga murojaat 
student1.display()

Natija:

Ism: Tim Cook
Student classidan salom

Yuqoridagi misolda Student classi ichida fileprivate ma'lumot a'zolari name va display() ni yaratdik.

name va display() fileprivate deb belgilangani uchun bu ma'lumot a'zolariga ular e'lon qilingan manba faylidagi istalgan joydan murojaat qilish mumkin.

Agar boshqa Swift fayl yaratib, fileprivate ma'lumot a'zolariga murojaat qilishga harakat qilsak, xato olamiz.

internal Access Control

Tur yoki tur a'zosini internal deb e'lon qilganimizda, unga faqat bir xil modul ichidan murojaat qilish mumkin.

Modul β€” bu turlar (classlar, protocollar va hokazo) va resurslar (ma'lumotlar) to'plami. Ular birgalikda ishlash uchun yaratilgan va funksionallikning mantiqiy birligini tashkil qiladi.

Misol:

class Student {

  // internal property e'lon qilish
  internal var name = "Tim Cook"     // ism
}

// Student classidan obyekt yaratish
var student1 = Student()
  
// name propertyga murojaat
print("Ism:", student1.name)

Natija:

Ism: Tim Cook

Yuqoridagi misolda name propertysi bilan Student nomli class yaratdik. name internal bo'lgani uchun uni class tashqarisidan ham murojaat qila olamiz, chunki ular bir xil modulda.

Agar internal dan bitta modul ichida foydalansak, u xuddi public access modifikatori kabi ishlaydi.

Eslatma:

  • Agar boshqa modul yaratib, internal ma'lumot a'zolariga murojaat qilishga harakat qilsak, xato olamiz.