2016-09-15 3 views
12

Я следующий код, написанный в Swift 2.2:Как использовать UnsafeMutablePointer в Swift 3?

let keyData = NSMutableData(length: 64)! 
SecRandomCopyBytes(kSecRandomDefault, 64, UnsafeMutablePointer<UInt8>(keyData.mutableBytes)) 

Xcode 8 подчеркивается, что во второй строке и утверждает, что

Не может вызвать инициализатор для типа 'UnsafeMutablePointer < _>' со списком аргумента (UnsafeMutableRawPointer) '

Хотя я ценю, что XCode говорит мне об этом, я не совсем понимаю, как изменить UnsafeMutabl eRawPointer - приемлемый.

Кто-нибудь знает, как преобразовать этот код в Swift 3?

+0

Я тоже встретил эту проблему. Вы нашли решение еще? –

+0

Чтобы избежать дубликатов, это мой вопрос, очень похожий на ваш. Надеюсь, кто-то может ответить на мой вопрос вместе с твоим. 'Невозможно вызвать инициализатор для типа 'UnsafePointer <_>' с аргументом списка типа '(UnsafeMutableRawPointer?)'' –

+0

За исключением ответа OOper, нет. Вам нужно использовать NSMutableData в вашем случае? – AppreciateIt

ответ

16

Я рекомендую вам работать с Data, а не NSData в Swift 3.

var keyData = Data(count: 64) 
let result = keyData.withUnsafeMutableBytes {mutableBytes in 
    SecRandomCopyBytes(kSecRandomDefault, keyData.count, mutableBytes) 
} 

withUnsafeMutableBytes(_:) объявлен как общий метод, поэтому в простых случаях, таких как это, вы можете использовать его без указания типа элемента ,

+0

см. Этот https://stackoverflow.com/questions/45181614/cannot-invoke-initializer-for-type-unsafepointer-with-an-argument-list-of-typ –