gpt4 book ai didi

swift - 将 OptionSetType 映射到数组

转载 作者:可可西里 更新时间:2023-10-31 23:56:05 25 4
gpt4 key购买 nike

鉴于以下情况:

struct Weekdays: OptionSetType {

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

static let Monday = Weekdays(rawValue: 1)
static let Tuesday = Weekdays(rawValue: 2)
static let Wednesday = Weekdays(rawValue: 4)
static let Thursday = Weekdays(rawValue: 8)

static let allOptions: [Weekdays] = [.Monday, .Tuesday, .Wednesday, .Thursday]

}

我可以通过这样做将 Ints 数组转换为 Weekdays 对象:

let arr = [1, 4]
let weekdays = arr.reduce(Weekdays()) { $0.union(Weekdays(rawValue: $1)) }

我的问题是,如何将 Weekdays 对象转换为 Int 数组?

最佳答案

(不一定更好,但是换个角度看更一般)。

OptionSetType继承自 RawRepresentable因此可以从关联的原始类型转换为关联的原始类型,在您的情况下是 Int .

所以“缺失的链接”是原始值之间的转换(例如 5 )和按位分量的整数数组(例如 [1, 4] )。

这可以通过 Int 来完成扩展方法:

extension Int {
init(bitComponents : [Int]) {
self = bitComponents.reduce(0, combine: (+))
}

func bitComponents() -> [Int] {
return (0 ..< 8*sizeof(Int)).map( { 1 << $0 }).filter( { self & $0 != 0 } )
}
}

然后你从数组到 Weekdays 的转换对象变成

let arr : [Int] = [1, 4]
let weekdays = Weekdays(rawValue: Int(bitComponents: arr))
print(weekdays)
// app.Weekdays(rawValue: 5)

和反向转换

let array = weekdays.rawValue.bitComponents()
print(array)
// [1, 4]

优点:

  • allOptions: 的显式定义不需要。
  • 它可以应用于其他选项集类型(具有Int作为原始值)。

也可以尝试将转换定义为协议(protocol)扩展,例如的 IntegerType ,因此同样适用于其他整数原始类型。但是,这似乎有点复杂/丑陋因为左移运算符 <<不是的一部分 IntegerType (或任何)协议(protocol)。


Swift 3 更新:

extension Int {
init(bitComponents : [Int]) {
self = bitComponents.reduce(0, +)
}

func bitComponents() -> [Int] {
return (0 ..< 8*MemoryLayout<Int>.size).map( { 1 << $0 }).filter( { self & $0 != 0 } )
}
}

关于swift - 将 OptionSetType 映射到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com