我正在使用Swift 3。
我想要这个C语法:
int myVar;
int *pointer = &myVar;
因此,修改pointer
或myVar
会做同样的事情。
另外我不知道它是否有任何区别,但在我的情况下myVar
是一个包含类元素的数组,而pointer
是指向该数组的一个元素的指针。
答案 0 :(得分: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)
默认情况下,作为赋值语句的一部分,不会复制对象。如果它是一个结构,那将是不同的。
为完整性添加一点:
如果你想要用标量值代替对象的类似效果,Swift提供各种类型的包装器。
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)
(警告:除了在操场上试验外,我没有使用这些包装纸。如果不做一些研究,不要相信它。)
答案 1 :(得分:1)
与@Phillip相同。但是我使用了struct。在此示例中,行[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
答案 2 :(得分:1)
&
也存在于Swift中,但只能用作参数列表的一部分(例如init,func,closure)。
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)