You were close, but return inside the closure returns from the closure, not from an external function. Therefore, only SecRandomCopyBytes() should be called in the closure, and the result passed back.
func generateRandomBytes() -> String? { var keyData = Data(count: 32) let result = keyData.withUnsafeMutableBytes { (mutableBytes: UnsafeMutablePointer<UInt8>) -> Int32 in SecRandomCopyBytes(kSecRandomDefault, 32, mutableBytes) } if result == errSecSuccess { return keyData.base64EncodedString() } else { print("Problem generating random bytes") return nil } }
For a βone-expression closureβ, the closure type can be inferred automatically, so it can be reduced to
func generateRandomBytes() -> String? { var keyData = Data(count: 32) let result = keyData.withUnsafeMutableBytes { SecRandomCopyBytes(kSecRandomDefault, 32, $0) } if result == errSecSuccess { return keyData.base64EncodedString() } else { print("Problem generating random bytes") return nil } }
Swift 5 update:
func generateRandomBytes() -> String? { var keyData = Data(count: 32) let result = keyData.withUnsafeMutableBytes { SecRandomCopyBytes(kSecRandomDefault, 32, $0.baseAddress!) } if result == errSecSuccess { return keyData.base64EncodedString() } else { print("Problem generating random bytes") return nil } }
source share