- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
鉴于以下情况:
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/
假设我有以下 OptionSetType struct Modifier : OptionSetType { typealias RawValue = Int var rawValue
我想创建一个带有自定义属性的 OptionSetType: struct Options: OptionSetType { let rawValue: Int init(rawValu
我有一个名为 ProgrammingLanguage 的枚举: enum ProgrammingLanguage { case Swift, Haskell, Scala } 现在我有一个名为 P
我试图弄清楚 OptionSetType 协议(protocol),但我有一些基本问题。 1)options是Array类型还是Set类型? 2) 我可以使用 for...in 循环或 for 循环访
我在自己的文件中定义了这个结构,想在其他地方和测试中使用它。 struct UserPermissions : OptionSetType { let rawValue: UInt s
鉴于以下情况: struct Weekdays: OptionSetType { let rawValue: Int init(rawValue: Int) { self.rawVal
我有一个 struct Person extends OptionSetType。在后面的代码中,如何使用 switch 语句来检查 Person 的实例是否有多个值? 谢谢 struct Perso
Swift 的 OptionSetType 协议(protocol)的目的是什么,它与仅仅利用 Set 来获取那些 SetAlgebraType 方法有何不同? 最佳答案 我将从使用OptionSet
在 Swift 1.2 之前,您可以在位掩码上执行 ~ (NOT): bitmask = ~otherBitmask 但是在 Swift 2.0 中,位掩码现在是 OptionSetType 并且您不
我在 Swift 中有一个自定义的 OptionSetType 结构。如何枚举实例的所有值? 这是我的 OptionSetType: struct WeekdaySet: OptionSetType
struct TimeMark: OptionSetType { private enum TimeMark : Int,CustomStringConvertible { case Head
在我的 Swift 类中,我为实现选项定义了一个 OptionSetType。 struct FulfillmentOption : OptionSetType { let rawValue:
我是一名优秀的程序员,十分优秀!