Swift OptionSetType重置自定义属性

时间:2015-11-11 16:45:19

标签: swift protocols

我想创建一个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)

重置结构。 有没有办法保存储值?

2 个答案:

答案 0 :(得分:0)

结构按值传递(复制),按引用类传递。这肯定是一种保持直线的痛苦。

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

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

查看结构值传递的这个精细解释以获取更多信息: https://stackoverflow.com/a/26006268/4228039

结构并非真正用于保存每次初始化时继续存储的引用,但更多用于设置传入的初始值。类可以更好地工作。

答案 1 :(得分:0)

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