如何在Swift 3中使用pow()并获取Int

时间:2017-02-20 06:41:35

标签: swift3 pow

我有以下代码:

    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函数?

4 个答案:

答案 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)都远没有效率。

您可以像这样宣布像squaredcubed这样的简单函数:

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

(假设levelInt。)

答案 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))