2016-09-18 3 views
0

У меня есть несколько вопросов, обновляющих до версии 3.0. У меня есть следующий код:Кастинг UnsafeMutablePointers для UnsafeMutableRawPointers

// 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 и компилятор жалуется, что «не может ссылаться на инициализатор для типа ' UnsafeMutablePointer < _> с аргументом типа '(UnsafeMutableRawPointer)' 'Теперь я пытаюсь применить их к тем же типам, но не имел успеха.

Мой второй вопрос с линией:

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

Эта строка вызывает ошибку компилятора «неоднозначные использование" инициализации»

ответ

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)Pointer с.

Using Swift with Cocoa and Objective-C (Swift 3)

Проверьте Constant Pointers часть Pointers.

Если функция объявлена ​​как принимает UnsafeRawPointer аргумент, он может принимать те же операнды, как UnsafePointer<Type> для любого типа Type.

Вам не нужно указывать типы указателей.

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