2017-02-20 43 views
3

我有以下代码:如何斯威夫特3使用POW(),并得到一个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) 

我需要的值是int。我得到当我试图环绕的诠释战俘计算()的错误是:

“不能调用int类型初始化类型小数的参数列表”

如何使用pow函数与诠释在Swift 3中?

回答

4

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):(假设levelInt

let lootBase = cubed(level + 1) * 2 
let lootMod = squared(level) * 2 

let value = Int(arc4random_uniform(UInt32(lootBase))) + lootMod 

1

对pow函数的两个参数都使用小数。 也许pow提供的第二个参数被视为Int而不是Decimal。 尝试是这样的:

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

然而有点迟到的答案:

如果水平是一个int,你可以将它转换为浮动和使用函数powf()的战俘,而不是():

let lootBase = Int(powf(Float(level) + 1, 3)) * 2 
let lootMod = Int(powf(Float(level), 2)) * 2 

如果使用UInt32的加法,你要抛弃所有变量UInt32的,你投的前结果INT:

let value = Int(arc4random_uniform(UInt32(lootBase)) + UInt32(lootMod)) 

PS:我可不是专家,以便检查自己是否能工程按预期