使用Swift 1.2,我试图专门为Bool类型扩展数组类,以返回Int中的bitset值。在尝试了很多方法之后,我无法让它发挥作用:
extension Array {
func toUInt32<T: BooleanType>(Void) -> UInt32 {
let numBits = self.count
assert(numBits < 32)
var result: UInt32 = 0
for (idx, bit) in enumerate(self) {
if bit {
result |= UInt32(1 << (7 - (idx % 8)))
}
}
return result
}
}
我不清楚为什么bit变量中的Bool数组的枚举不能以这种方式进行测试。我也不确定如何扩展单个类型的数组类(这里使用BooleanType。)我做错了什么?
答案 0 :(得分:2)
您当前不能(Swift 1.2)使用对该函数的泛型类型施加进一步约束的方法扩展现有泛型类型。因此,在本示例中,您不能编写一个需要数组包含布尔值的方法。
相反,您可以编写一个将数组(或任何集合)作为参数的自由函数,然后要求该集合包含bools:
func toUInt32<C: CollectionType where C.Generator.Element: BooleanType>(source: C) -> UInt32 {
let numBits = count(source)
assert(numBits < 32)
var result: UInt32 = 0
for (idx, bit) in enumerate(source) {
if bit {
// guessing you meant |= rather than != ?
result |= UInt32(1 << (7 - (idx % 8)))
}
}
return result
}
答案 1 :(得分:0)
现在可以在Swift 2.2中使用:
extension Array where Element:BooleanType {
func toUInt32() -> UInt32 {
let numBits = self.count
assert(numBits < 32)
var result = UInt32(0)
for (idx, bit) in self.enumerate() {
if bit {
result |= UInt32(1 << (7 - (idx % 8)))
}
}
return result
}
}
var bools: [Bool] = [true, true, false]
print(bools.toUInt32())