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

How to use pow() in Swift 3 and get an Int

我有以下代码:

let lootBase = Int(pow((Decimal(level + 1)), 3) * 2)
let lootMod = Int(pow(Decimal(level), 2) * 2)
value = Int(arc4random_uniform(UInt32(lootBase)) + lootMod)

我需要 value 才能成为 Int。当我尝试围绕 Int() 的 pow 计算时得到的错误是:

Cannot invoke initializer for type int with an argument list of type Decimal

如何在 Swift 3 中使用带 Int 的 pow 函数?

pow 函数的两个参数都使用十进制。 也许您提供的 pow 的第二个参数被视为 Int 而不是 Decimal。 尝试这样的事情:

let lootMod = Int(pow(Decimal(level), Decimal(2)) * 2)

Int 没有采用 Decimal 的初始化器,因此您不能使用 Int(...) 等初始化器语法直接将 Decimal 转换为 Int。 =29=]

您可以这样使用 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

(假设 level 是一个 Int。)

回答有点晚了,但是:

如果 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:我不是专家,所以请自行检查是否如您所愿

不推荐使用没有参数的 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))