Использование массива логических значений для выбора конкретных индексов для преобразования - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь использовать массив логических значений в качестве механизма для преобразования определенных индексов в другой массив Ints одинакового размера, игнорируя при этом индексы, содержащие ложь в соответствующем массиве выбора.

По сути, я хочу, чтобы эта функция преобразовывала только те значения, которые содержат '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   
}

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете достичь того же результата с zip() и map():

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
}
...