我希望在Swift 3.0中使用SecRandomCopyBytes
生成随机字节。以下是我在Swift 2.2中的做法。
private static func generateRandomBytes() -> String? {
let data = NSMutableData(length: Int(32))
let result = SecRandomCopyBytes(kSecRandomDefault, 32, UnsafeMutablePointer<UInt8>(data!.mutableBytes))
if result == errSecSuccess {
return data!.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
} else {
print("Problem generating random bytes")
return nil
}
}
在Swift 3中,我尝试像这样做,因为我知道unsafemutablebytes的概念现在已经不同了,但是它不允许我返回。如果我注释掉返回部分,它仍然会显示“无法推断出泛型参数ResultType”。fileprivate static func generateRandomBytes() -> String? {
var keyData = Data(count: 32)
_ = keyData.withUnsafeMutableBytes {mutableBytes in
let result = SecRandomCopyBytes(kSecRandomDefault, keyData.count, mutableBytes)
if result == errSecSuccess {
return keyData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
} else {
print("Problem generating random bytes")
return nil
}
}
return nil
}
有人知道如何修复这个问题吗?
谢谢
keyData.count
即可。 - Martin RkeyData
又是如何填充随机字节的呢?它应该只有闭包级别的作用域,而不是bufPtr
,或者说bufPtr
逃逸了闭包吗?我的意思是我们返回的是keyData
而不是bufPtr
或$0
。 - Woodstock