如何在Swift中创建指针?

时间:2017-09-13 18:45:58

标签: swift pointers variables

我正在使用Swift 3。

我想要这个C语法:

int myVar;
int *pointer = &myVar;

因此,修改pointermyVar会做同样的事情。 另外我不知道它是否有任何区别,但在我的情况下myVar是一个包含类元素的数组,而pointer是指向该数组的一个元素的指针。

3 个答案:

答案 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)