我想创建一个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协议的方法insert
或remove
时,自定义属性都会重置:
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)
重置结构。 有没有办法保存储值?
答案 0 :(得分:0)
结构按值传递(复制),按引用类传递。这肯定是一种保持直线的痛苦。
当您运行x.insert(.opt)
时,您正在使用Options(rawValue: 1)
初始化新结构并复制a
的原始值,而不是执行之前已设置的引用
因此,虽然您之前已在代码中将a
设置为1
,但插入后会初始化新结构,然后a
将返回0
查看结构值传递的这个精细解释以获取更多信息: https://stackoverflow.com/a/26006268/4228039
结构并非真正用于保存每次初始化时继续存储的引用,但更多用于设置传入的初始值。类可以更好地工作。
答案 1 :(得分:0)
目前这似乎是不可能的,解决方法是将OptionSetType
包装在另一个包含自定义属性的自定义结构/类中。