Приведите [UInt8] к параметру структуры в другом массиве - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу, чтобы моя функция установила все «выбранные» уровни var «channel» аналогично тому, как это делается в функции «setLevel».В идеале было бы здорово встроить это прямо в мою функцию map / zip, так как функции в любом случае являются гражданами первого класса.

public struct Channel {
    public var level: UInt8 = 0
    public var isEnabled: Bool = false
    public var isSelected: Bool = false

    public init() {}
}

public final class Universe {
    var channels = [Channel](repeating: Channel(), count: 512)

    public func setLevel(_ level: UInt8, forChannel index: Int){
        channels[index].level = level
    }

    public func setLevels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [Channel] {
        let newArray = zip(oldArray, selections).map {
            (oldVal, flag) in flag ? newVal : oldVal

        }
        return channels[index].level = newArray //here’s where I’m stuck
    }
}

1 Ответ

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

Вы можете сделать еще один почтовый индекс с channels и newArray:

public func setLevels(_ newVal: UInt8, forChannels selections: [Bool], array oldArray: [UInt8]) -> [Channel] {
    let newArray = zip(oldArray, selections).map {
        (oldVal, flag) in flag ? newVal : oldVal

    }
    return zip(channels, newArray).map { $0.0.withLevel($0.1) }
}

, где withLevel - это метод в Channel:

public func withLevel(_ level: UInt8) -> Channel {
    var copy = self
    copy.level = level
    return copy
}
...