0

我有几个问题更新到 swift 3.0。我有以下代码:

  // Retrieve the Device GUID
        let device = UIDevice.current
        let uuid = device.identifierForVendor
        let mutableData = NSMutableData(length: 16)
        (uuid! as NSUUID).getBytes(UnsafeMutablePointer(mutableData!.mutableBytes))

        // Verify the hash
        var hash = Array<UInt8>(repeating: 0, count: 20)
        var ctx = SHA_CTX()
        SHA1_Init(&ctx)
        SHA1_Update(&ctx, mutableData!.bytes, mutableData!.length)
        SHA1_Update(&ctx, (opaqueData1! as NSData).bytes, opaqueData1!.count)
        SHA1_Update(&ctx, (bundleIdData1! as NSData).bytes, bundleIdData1!.count)
        SHA1_Final(&hash, &ctx)
        let computedHashData1 = Data(bytes: UnsafePointer(&hash), count: 20)

我的第一个问题是代码行:

(uuid! as NSUUID).getBytes(UnsafeMutablePointer(mutableData!.mutableBytes))

mutableData!.mutableBytes 现在返回一个 UnsafeMutableRawPointer 并且编译器抱怨“无法使用类型为 '(UnsafeMutableRawPointer)' 的参数调用类型 'UnsafeMutablePointer<_> 的初始化程序”现在我一直在尝试将它们转换为相同的类型,但已经没有成功。

我的第二个问题是这条线:

let computedHashData1 = Data(bytes: UnsafePointer(&hash), count: 20)

此行会导致编译器错误“模糊使用 'init'”

4

1 回答 1

0

你的第一个问题,你可以这样写:

    (uuid! as NSUUID).getBytes(mutableData!.mutableBytes.assumingMemoryBound(to: UInt8.self))

但是,如果您可以接受Data具有相同的原始 UUID 字节,则可以将其写为:

    var uuidBytes = uuid!.uuid
    let data = Data(bytes: &uuidBytes, count: MemoryLayout.size(ofValue: uuidBytes))

您的第二个问题,在 中Data.init(bytes:count:),第一个参数的类型是UnsafeRawPointer,您可以向其传递任意类型的Unsafe(Mutable)Pointers。

将 Swift 与 Cocoa 和 Objective-C 一起使用(Swift 3)

检查 Pointers 的 Constant Pointers部分。

当函数被声明为带参数时,它可以接受与任何类型 UnsafeRawPointer相同的操作数。UnsafePointer<Type>Type

您无需转换指针类型。

    let computedHashData1 = Data(bytes: &hash, count: 20)
于 2016-09-18T19:28:43.113 回答