簡體   English   中英

生成隨機Int64 + swift 3

[英]generating random Int64 + swift 3

我們在下面的代碼中收到警告。 任何人都可以建議什么是錯的,正確的方法是什么?

class func getRandomInt64() -> Int64 {
    var randomNumber: Int64 = 0
    withUnsafeMutablePointer(to: &randomNumber, { (randomNumberPointer) -> Void in
        let castedPointer = unsafeBitCast(randomNumberPointer, to: UnsafeMutablePointer<UInt8>.self)
         _ = SecRandomCopyBytes(kSecRandomDefault, 8, castedPointer)
    })
    return abs(randomNumber)
}

早些時候它現在很好,它發出了警告:

從'UnsafeMutablePointer'到'UnsafeMutablePointer'的'unsafeBitCast'改變了指針類型,可能導致未定義的行為; 在'UnsafeMutablePointer'上使用'withMemoryRebound'方法來重新綁定內存類型

Swift 3引入了withMemoryRebound ,取代了unsafeBitCast和其他不安全的強制轉換: https//developer.apple.com/reference/swift/unsafepointer/2430863-withmemoryrebound

在您的情況下使用它的正確方法:

class func getRandomInt64() -> Int64 {
    var randomNumber: Int64 = 0
    withUnsafeMutablePointer(to: &randomNumber, { (randomNumberPointer) -> Void in
        _ = randomNumberPointer.withMemoryRebound(to: UInt8.self, capacity: 8, { SecRandomCopyBytes(kSecRandomDefault, 8, $0) })
    })
    return abs(randomNumber)
}

為什么不這樣呢?

import Foundation

func randomInt64()->Int64 {
    var t = Int64()
    arc4random_buf(&t, MemoryLayout<Int64>.size)
    return t
}

let i = randomInt64()

或更好的通用

import Foundation

func random<T: Integer>()->T {
    var t: T = 0
    arc4random_buf(&t, MemoryLayout<T>.size)
    return t
}

let i:Int = random()
let u: UInt8 = random()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM