根据 swift 中的条件浅复制 array/modify 数组

Shallow copy an array/modify arrays based on condition in swift

var a=[0,0,0,0]
var b=[0,0,0,0]
for i in 0..<4{
    var g=i%2==0 ? a:b
    g[i]+=1
    //10 more lines of code about array g
}

我想实现类似每当 i 为偶数时将 A 的 i 位置递增 1,如果 i 为奇数则将 B 的 i 位置递增 1。 预期结果是 A=[1,0,1,0] 和 B 是 [0,1,0,1]

这里修改数组g不会影响原数组,因为是深拷贝。有什么方法可以在不使用 if...else 语句的情况下修改数组 ab 吗?

你必须直接修改一个值类型,一个可能的解决方案是

var a = [0,0,0,0]
var b = [0,0,0,0]

for i in 0..<4 {
    i.isMultiple(of: 2) ? (a[i] += 1) : (b[i] += 1)
}

另一种解决方案是使用 class(引用类型)包装器

class Wrapper {
    var array = [0,0,0,0]
}

let a = Wrapper()
let b = Wrapper()

for i in 0..<4 {
    let g = i.isMultiple(of: 2) ? a : b
    g.array[i] += 1
}

print(a.array)
print(b.array)
var a=[0,0,0,0]
var b=[0,0,0,0]
for i in 0..<4{
    i%2==0 ? (a[i] += 1) : (b[i] += 1)
}

print(a)
print(b)

结果 A=[1,0,1,0] B = [0,1,0,1]

您可以使用带有 inout 参数的函数:

func modify(g: inout [Int], index: Int) {
    g[index] += 1
    // 10 more lines of code about array g
}
var a = [0,0,0,0]
var b = [0,0,0,0]
for i in 0..<4 {
    if i.isMultiple(of: 2) {
        modify(g: &a, index: i)
    } else {
        modify(g: &b, index: i)
    }
}
print(a)
print(b)

您还可以将数组放入 class(引用类型)并使用该引用访问数组,而不是尝试直接引用数组(值类型)。

See inout documentation here

Some info on value vs reference types

你还不是 "thinking value type"。对于那些,复制、修改并重新分配。

var array: [Int] { .init(repeating: 0, count: 4) }
let (a, b) = array.indices.reduce( into: (array, array) ) { arrays, index in
  let indexIsEven = index.isMultiple(of: 2)

  // Copy
  var array = indexIsEven ? arrays.0 : arrays.1

  // Modify
  array[index] = 1

  // Reassign
  indexIsEven
    ? (arrays.0 = array)
    : (arrays.1 = array)
}