如何在 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)
都远没有效率。
您可以像这样声明一个简单的函数,例如 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
。)
回答有点晚了,但是:
如果 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))
我有以下代码:
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)
都远没有效率。
您可以像这样声明一个简单的函数,例如 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
。)
回答有点晚了,但是:
如果 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))