2017-09-13 72 views
1

我和斯威夫特3.如何在Swift中創建指針?

工作,我想有這樣的C語法:

int myVar; 
int *pointer = &myVar; 

所以修改pointermyVar做同樣的事是完全相同。 另外我不知道它是否有任何區別,但在我的情況下,myVar是一個包含一個類的元素的數組,pointer是一個指向這個數組的一個元素的指針。

+0

[如何斯威夫特做 「深複製」?](https://stackoverflow.com/questions/24754559/how-to-do-deep-copy-in-swift) –

+0

有可能的複製你試過了嗎? 'var selectedRow = rows [0]'不按你想要的做什麼? (根據你的描述,在我看來,你根本不需要拷貝,只是一個共享指針。) –

+0

它創建'rows [0]'的副本,但這兩個變量是不同的,當我修改'selectedRow '它根本不影響'rows [0]'。是的,我想要一個共享指針。 – Drakalex

回答

2

(假設我明白你在問什麼....)

在操場上試試下面的代碼。它應該打印「99」三次。

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) 

默認情況下,有沒有對象的拷貝作爲賦值語句的一部分。如果它是一個結構,那就會有所不同。


加一點的完整性:

如果你想與標值而不是對象類似的效果,雨燕提供各類包裝的。

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) 

(警告:我沒有用過這些包裝以外在操場嘗試任何事情,不要沒有做一些研究,相信它。)

+0

好的,我在這裏錯過了一些東西。我以爲我的代碼不起作用,因爲這個語法不正確,但我在操場上試過了你的代碼,它工作正常,所以我的代碼也可以工作,我必須在其他地方出錯。現在爲什麼這與一個類而不是變量一起工作?例如'var myVar = 5','var otherVar = myVar'和'otherVar = 5'不會改變'myVar'的值? – Drakalex

+1

區別在於對象是通過指針引用的。所以,就我而言,我有一個實際對象和三個包含指向它的值的變量。在你的'myVar'範例中,你正在改變實際的變量內容;沒有他們都提到的獨立對象。 (這與我輸入'let selectedRow = Row()'相同,並期望它的變化會反映在'testRow'中。人們有時試過,但它永遠不會起作用:)) –

+0

我很確定它應該是'.allocate(容量:1)'。 Doc參數:_分配的內存量,以「Pointee」爲例計算._ – nyg

1

同樣的例子@Phillip。但我用結構。在該示例中的行[0]將不會改變:

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

&也存在於夫特而只能用作參數列表的一部分(例如初始化,FUNC,閉合)。

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)