我有这段代码,它运行良好并且完全符合我的要求:
if condition1 {
array1 += [array1[i-n]]
} else {
array1 += [Int (arc4random_uniform(7))]
if array1[i] >= array1[i-n] {
array1[i] += 1
}
} //same logic, different condition and array
if condition2 {
array2 += [array2[i-n]]
} else {
array2 += [Int (arc4random_uniform(7))]
if array2[i] >= array2[i-n] {
array2[i] += 1
}
}
但我做了两次完全相同的事情,只是条件和数组不同。如何避免重复逻辑?我尝试将其打包为两个元组的数组:
[ (condition1, array1) , (condition2, array2) ]
我把它放在一个 for 循环中:
for tuple in [ (condition1, array1) , (condition2, array2) ] {
var (condition, array) = tuple
if condition {
array += [array[i-n]]
} else {
array += [Int (arc4random_uniform(7))]
if array[i] >= array[i-n] {
array[i] += 1
}
}
}
并且编译了,但似乎数组被复制了,换句话说,改变“array”并没有影响“array1”或“array2”。我尝试过使用 tuple.0 和 tuple.1 表示法的其他变体,但无法编译。所以我尝试使用 NSArrays 而不是原生 Swift 数组……但我不知道如何以正确的方式做到这一点,无论如何我认为必须有更简单的方法来做到这一点。
是否有一种简洁的方式来重述我的原始代码以避免重复逻辑?
最佳答案
curry 吧!
func func1(var a: [Int]) -> [Int] {
a += [a[i-n]]
return a
}
func func2(var a: [Int]) -> [Int] {
a+= [Int (arc4random_uniform(7))]
if a[i] >= a[i-n] {
a[i] += 1
}
return a
}
func function(condition: Bool) -> [Int] -> [Int] {
switch condition {
case true:
return func1
case false:
return func2
}
}
array1 = function(condition1)(array1)
array2 = function(condition2)(array2)
(andyvn22 提到的相同的 inout
东西也可以在这里应用。)
关于arrays - 不确定如何避免在此处重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27905240/