我和斯威夫特3.如何在Swift中創建指針?
工作,我想有這樣的C語法:
int myVar;
int *pointer = &myVar;
所以修改pointer
或myVar
做同樣的事是完全相同。 另外我不知道它是否有任何區別,但在我的情況下,myVar
是一個包含一個類的元素的數組,pointer
是一個指向這個數組的一個元素的指針。
我和斯威夫特3.如何在Swift中創建指針?
工作,我想有這樣的C語法:
int myVar;
int *pointer = &myVar;
所以修改pointer
或myVar
做同樣的事是完全相同。 另外我不知道它是否有任何區別,但在我的情況下,myVar
是一個包含一個類的元素的數組,pointer
是一個指向這個數組的一個元素的指針。
(假設我明白你在問什麼....)
在操場上試試下面的代碼。它應該打印「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)
(警告:我沒有用過這些包裝以外在操場嘗試任何事情,不要沒有做一些研究,相信它。)
好的,我在這裏錯過了一些東西。我以爲我的代碼不起作用,因爲這個語法不正確,但我在操場上試過了你的代碼,它工作正常,所以我的代碼也可以工作,我必須在其他地方出錯。現在爲什麼這與一個類而不是變量一起工作?例如'var myVar = 5','var otherVar = myVar'和'otherVar = 5'不會改變'myVar'的值? – Drakalex
區別在於對象是通過指針引用的。所以,就我而言,我有一個實際對象和三個包含指向它的值的變量。在你的'myVar'範例中,你正在改變實際的變量內容;沒有他們都提到的獨立對象。 (這與我輸入'let selectedRow = Row()'相同,並期望它的變化會反映在'testRow'中。人們有時試過,但它永遠不會起作用:)) –
我很確定它應該是'.allocate(容量:1)'。 Doc參數:_分配的內存量,以「Pointee」爲例計算._ – nyg
同樣的例子@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
的&
也存在於夫特而只能用作參數列表的一部分(例如初始化,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)
[如何斯威夫特做 「深複製」?](https://stackoverflow.com/questions/24754559/how-to-do-deep-copy-in-swift) –
有可能的複製你試過了嗎? 'var selectedRow = rows [0]'不按你想要的做什麼? (根據你的描述,在我看來,你根本不需要拷貝,只是一個共享指針。) –
它創建'rows [0]'的副本,但這兩個變量是不同的,當我修改'selectedRow '它根本不影響'rows [0]'。是的,我想要一個共享指針。 – Drakalex