1

我正在对我不太理解的代码进行一些 Swift 5 转换,即以前开发人员的遗留代码。我得到:

'withUnsafeBytes' 已弃用:改用 withUnsafeBytes(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R`

为了:

func toArray<T>(type: T.Type) -> [T] {
    return self.withUnsafeBytes {
        [T](UnsafeBufferPointer(start: $0, count: self.count/MemoryLayout<T>.stride))
    }
}

我想用这个替换它,但我不确定它是否做同样的事情:

func toArray<T>(type: T.Type) -> [T] where T: ExpressibleByIntegerLiteral {
    var array = [T](repeating: 0, count: self.count/MemoryLayout<T>.stride)
    _ = array.withUnsafeMutableBytes { copyBytes(to: $0) }
    return array
}

在这两个 fxs 的上下文中使用:

static func extractPacketSizeFromIV(iv: Data) -> Int32? {
    let array = iv.toArray(type: Int32.self)
    guard array.count == 4 else { return nil }

    let r0 = array[0].bigEndian
    let r1 = array[1].bigEndian
    let r2 = array[2].bigEndian

    return r2 ^ r1 ^ r0
}

static func extractGuidFromIV(iv: Data) -> Int32? {
    let array = iv.toArray(type: Int32.self)
    guard array.count == 4 else { return nil }

    let r0 = array[0].bigEndian
    let r1 = array[1].bigEndian
    let r2 = array[2].bigEndian
    let r3 = array[3].bigEndian

    return r3 ^ r2 ^ r1 ^ r0
}
4

2 回答 2

1

首先, yourtoArray是在 的扩展中定义的Data,对吧?

(请在写问题时澄清这些事情。)

您的代码的工作方式与您的用例中以前开发人员的代码相同,但我会在 Swift 5 中编写类似的代码,如下所示:

func toArray<T>(type: T.Type) -> [T] {
    return self.withUnsafeBytes {
        [T]($0.bindMemory(to: type))
    }
}

bindMemory(to: type)UnsafeBufferPointer<T>根据从 new 传递的参数创建一个(如在原始代码中) withUnsafeBytes,即UnsafeRawBufferPointer.

于 2019-05-10T01:16:39.033 回答
1

我会使用建议的替换,即withUnsafeBytes(_:),其第一个参数是 a UnsafeRawBufferPointer,直接,而不是构建数组或不必要地复制缓冲区,例如:

static func extractPacketSizeFromIV(iv: Data) -> Int32? {
    return iv.withUnsafeBytes { rawBuffer -> Int32 in
        let buffer = rawBuffer.bindMemory(to: Int32.self)
        let r0 = buffer[0].bigEndian
        let r1 = buffer[1].bigEndian
        let r2 = buffer[2].bigEndian

        return r2 ^ r1 ^ r0
    }
}

显然,如果你Data比这更复杂(例如,具有许多不同类型的不同大小的异构有效负载),可能需要不同的方法,但如果这是一个简单的缓冲区,只有一个简单的集合Int32,上面是一个有效的检索必要值的方法。

于 2019-05-10T03:28:32.897 回答