我正在尝试使用布尔数组作为转换另一个相同大小的Ints数组中的特定索引的机制,而忽略了对应选择数组中包含false的索引。
基本上,我希望此函数仅转换在对应的布尔选择数组中包含“ true”的值,而将其他值保留为原来的值。
这是我设法使用for循环使其工作的一种方式。
但是,我想知道如何以更实用的方式进行此操作。我也很容易被告知这绝对是愚蠢的,我应该尝试另一种方式。使用zip函数在每次递归中创建元组都取得了一些成功,但是我想看看专家是如何做到的。
我想看看是否有可能使用地图代替像这里一样的for循环。
func changeSelectedChannels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [UInt8] {
var j = 0
var newArray = oldArray
for index in selections{
if index == true{
newArray[j] = newVal
j += 1
}else{
j += 1
}
}
return newArray
}
答案 0 :(得分:1)
func changeSelectedChannels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [UInt8] {
let newArray = zip(oldArray, selections).map {
(oldVal, flag) in flag ? newVal : oldVal
}
return newArray
}
闭包被所有对调用(oldArray
中的一个元素和selections
中的相应元素),并返回旧数组值或newVal
。
另一种可能的解决方案是使用enumerated()
摆脱j
索引变量:
func changeSelectedChannels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [UInt8] {
var newArray = oldArray
for (idx, flag) in selections.enumerated() where flag {
newArray[idx] = newVal
}
return newArray
}