Swift语言:如何调用SecRandomCopyBytes函数

8

从 Objective-C,我可以做到这一点:

NSMutableData *data = [NSMutableData dataWithLength:length];
int result = SecRandomCopyBytes(kSecRandomDefault, length, data.mutableBytes);

试图在Swift中进行此操作时,我有以下代码:
let data = NSMutableData(length: Int(length))
let result = SecRandomCopyBytes(kSecRandomDefault, length, data.mutableBytes)

但我遇到了这个编译器错误:

'Void' is not identical to 'UInt8'

由于类型不匹配,数据的mutableBytes参数被拒绝,但我无法强制转换该参数(并且我假设这样做是安全的)。

3个回答

13

这似乎是有效的:

let data = NSMutableData(length: Int(length))
let result = SecRandomCopyBytes(kSecRandomDefault, length, UnsafeMutablePointer<UInt8>(data.mutableBytes))

9

Swift 5

let count: Int = <byteCount>
var data = Data(count: count)
let result = data.withUnsafeMutableBytes {    
    SecRandomCopyBytes(kSecRandomDefault, count, $0.baseAddress!) 
}

Swift 4:

var data = Data(count: <count>)
let result = data.withUnsafeMutableBytes { mutableBytes in
    SecRandomCopyBytes(kSecRandomDefault, data.count, mutableBytes)
}

你可以使用 nil 代替 kSecRandomDefault - Sulthan
Swift 5 会产生一个错误 Overlapping accesses to 'data', but modification requires exclusive access; consider copying to a local variable。解决方案是用你传递的 <count> 替换 data.count - Andy Ibanez
感谢您的提醒,@AndyIbanez。我已经改进了Swift 5的答案。 - Ondrej Stocek

3

Swift 4版本:

let count = 16
var data = Data(count: count)
_ = data.withUnsafeMutableBytes {
    SecRandomCopyBytes(kSecRandomDefault, count, $0)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接