我想SecRandomCopyBytes在Swift 3.0中使用生成随机字节。这是我在Swift 2.2中所做的
SecRandomCopyBytes
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的概念现在有所不同,但是它不允许我返回。如果我评论退货部分,它仍然会说Generic Parameter ResultType could not be inferred
Generic Parameter ResultType could not be inferred
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 }
有谁知道如何解决这一问题?
谢谢
您已经关闭了,但是return内部的封闭是从封闭而不是外部函数返回的。因此,仅SecRandomCopyBytes()应在闭包中调用该方法,并将结果传递回去。
return
SecRandomCopyBytes()
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 } }
对于“单表达式闭包”,可以自动推断闭包类型,因此可以缩短为
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更新:
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 } }