Junior
Jaka jest różnica między strukturami a klasami w Swift?
sobes.tech AI
Odpowiedź od AI
Główne różnice:
- Typ wartości vs. Typ referencyjny: Struktury są typami wartości, klasy są typami referencyjnymi. Przypisanie struktury lub przekazanie jej do funkcji kopiuje wartość. Przypisanie klasy lub przekazanie jej do funkcji kopiuje odniesienie do bloku pamięci.
- Dziedziczenie: Struktury nie obsługują dziedziczenia. Klasy obsługują dziedziczenie, umożliwiając tworzenie hierarchii obiektów.
- Deinitializatory: Struktury nie mają deinitializatorów. Klasy mogą mieć
deinitdo zwalniania zasobów. - Równość tożsamości: Dla struktur porównuje się wartość wszystkich ich właściwości (domyślnie za pomocą
==). Dla klas==domyślnie porównuje odniesienia (tożsamość). - Wydajność: Struktury są zwykle bardziej wydajne przy pracy z małymi ilościami danych, ponieważ nie używają dynamicznej alokacji na stercie i nie mają dodatkowych kosztów związanych z liczeniem odniesień (ARC).
| Kryterium | Struktura (Struct) | Klasa (Class) |
|---|---|---|
| Typ | Wartości (Value Type) | Odniesienia (Reference Type) |
| Dziedziczenie | Nie | Tak |
| Deinitializatory | Nie | Tak (deinit) |
| Równość tożsamości | Porównanie po wartości | Porównanie po odniesieniu |
| Lokalizacja | Zazwyczaj na stosie (dla zmiennych lokalnych) | Na stercie |
| ARC | Nie | Tak |
Wybór między strukturą a klasą zależy od potrzeb. Struktury są dobre do modelowania danych, dla których ważne jest przekazywanie po wartości (np. współrzędne, rozmiar). Klasy są używane, gdy potrzebne jest dziedziczenie, wspólne zmienne odniesienie do obiektu lub zarządzanie cyklem życia zasobów.
// Przykład struktury
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 jest kopią p1
p2.x = 5.0
// p1.x nadal 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Przykład klasy
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Instancja Circle jest usuwana.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 odnosi się do tej samej instancji co c1
c2.radius = 10.0
// c1.radius również staje się 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Porównanie tożsamości
if c1 === c2 { // Porównuje odniesienia
print("c1 i c2 odnoszą się do tej samej instancji Circle.")
} else {
print("c1 i c2 nie odnoszą się do tej samej instancji Circle.")
}
// Porównanie wartości (dla struktur)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Porównuje wszystkie właściwości
print("p1 i p3 mają tę samą wartość.")
} else {
print("p1 i p3 nie mają tej samej wartości.")
}