Swift 生成随机Int64+;斯威夫特3

Swift 生成随机Int64+;斯威夫特3,swift,swift3,Swift,Swift3,我们收到以下代码中的警告。有人能提出什么是错误的,什么是正确的方法吗 class func getRandomInt64() -> Int64 { var randomNumber: Int64 = 0 withUnsafeMutablePointer(to: &randomNumber, { (randomNumberPointer) -> Void in let castedPointer = unsafeBitCast(randomNum

我们收到以下代码中的警告。有人能提出什么是错误的,什么是正确的方法吗

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)
}
class func getRandomInt64()->Int64{
变量随机数:Int64=0
withUnsafeMutablePointer(指向:&randomNumber,{(randomNumberPointer)->中的Void
让castedPointer=unsafeBitCast(randomNumberPointer,to:UnsafeMutablePointer.self)
_=SecRandomCopyBytes(kSecRandomDefault,8,castedPointer)
})
返回abs(随机数)
}
早些时候天气很好,现在发出警告:

从“Unsafemeutablepointer”到“Unsafemeutablepointer”的“unsafeBitCast”更改了指针对象的类型,并可能导致未定义的行为;使用“Unsafemeutablepointer”上的“withMemoryRebound”方法重新绑定内存类型


Swift 3推出了带有MemoryRebound的
,取代了
非安全广播
和其他不安全广播:

在您的案例中使用它的正确方法:

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()
<代码>导入基础 func randomInt64()->Int64{ var t=Int64() arc4random_buf(&t,MemoryLayout.size) 返回t } 设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()
<代码>导入基础 func random()->T{ 变量t:t=0 arc4random_buf(&t,MemoryLayout.size) 返回t } 设i:Int=random() 设u:UInt8=random()
我刚刚测试了您的代码,它工作正常,没有问题issue@BhupatBheda您没有在Swift 3上进行测试。@Oskar我已经尝试过了,但没有得到错误,可能是您得到了随机结果:-6809176430944439855容量的可能重复应该是8,不是吗?正如在8
UInt8
s中一样,s使一个
UInt64
也不能确定
randomNumber=Int64(castedPointer)
,因为
castedPointer
指向
randomNumber
,因此
randomNumber
已经填充`谢谢,我的警告消失了,但我最后的一个问题是,修改后的代码是否会像以前的代码一样执行。请确认一下。@JeremyP您完全正确。我已经更正了我的答案。@作者:我已经测试过了,上面的代码现在运行良好。确保使用更新的答案。感谢@Oskar的支持