2017-09-13 73 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)