[英]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.