Swift: Kontrola dostępu

Opublikowano: 16.11.2023 - tagi: Swift Klasa Struktura Dostęp

Kontrola dostępu w Swift

Dzięki kontroli dostępu możesz określić dostępność klas, struktur, enumeracji, protokołach, właściwości, metod itp.

Swift udostępnia kilka poziomów dostępu.

Są to:

  1. open
  2. public
  3. private
  4. fileprivate
  5. internal

Dostęp: open

Poziom dostępu open pozwala na to, że każdy ma do tego dostęp: zarówno z poziomu modułu jak i z zewnątrz.

Dzięki temu możesz pozwolić sobie także na nadpisywanie.

Jest to najmniej restrykcyjnym poziomem dostępu w Swift.

Dostęp: public

Jeśli określisz coś jako public to znaczy, że informujesz, że każdy może mieć do tego dostęp.

Podobne do open, ale różnica między nimi jest taka, że masz do tego dostęp wszędzie, ale nie możesz sobie pozwolić na nadpisanie z poziomu innego modułu.

Na przykład:

class MyClass {
	public name: String = ""
}

var obj = MyClass()

obj.name = "Public"

print(obj.name) // Public

Dostęp: private

private sprawia, że dostęp jest ograniczony do danego zakresu.

class User {
	private firstName: String = ""
	private lastName: String = ""
	
	init(firstName: String, lastName: String) {
		self.firstName = firstName
		self.lastName = lastName
	}
	
	func getFullName() -> String {
		return "\(firstName) \(lastName)"
	}
}

var user = User(firstName: "Jan", lastName: "Kowalski")

print(user.getFullName())

user.firstName = "Adam" // Błąd!

Dostęp: fileprivate

Ten poziom dostępu podobny jest do private. Różnica jest taka, że dostęp jest ograniczony w obrębie pliku.

class User {
	fileprivate firstName: String = ""
	fileprivate lastName: String = ""
	
	init(firstName: String, lastName: String) {
		self.firstName = firstName
		self.lastName = lastName
	}
	
	func getFullName() -> String {
		return "\(firstName) \(lastName)"
	}
}

var user = User(firstName: "Jan", lastName: "Kowalski")

print(user.getFullName()) // Jan Kowalski

user.firstName = "Adam" 

print(user.getFullName()) // Adam Kowalski

Jeśli spróbujesz się dostać do firstName lub lastName w innym pliku, zostanie zgłoszony błąd.

Inny przykład:

fileprivate class MyClass {
	name: String = ""
}

Tak oznaczoną klasę: MyClass możesz używać tylko w pliku, w którym jest stworzona.

Dostęp: internal

internal to domyślny poziom dostępu w Swift.

Czyli zapis:

class MyClass {
	...
}

jest równoznaczny z:

internal class MyClass {
	...
}

A co to robi? W taki sposób informujemy, że kod jest dostępny w obrębie modułu, ale na zewnątrz już nie.