12

I have the following code written in Swift 2.2:

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

XCode 8 highlights that second line and claims that

Cannot invoke initializer for type 'UnsafeMutablePointer<_>' with an argument list of type '(UnsafeMutableRawPointer)'

While I appreciate XCode telling me this, I don't quite understand how to change the UnsafeMutableRawPointer to be acceptable.

Does anyone know how to convert this code into Swift 3?

AppreciateIt
  • 696
  • 2
  • 8
  • 23
  • I met this problem too. Did you find any solution yet? – JW.ZG Sep 16 '16 at 19:54
  • To avoid duplicates, this is my question, very similar with yours. Hope someone can answer my question together with yours. `Cannot invoke initializer for type 'UnsafePointer<_>' with an argument list of type '(UnsafeMutableRawPointer?)'` – JW.ZG Sep 16 '16 at 20:04
  • Other than OOper's answer, nope. Do you have to use NSMutableData in your case? – AppreciateIt Sep 16 '16 at 20:19
  • Try this [solution](http://stackoverflow.com/questions/10658553/how-to-get-pixel-color-at-location-from-uiimage-scaled-within-a-uiimageview). I just solved my problem with this solution. – JW.ZG Sep 16 '16 at 20:31

1 Answers1

18

I recommend you to work with Data rather than NSData in Swift 3.

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

withUnsafeMutableBytes(_:) is declared as a generic method, so, in simple cases such as this, you can use it without specifying element type.

OOPer
  • 47,149
  • 6
  • 107
  • 142
  • please see this https://stackoverflow.com/questions/45181614/cannot-invoke-initializer-for-type-unsafepointer-with-an-argument-list-of-typ – Saurabh Jain Jul 19 '17 at 05:30