我和斯威夫特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