我有以下代码:
let lootBase = Int(pow((Decimal(level + 1)), 3) * 2)
let lootMod = Int(pow(Decimal(level), 2) * 2)
value = Int(arc4random_uniform(UInt32(lootBase)) + lootMod)
我需要成为一名Int。我尝试围绕Int()的pow计算时得到的错误是:
"无法使用Decimal"
类型的参数列表调用int类型的初始值设定项如何在Swift 3中使用int函数的pow函数?
答案 0 :(得分:6)
Int
没有使用Decimal
的初始值设定项,因此您无法使用Decimal
等初始化语法直接将Int
转换为Int(...)
。
您可以像这样使用pow(Decimal, Int)
:
let lootBase = Int(pow((Decimal(level + 1)), 3) * 2 as NSDecimalNumber)
let lootMod = Int(pow(Decimal(level), 2) * 2 as NSDecimalNumber)
let value = Int(arc4random_uniform(UInt32(lootBase))) + lootMod
否则,您可以像这样使用pow(Double, Double)
:
let lootBase = Int(pow((Double(level + 1)), 3) * 2)
let lootMod = Int(pow(Double(level), 2) * 2)
let value = Int(arc4random_uniform(UInt32(lootBase))) + lootMod
但是,如果你只计算一个整数值的幂为2或3,pow(Decimal, Int)
和pow(Double, Double)
都远没有效率。
您可以像这样宣布像squared
或cubed
这样的简单函数:
func squared(_ val: Int) -> Int {return val * val}
func cubed(_ val: Int) -> Int {return val * val * val}
并使用它们代替pow(..., 2)
或pow(..., 3)
:
let lootBase = cubed(level + 1) * 2
let lootMod = squared(level) * 2
let value = Int(arc4random_uniform(UInt32(lootBase))) + lootMod
(假设level
是Int
。)
答案 1 :(得分:1)
对pow功能的两个参数使用decimal。 也许你提供的pow的第二个参数被视为Int而不是Decimal。 尝试这样的事情:
let lootMod = Int(pow(Decimal(level), Decimal(2)) * 2)
答案 2 :(得分:1)
如果level是Int,你可以将它转换为Float并使用powf()而不是pow():
let lootBase = Int(powf(Float(level) + 1, 3)) * 2
let lootMod = Int(powf(Float(level), 2)) * 2
如果您使用UInt32进行添加,则应在将结果转换为Int之前将所有变量强制转换为UInt32:
let value = Int(arc4random_uniform(UInt32(lootBase)) + UInt32(lootMod))
PS:我不是专家,所以请检查自己是否按预期工作
答案 3 :(得分:0)
不建议使用不带参数的Int init()方法进行十进制转换,应将其替换为Int.init(截断号:NSNumber),像这样
let lootMod = Int(truncating: pow(Decimal(level), 2) * 2 as NSDecimalNumber)
或
let lootMod = Int(truncating: NSDecimalNumber(decimal: pow(Decimal(level), 2) * 2))