ios - 在 Swift 中使用 SecRandomCopyBytes

标签 ios swift swift3 swift5

我想在 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 的概念现在不同了,但它不允许我返回。如果我注释掉返回部分,它仍然说 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, 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
    }
}

关于ios - 在 Swift 中使用 SecRandomCopyBytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820602/

相关文章:

ios - Swift - 获取 ipv6 链接本地地址?

ios - -webkit-溢出-滚动 : touch is not recognized in chrome and on ios

objective-c - 如何检测是否在 OS X 上按下了某个键?

swift - 展开通用类型

ios - swift/xcode/iOS : Using Firebase to retrieve data already collected and displaying it in a separate view controller

swift - 用动态范围快速表达 for 循环

ios - Xcode:项目导航器,黄色文件夹和蓝色文件夹的区别

ios - 子类中 self 和 super 之间的混淆

ios - 如何在ScrollView中为ImageView设置自动布局约束?

swift - 如何从 GameViewController 更新 SKScene 中的变量?