gpt4 book ai didi

swift - OptionSet 与每个选项的关联值

转载 作者:搜寻专家 更新时间:2023-10-30 23:13:55 25 4
gpt4 key购买 nike

这可能最好用一个用例来解释。

我有一个记录器类。它将消息记录到级别的输出。

class Logger {
var outputs: OutputOptions
var filter: Level

func log(_ message: String, at level: Level) {
if level <= self.filter {
outputs.log(message)
}
}
}

可能的输出由 OptionSet 定义,并确定应将消息记录到哪些输出(NSLog、Instabug 等)。 OptionSet 在这里很好,因为我可以定义选择多个输出并在记录时轻松检查选择了哪些。

struct OutputOptions: OptionSet {
let rawValue: Int

static let console = OutputOptions(1 << 0)
static let instabug = OutputOptions(1 << 1)

func log(_ message: String) {
if self.contains(.console) {
NSLog(message)
}

// etc
}
}

级别由枚举定义并表示消息的级别,例如错误、警告、信息等。如果我们对获得冗长的输出不感兴趣,记录器可以过滤掉高于特定级别的消息。记录器的过滤器也设置为一个级别。

enum Level: Int {none, no logs are shown. */
case none = 0
case error = 1
case warning = 2
case info = 3
case verbose = 4
}

我想以某种方式组合输出选项和级别,允许我指定某些输出可以将消息过滤到特定级别,而其他输出可以过滤到其他级别。例如,我想将详细消息记录到控制台,但只将错误记录到 Instabug。从表面上看,OptionSets 看起来像是可组合的枚举,所以我立刻想到了关联值。如果每个选项都有关联的过滤级别,我可以像这样设置记录器的输出:

let logger = Loggger()
logger.outputs = [.console(filter: .verbose), .instabug(filter: .error)]

为了让它发挥作用,我向 OutputOptions 添加了一个过滤器属性。我的选项现在看起来像这样:

struct OutputOptions: OptionSet {
let rawValue: Int
var filter: Level = .info

init(rawValue: Int, filter: Level) {
self.rawValue = rawValue
self.filter = filter
}

static func console(filter: Level = .info) {
return OutputOptions(rawValue: 1 << 0, filter: filter)
}

// etc

但我不知道如何访问 log 中元素的过滤器变量。根据我使用枚举的经验,我希望能够做到

   func log(_ message: String, at level: Level) {
if self.contains(.console(let filter)) { // <== does not compile!
if level <= filter {
NSLog(message)
}
}
}
}

但这并不能编译。事实上,filter 属性似乎不是为每个选项单独定义的,而是为整个选项集定义的。

SO:有没有办法将值与选项集中的各个选项相关联?

最佳答案

But that does not compile. In fact, it looks like the filter property is not separately defined for each option, but rather for a whole option set.

这是因为 OptionSet 本身并不是真正的集合。如果我有以下 OptionSet:

struct MyOptions: OptionSet {
let rawValue: Int

static let foo = MyOptions(1 << 0)
static let bar = MyOptions(1 << 1)
}

然后我像这样制作集合:

let opts: MyOptions = [.foo, .bar]

我实际上没有一个包含两个 MyOptions 的集合其中的实例。相反,我有一个新实例 MyOptions谁的rawValue设置为 (.foo.rawValue | .bar.rawValue) -IE。 3.原二MyOptions实例在opts 后立即被丢弃制作完成。

同样,您的 logger.outputs将是 OutputOptions 的实例与 rawValue 3 和 filter 的默认值.

因此,实际上不可能用 OptionSet 做你想做的事.

关于swift - OptionSet 与每个选项的关联值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45986151/

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