根据 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
语句的情况下修改数组 a
和 b
吗?
你必须直接修改一个值类型,一个可能的解决方案是
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(引用类型)并使用该引用访问数组,而不是尝试直接引用数组(值类型)。
你还不是 "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)
}
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
语句的情况下修改数组 a
和 b
吗?
你必须直接修改一个值类型,一个可能的解决方案是
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(引用类型)并使用该引用访问数组,而不是尝试直接引用数组(值类型)。
你还不是 "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)
}