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