【发布时间】:2016-04-24 04:30:51
【问题描述】:
我来自 C# 世界,习惯于将数组作为引用类型。据我了解,在 swift 数组中是值类型,但它们试图作为参考类型。
我实际上不知道如何问我需要什么(我认为当我需要知道答案才能提出问题时就是这种情况),但在 C# 中我会说我需要存储对内部的引用将锯齿状数组的数组转换为局部变量。
考虑以下代码:
// a function to change row values in-place
func processRow(inout row : [Int], _ value : Int)
{
for col in 0..<row.count
{
row[col] = value;
}
}
// a function to change matrix values in-place
func processMatrix(inout matrix : [[Int]])
{
for rowIdx in 0..<matrix.count
{
// (1) Works with array in-place
processRow(&(matrix[rowIdx]), -1)
// (2) Creates local copy
var r = matrix[rowIdx]; // <--- What to write here to not make a copy but still have this local variable?
processRow(&r, -2);
}
}
var matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
processMatrix(&matrix)
print(matrix) // outputs [[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]
这里是 Swift 沙盒 http://swiftlang.ng.bluemix.net/#/repl/8608824e18317e19b32113e1aa08deeb4ec5ab96ed8cdbe1dbfb4e753e87d528
在这里我想就地处理多维数组,这样我就不会创建数组的副本或数组的一部分。
在选项 (1) 中,我将所有内容更改为“-1”,它可以工作,但为此使用了附加功能。
在选项(2)中,我尝试使用局部变量来存储matrix[rowIdx],但它实际上创建了内部数组的副本——这不是我想要的;使用此变量会更改数组的副本,而不是原始的。
我怎样才能获得类似于选项 (1) 的结果,但使用局部变量而不是函数?即如何获取内部数组的引用并将其放入局部变量中?
我会理解回答“这是不可能的”,但我希望这样的答案伴随着一些 Apple 参考。
【问题讨论】:
标签: c# arrays swift jagged-arrays mutability