2016-10-02 12 views
6

Chcę generować losowe bajty za pomocą SecRandomCopyBytes w Swift 3.0. Oto jak to zrobiłem w Swift 2.2Generowanie losowych bajtów w 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 
    } 
} 

w Swift 3, starałem się zrobić to w ten sposób, ponieważ wiem, że pojęcie unsafemutablebytes jest inna teraz, ale nie pozwala mi wrócić. Gdybym wykomentuj część powrotną, wciąż mówi 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 
} 

Czy ktoś wie jak rozwiązać ten problem?

Dzięki

Odpowiedz

15

Byłaś blisko, ale return wewnątrz zamknięcia zwraca z zamknięcia, a nie z funkcji zewnętrznej. Dlatego tylko SecRandomCopyBytes() powinien zostać wywołany w zamknięciu , a wynik powrócił.

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

Dla „zamknięcia pojedynczego wyrażenia” rodzaj zamknięcia można wywnioskować automatycznie, więc to może być skrócony do

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

Dzięki tym pracowali – hockeybro

Powiązane problemy