Published on

Swiftda Access Control

Authors

Bilimingizni sinab ko'ring!

20 ta savol Β· ~20 daqiqa

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,

Swift
public Access Control
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 let obj = Animal() // public propertyga murojaat va qiymat berish obj.legCount = 4 // public metodga murojaat obj.display()

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,

Swift
fileprivate Access Control
class Student { // fileprivate property fileprivate var name = "Tim Cook" // ism // fileprivate metod fileprivate func display() { print("Student classidan salom") } } // Student classidan obyekt yaratish let student1 = Student() // name propertyga murojaat print("Ism:", student1.name) // display metodiga murojaat student1.display()

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:

Swift
internal Access Control
class Student { // internal property e'lon qilish internal var name = "Tim Cook" // ism } // Student classidan obyekt yaratish let student1 = Student() // name propertyga murojaat print("Ism:", student1.name)

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.
Buy mea coffee