Выполнить операцию ИЛИ для всех элементов в массиве - PullRequest
0 голосов
/ 20 января 2019

Я хочу расширить массивы перечислений: числовые с помощью функции OR (), которая ORs для всех элементов в массиве.

Это то, что я придумал:

extension Array where Element: RawRepresentable, Element.RawValue: Numeric {

    func OR(_: Array) -> Element.RawValue {
        return self.map{ $0.rawValue }.reduce(0x00000000){ $0|$1 }
    }

}

и этоэто ошибка, выдаваемая компилятором:

Невозможно вызвать 'Reduce' со списком аргументов типа '(Int, (_, _) -> _)'

Я хочу использовать его в таких ситуациях, как:

    enum RendererFlags: CUnsignedInt {

    case software =      0x00000001    // The renderer is a software fallback
    case accelerated =   0x00000002    // The renderer uses hardware acceleration
    case presentVSync =  0x00000004    // Present is synchronized with the refresh rate
    case targetTexture = 0x00000008    // The renderer supports rendering to texture

}

или перечисление с другими числовыми значениями rawValues, а затем

let flags = [.software, .accelerated]OR()

Где моя ошибка?Почему компилятору это не нравится?

1 Ответ

0 голосов
/ 20 января 2019

Numeric недостаточно для ваших нужд, вам нужно BinaryInteger:

extension Array where Element: RawRepresentable, Element.RawValue: BinaryInteger {
    func OR() -> Element.RawValue {
        return self.map{ $0.rawValue }.reduce(0) { $0 | $1 }
    }
}

Также OR должно быть без параметров, и вам необходимо указать тип где-то:

let flags = ([.software, .accelerated] as [RendererFlags]).OR()

Однако это можно реализовать проще, используя OptionSet:

struct RendererFlags: OptionSet {
    let rawValue: CUnsignedInt

    static let software = RendererFlags(rawValue: 1 << 0)
    static let accelerated = RendererFlags(rawValue: 1 << 1)
    static let presentVSync = RendererFlags(rawValue: 1 << 2)
    static let targetTexture = RendererFlags(rawValue: 1 << 3)
}

let flags: RendererFlags = [.software, .accelerated]

Операция OR уже реализована для вас, и параметры ведут себя как массив, поэтому вам не нужно беспокоитьсяоб операциях с маской.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...