Z książki Apple „Jedną z najważniejszych różnic między strukturami i klasami jest to, że struktury są zawsze kopiowane, gdy są przekazywane w kodzie, ale klasy są przekazywane przez odniesienie”.
Czy ktoś może mi pomóc zrozumieć, co to znaczy? Dla mnie klasy i struktury wydają się takie same.
void my_func(int a)
vsvoid my_func(int &a)
. To bardzo podstawowe pytanie dotyczące programowania. Czytaj więcej: stackoverflow.com/questions/373419/…Odpowiedzi:
Oto przykład z
class
. Zwróć uwagę, jak po zmianie nazwy instancja, do której odwołują się obie zmienne, jest aktualizowana.Bob
jest terazSue
wszędzie, doBob
której kiedykolwiek się odwoływano.Teraz
struct
widzimy, że wartości są kopiowane, a każda zmienna zachowuje swój własny zestaw wartości. Kiedy ustawimy nazwę naSue
,Bob
struktura waStruct
nie ulegnie zmianie.A więc do reprezentowania stanowej złożonej jednostki, a
class
jest niesamowite. Ale w przypadku wartości, które są po prostu pomiarem lub kawałkami powiązanych danych,struct
sensowniej jest, aby można je było łatwo kopiować i obliczać z nimi lub modyfikować wartości bez obawy o skutki uboczne.źródło
aStruct and bStruct are two structs with the same value!
myli mnie to, ponieważ wartości zmiennych wewnątrz struktury są różne.aStruct
ibStruct
mają identyczne wartości. Oba mają jednoname
pole, które jest ustawione"Bob"
. Ale są to dwie różne struktury. Jest to udowodnione w następnym wierszu, gdy możesz zmienić nazwę jednej z struktur, a druga pozostaje niezmieniona.Zarówno klasa, jak i struktura mogą:
Tylko klasa może wykonać:
źródło
struct
są typami wartości. Oznacza to, że jeśli skopiujesz instancję struktury do innej zmiennej, zostanie ona po prostu skopiowana do zmiennej.Przykład typu wartości
Klasy są typami referencyjnymi. Oznacza to, że jeśli przypiszesz instancję klasy do zmiennej, będzie ona zawierać tylko odwołanie do instancji, a nie do kopii .
źródło
Powyższe odpowiedzi są prawidłowe Mam nadzieję, że moja odpowiedź pomoże komuś, kto nie rozumie powyższych odpowiedzi.
Dobrze w Szybkim Są dwa rodzaje obiektów
Główną różnicą między nimi jest
Na przykład tutaj kod, aby dobrze zrozumieć.
To była główna różnica, ale mamy również różnice podrzędne.
Klasa
Struct
źródło
To pytanie wydaje się być zduplikowane, ale niezależnie od tego, odpowiedź na większość przypadków użycia:
Jedną z najważniejszych różnic między strukturami i klasami jest to, że struktury są typami wartości i zawsze są kopiowane, gdy są przekazywane w kodzie, a klasy są typem referencyjnym i są przekazywane przez referencję.
Ponadto klasy mają dziedziczenie, które pozwala jednej klasie na dziedziczenie właściwości innej.
Właściwości konstrukcji są przechowywane na stosie, a instancje klasy są przechowywane na stercie, dlatego czasami stos jest znacznie szybszy niż klasa.
Struct automatycznie inicjuje domyślny inicjator, podczas gdy w Class musimy inicjalizować.
Konstrukcja jest bezpieczna dla wątków lub singleton w dowolnym momencie.
Ponadto, aby podsumować różnicę między strukturami i klasami, konieczne jest zrozumienie różnicy między wartościami a typami referencyjnymi.
// sampleplayground.playground
Wynik:
źródło
Jeśli spojrzysz dalej w podręczniku Apple, zobaczysz tę sekcję: „Struktury i wyliczenia są typami wartości”
W tej sekcji zobaczysz to:
Jest to największa różnica między strukturami a klasami. Struktury są kopiowane, a klasy są przywoływane.
źródło
Zwykle (w większości języków programowania) obiekty to bloki danych, które są przechowywane na stercie, a następnie odwołanie (zwykle wskaźnik) do tych bloków zawiera znak a,
name
aby uzyskać dostęp do tych bloków danych. Ten mechanizm umożliwia współdzielenie obiektów na stercie poprzez kopiowanie wartości ich referencji (wskaźników). Nie dotyczy to podstawowych typów danych, takich jak liczby całkowite, a to dlatego, że pamięć potrzebna do utworzenia odwołania jest prawie taka sama jak obiekt (w tym przypadku wartość całkowita). Dlatego będą przekazywane jako wartości, a nie jako odniesienie w przypadku dużych obiektów.Swift używa struct, aby poprawić wydajność nawet w przypadku obiektów String i Array.
Naprawdę dobra lektura tutaj
źródło
Aby zrozumieć różnicę między Strukturami a Klasami, musimy znać główną różnicę między wartościami a typami odniesienia. Struktury są typami wartości, co oznacza, że każda zmiana na nich po prostu zmodyfikuje tę wartość, Klasy są typami referencyjnymi, a każda zmiana w typie referencyjnym zmodyfikuje wartość przydzieloną w tym miejscu pamięci lub referencji. Na przykład:
Zacznijmy od klasy, ta klasa jest zgodna z Equatable tylko po to, aby móc porównywać instancje, tworzymy instancję o nazwie,
pointClassInstanceA
a inną o nazwiepointClassInstanceB
przypisujemy klasę A do klasy B, teraz twierdzenie mówi, że są takie same ...Ok, co się tutaj stało, dlaczego po prostu zmieniliśmy wartość x pointClassInstanceB, zmieniła się również wartość x pointClassInstanceA? pokazuje to, jak działają typy referencji, kiedy przypisujemy instancję A, jako wartość instancji B, a następnie modyfikujemy X jednego z nich, zmieni to oba X, ponieważ dzielą to samo odwołanie, a to, co się zmieniło, była wartością tego odniesienie.
Zróbmy to samo, ale ze strukturą
Mamy zasadniczo taką samą strukturę jak nasza klasa, ale teraz widać, że po wydrukowaniu wartości x pointStructInstanceA w tym przypadku nie uległa ona zmianie, a to dlatego, że typy wartości działają inaczej i każda zmiana w jednym z ich wystąpień będzie „ niezależne ”i nie wpłynie na innych.
Swift sugeruje użycie większej liczby typów wartości i można powiedzieć, że ich biblioteki są oparte na strukturach, aby uniknąć problemów związanych z typami odwołań, takich jak niezamierzona modyfikacja wartości itp. Struktury są sposobem na przejście do Swift. Mam nadzieję, że to pomoże.
źródło
Oto przykład, który dokładnie pokazuje różnicę między strukturą a klasą.
zrzut ekranu napisanego kodu na placu zabaw
źródło
źródło
Szybkie typy
Typ wartości :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
nowa kopia danych. W rzeczywistości mechanizmcopy on write
-COW
jest używany z pewnymi optymalizacjami, na przykład kopia jest tworzona podczas modyfikowania obiektuOznaczenie typu :
Class
,Function
reference type
Value type
zaleca się używać domyślnie . Największą zaletąValue type
jest to, że zwykle sąthread safe
Reference type
Plusy:deinit()
może być użyty,===
,Objective-C
interoperacyjność, ponieważValue Type
została wprowadzona w Swift.[Więcej o zmienność]
Wybór między strukturami i klas
Rodzaje
klas i struktur
źródło
Już dużo jest o tym napisane, chciałbym tam dodać analogię. Mam nadzieję, że po tym nigdy nie będziesz mieć wątpliwości: Podsumowanie: klasy są przekazywane przez referencję, podczas gdy struktury są przekazywane przez wartość.
Załóżmy, że udostępniasz arkusz dokumentu google znajomemu. Teraz, jeśli on coś w tym zmieni, zobaczysz również, że zmiany w twoim dokumencie Google, oznaczają, że twoja kopia również ma wpływ. Zasadniczo jest to „ przekazywane przez odniesienie ”.
Ale załóżmy, że jeśli masz plik .XLS zapisany w twoim komputerze. Dostarczasz ten plik swojemu znajomemu. Teraz, jeśli dokona jakiejkolwiek zmiany w tym pliku, twój plik nie zostanie pomieszany / zmieniony, ponieważ masz własną kopię. To w zasadzie „ przekazane przez wartość ”. Masz już wiele prostych programów, aby sprawdzić tę analogię na szybkich placach zabaw.
źródło