2017-09-15 2 views
1

Ich möchte sicher sein, dass jede Instanz des Objekts als Referenz verwendet wird. Instanziiert könnte es mehrere Male sein, sollte aber nicht kopiert werden.
F.e. in C++ ist es einfach zu tun:Wie kann man das Kopieren von Objekten in swift3 verbieten?

class A { 
public: 
    A(const A&) = delete; 
    A& operator = (const A&) = delete; 
}; 

Das ist. Natürlich könnte smbd versuchen, etwas in Erinnerung zu behalten - aber es ist nicht nützlich und nicht so einfach. Sie sollten das Speicherlayout Ihres Objekts und aller Felder, die es einkapselt, genau kennen. Ich will nicht smth special - nur gleichwertig mit dem Code oben in swift 3.

+0

Sie können das nicht sicherstellen. Selbst wenn Sie das Kopieren in das Objekt selbst mit Hilfe von Zeigern deaktivieren, können Sie auf dessen Speicheradresse zugreifen und deren Inhalt kopieren. Sie können nicht zulassen, dass Benutzer Ihres Codes auf den Speicher zugreifen. Ich schätze, Sie erstellen ein Framework und möchten einige Intervallvariablen davor schützen, missbraucht zu werden. Stellen Sie in diesem Fall mehr Kontext bereit, und möglicherweise kann Ihnen jemand eine Problemumgehung anbieten. Was Sie jedoch wünschen, ist nicht möglich. –

+0

@ DávidPásztor Ihr Raten ist zu kompliziert. Ich möchte nur das normale Kopieren für das Objekt deaktivieren. – denys

Antwort

1

In Swift, classes are reference types. Sie machen also schon, was Sie wollen: Sie können nur als Referenz gehalten werden. Sie befinden sich immer auf dem Heap, und die Zuweisungen dienen dazu, Referenzen zuzuordnen, nicht Klasseninhalte. Stellen Sie also sicher, dass Sie Ihr Objekt als class anstatt als struct deklarieren - im Gegensatz zu C++ besteht der Hauptunterschied zwischen den beiden in Swift aus Referenztyp und Werttyp.

+0

Meine Frage bezieht sich auf Objekte im Allgemeinen - nicht nur auf Klassen. Wir sollten das nicht für Klassen tun - wie macht man das für 'struct's? – denys

Verwandte Themen