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的支持