OptionSet 中 rawValue 的正确值?
Correct value of rawValue in an OptionSet?
在使用 OptionSet 时,我认为 rawValue 总是表示位的组合。在下面的示例中,“all”值没有正确的 rawValue。为零。
如果在 init 函数中放置一个断点,它确实会在初始化“所有”选项集时命中 0 值。
struct Options: OptionSet {
init(rawValue: Int16) {
self.rawValue = rawValue
}
let rawValue: Int16
static let option1 = Options(rawValue:1)
static let option2 = Options(rawValue:2)
static let option3 = Options(rawValue:4)
static let all = [option1,option2,option3]
}
为了做一些有建设性的事情,我已经实现了符合 ExpressibleByArrayLiteral 协议的特殊 init 函数。但无济于事,因为它没有被调用,当用于静态初始化时(但是当用于非静态初始化时它会被调用)。
struct Options: OptionSet {
...
public init(arrayLiteral: Element...) {
for element in arrayLiteral {
}
}
您需要将 all
声明为 Options
类型
static let all: Options = [option1,option2,option3]
例子
print(Options.all) // prints Options(rawValue: 7)
在使用 OptionSet 时,我认为 rawValue 总是表示位的组合。在下面的示例中,“all”值没有正确的 rawValue。为零。
如果在 init 函数中放置一个断点,它确实会在初始化“所有”选项集时命中 0 值。
struct Options: OptionSet {
init(rawValue: Int16) {
self.rawValue = rawValue
}
let rawValue: Int16
static let option1 = Options(rawValue:1)
static let option2 = Options(rawValue:2)
static let option3 = Options(rawValue:4)
static let all = [option1,option2,option3]
}
为了做一些有建设性的事情,我已经实现了符合 ExpressibleByArrayLiteral 协议的特殊 init 函数。但无济于事,因为它没有被调用,当用于静态初始化时(但是当用于非静态初始化时它会被调用)。
struct Options: OptionSet {
...
public init(arrayLiteral: Element...) {
for element in arrayLiteral {
}
}
您需要将 all
声明为 Options
static let all: Options = [option1,option2,option3]
例子
print(Options.all) // prints Options(rawValue: 7)