在Swift 3.0中生成随机字节

问题描述:

我想在Swift 3.0中使用SecRandomCopyBytes生成随机字节。这里是我是如何做的雨燕在2.2在Swift 3.0中生成随机字节

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 
    } 
} 

在斯威夫特3,我试图做这样的,因为我知道unsafemutablebytes的概念现在是不同的,但它不会让我回来。如果我注释掉返回部分,还在说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()应在 闭包中调用,并且结果传回。

func generateRandomBytes() -> String? { 

    var keyData = Data(count: 32) 
    let result = keyData.withUnsafeMutableBytes { 
     (mutableBytes: UnsafeMutablePointer<UInt8>) -> Int32 in 
     SecRandomCopyBytes(kSecRandomDefault, keyData.count, 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, keyData.count, $0) 
    } 
    if result == errSecSuccess { 
     return keyData.base64EncodedString() 
    } else { 
     print("Problem generating random bytes") 
     return nil 
    } 
} 
+0

由于这个工作 – hockeybro