2017-02-20 23 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:我可不是專家,以便檢查自己是否能工程按預期