Swift OptionSetType 重置自定义属性

Swift OptionSetType resets custom properties

我想创建一个带有自定义 属性 添加到结构的 OptionSetType:

struct Options: OptionSetType {

    let rawValue: Int

    init(rawValue: Int) {
        self.rawValue = rawValue
    }

    // some option
    static let opt = Options(rawValue: 1)

    // custom stored property
    var a = 0

}

每次调用 OptionSetType 协议的方法 insertremove 时,自定义 属性 都会重置:

var x: Options = []

x.rawValue // => 0
x.a = 1 // => 1

x.insert(.opt)
x.rawValue // => 1
x.a // => 0 <-- a is changed

我的猜测是 insert(_:) 做了这样的事情:

self = Options(rawValue: newValueWithInsertedOption)

这会重置结构。 有什么方法可以保值吗?

结构按值传递(复制),类按引用传递。保持直线肯定会很痛苦。

当您 运行 x.insert(.opt) 时,您正在使用 Options(rawValue: 1) 初始化一个新结构并复制 a 的原始值,而不是执行可能的引用之前已设置。

因此,虽然您之前在代码中将 a 设置为 1,但之后的插入会初始化一个新结构,然后 a 会返回到 0 .

查看结构值传递的详细解释以获取更多信息:

结构并不是真正设计用于保存在每次初始化时继续的存储引用,而是更多用于设置传入的初始值。类 会更好。

目前这似乎是不可能的,解决方法是将 OptionSetType 包装在另一个包含自定义属性的自定义 struct/class 中。