一系列布尔延伸

时间:2015-06-06 18:05:53

标签: ios swift

使用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。)我做错了什么?

2 个答案:

答案 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())