swift 3:如何扩展[UInt8]以添加getUInt32BE函数

swift 3:如何扩展[UInt8]以添加getUInt32BE函数,swift,bit-manipulation,swift3,Swift,Bit Manipulation,Swift3,我试图用getUInt32BE()函数扩展[UInt8],如下代码所示 以下是我收到的错误: “无法使用类型为的索引为“Self”类型的值下标。” “范围” 有人能帮我纠正这个错误吗 Iterator.Element==UInt8的扩展集合{ 公共函数getUInt32BE(at:Int=0)->UInt32{ 返回self[at..Alternative#1:使用非安全指针的属性.pointee 如以下问答所述 您可以在Swift 2.2中使用,例如 备选方案2:使用位移位 或者,使用

我试图用
getUInt32BE()
函数扩展
[UInt8]
,如下代码所示

以下是我收到的错误:

“无法使用类型为的索引为“Self”类型的值下标。” “范围”

有人能帮我纠正这个错误吗

Iterator.Element==UInt8的扩展集合{ 公共函数getUInt32BE(at:Int=0)->UInt32{ 返回self[at..Alternative#1:使用
非安全指针的
属性.pointee
如以下问答所述

您可以在Swift 2.2中使用,例如


备选方案2:使用位移位 或者,使用上面的修改版本进行位移位(类似于您问题的尝试),而不是使用
UnsafePointer

有关
收集
协议的详细信息(上述错误的原因是未使用此协议的关联类型
索引.Distance
来构造子数组),请参阅例如


@我很乐意提供帮助。请注意,我已经稍微更新了答案,现在使用了
.bigEndian
属性(而不是反转
字节
数组),而之前的答案假设主机字节顺序是little-endian(不是很一般,但不是固定的)。
UnsafePointer<UInt16>(bytes).memory
extension Collection where Iterator.Element == UInt8 {

    public func getUInt32BE(at: Index.Distance) -> UInt32? {
        let from = startIndex.advanced(by: at, limit: endIndex)
        let to = from.advanced(by: 4, limit: endIndex)
        
        guard case let bytesSlice = self[from..<to] 
            where from.distance(to: to) == 4 else { return nil }
        
        return bytesSlice.reduce(0) { (tot, val) -> UInt32 in
            tot << 8 + UInt32(val as! UInt8)
        }
    }
}
/* example usage */
let bytes: [UInt8] = [
    0,   // 0b 0000 0000
    255, // 0b 1111 1111 
    0,   // 0b 0000 0000
    104, // 0b 0110 1000
    76]  // 0b 0100 1100
    
/*  byteArr[1..<5], big-endian:
        0b 1111 1111 0000 0000 0110 1000 0100 1100 */
let u32verify = 0b11111111000000000110100001001100 
print(u32verify) // 4278216780
    
if let u32val = bytes.getUInt32BE(1) {
    print(u32val) // 4278216780, OK
}