gpt4 book ai didi

swift - 对数组中的所有元素进行或运算

转载 作者:行者123 更新时间:2023-11-28 10:34:34 24 4
gpt4 key购买 nike

我想扩展枚举数组:带有函数 OR() 的数字,该函数对数组中的所有元素进行或运算。

这是我想出来的:

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

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

}

这是编译器抛出的错误:

Cannot invoke 'reduce' with an argument list of type '(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

}

或枚举其他数字原始值,然后

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

我的错误在哪里?为什么编译器对此不满意?

最佳答案

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 操作已经为您实现,选项的行为类似于数组,因此您不必担心掩码操作。

关于swift - 对数组中的所有元素进行或运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com