2016-10-02 7 views
6

Swift 3.0でSecRandomCopyBytesを使用してランダムなバイトを生成したいとします。ここで私はスウィフト2.2スウィフト3では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 
    } 
} 

でそれをやった方法です、私は私が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 
} 

を言う誰もがこの問題を解決する方法を知っていますか?

おかげ

答えて

15

あなたが近くにあったが、クロージャ内部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