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