2017-09-13 2 views
1

Ich arbeite mit Swift 3.Wie erstellt man einen Zeiger in Swift?

würde Ich mag diese C-Syntax haben:

int myVar; 
int *pointer = &myVar; 

So modifizieren pointer oder myVar tut das gleiche genau die gleiche Sache. Auch ich weiß nicht, ob es einen Unterschied macht, aber in meinem Fall myVar ist ein Array mit Elementen einer Klasse und pointer ist ein Zeiger auf ein Element dieses Arrays.

+0

Mögliches Duplikat [How "Deep Copy" in Swift zu tun?] (Https://stackoverflow.com/questions/24754559/how-to-do-deep-copy-in-swift) –

+0

Have du hast es versucht? Wie funktioniert 'var selectedRow = rows [0]' nicht was du willst? (Aus Ihrer Beschreibung scheint mir, dass Sie überhaupt keine Kopie wollen, nur einen gemeinsamen Zeiger.) –

+0

Er erstellt eine Kopie von 'rows [0]' aber die zwei Variablen sind unterschiedlich, wenn ich 'selectedRow 'modifiziere 'Es betrifft 'rows [0]' überhaupt nicht. Und ja, ich möchte einen geteilten Zeiger. – Drakalex

Antwort

2

(Unter der Annahme, ich verstehe, was Sie für Fragen ....)

den folgenden Code auf einem Spielplatz Versuchen. Es sollte dreimal "99" gedruckt werden.

class Row { 
    var rowNumber = 0 
} 

var rows = [Row]() 

let testRow = Row() 
testRow.rowNumber = 1 

rows.append(testRow) 

let selectedRow = rows[0] 
selectedRow.rowNumber = 99 

print(testRow.rowNumber) 
print(selectedRow.rowNumber) 
print(rows[0].rowNumber) 

Standardmäßig werden Objekte nicht als Teil einer Zuweisungsanweisung kopiert. Wenn es eine Struktur wäre, wäre das anders.


ein wenig auf Vollständigkeit Hinzufügen:

Wenn Sie einen ähnlichen Effekt mit skalaren Werten anstelle von Objekten wollen, liefert Swift verschiedene Arten von Wrapper.

let intPointer = UnsafeMutablePointer<Int>.allocate(capacity: 8) // Should be 1, not 8 according to comment re: docs 
let other = intPointer 
other.pointee = 34 

print(intPointer.pointee) 

(Warnung: Ich habe nicht diese Wrapper für alles außer Experimentieren auf einem Spielplatz verwendet Traue es nicht ohne einige der Forschung..)

+0

Okay, mir fehlt hier etwas. Ich dachte, dass mein Code nicht funktionierte, weil diese Syntax nicht korrekt war, aber ich habe deinen Code auf einem Spielplatz ausprobiert und es funktioniert gut, also funktioniert mein Code auch, ich muss irgendwo anders etwas falsch machen. Nun, warum funktioniert das mit einer Klasse, aber nicht mit Variablen? zum Beispiel 'var myVar = 5',' var otherVar = myVar' und 'otherVar = 5' ändern nicht den' myVar' Wert? – Drakalex

+1

Der Unterschied besteht darin, dass Objekte durch Zeiger referenziert werden. In meinem Fall habe ich also ein tatsächliches Objekt und drei Variablen, die den einen Wert enthalten, der darauf hinweist. In Ihrem 'myVar' Beispiel ändern Sie den tatsächlichen Variableninhalt; Es gibt kein unabhängiges Objekt, auf das beide Bezug nehmen. (Es wäre das gleiche wie ich tippe 'let selectedRow = Row()' und erwarte, dass seine Änderungen in 'testRow' reflektiert werden. Leute versuchen das manchmal, aber es funktioniert nie. :)) –

+0

Ich bin mir ziemlich sicher, dass es sollte be '.allocate (Kapazität: 1)'. Doc für den Parameter: _Die Menge an Speicher zuzuordnen, in Instanzen von 'Poinnee' gezählt. _ – nyg

1

gleiche Beispiel wie @Phillip. Aber ich habe struct benutzt. In diesem Beispiel Reihen [0] wird sich nicht ändern:

struct Row { 
    var rowNumber = 0 
} 

var rows = [Row]() 

var testRow = Row() 
testRow.rowNumber = 1 

rows.append(testRow) 

var selectedRow = rows[0] 
selectedRow.rowNumber = 99 

print(testRow.rowNumber) // prints 1 
print(selectedRow.rowNumber) // prints 99 
print(rows[0].rowNumber) // prints 1 
0

Die & existiert auch in Swift, sondern nur als Teil einer Parameterliste verwendet werden (z init, func, Verschluss).

var i = 5 
let ptr = UnsafeMutablePointer(&i) 
print(ptr.pointee) // 5 

// or 
let ptr = UnsafeMutablePointer<Int>.allocate(capacity: 1) 
ptr.initialize(to: 5) 

// or with a closure 
let ptr: UnsafePointer = { $0 }(&i) 
Verwandte Themen