2017-02-20 3 views
3

У меня есть следующий код:Как использовать Pow() в Swift 3 и получить 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. Я получаю ошибку, когда я пытаюсь окружить POW вычисления для Int() является:

«Невозможно вызвать инициализатор для типа междунар со списком аргументов типа Decimal»

Как использовать функцию POW с Int в 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) далеки от эффективности.

Вы можете объявили простые функции, такие как squared или cubed, как это:

func squared(_ val: Int) -> Int {return val * val} 
func cubed(_ val: Int) -> Int {return val * val * val} 

и использовать их вместо pow(..., 2) или pow(..., 3): (. Предполагая, что level является Int)

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

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

1

Используйте десятичное значение для обоих параметров функции pow. Возможно, второй аргумент pow, который вы предоставляете, рассматривается как Int вместо десятичного. Попробуйте что-то вроде этого:

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

Немного опоздал на ответ, однако:

Если уровень является Int вы могли бы привести его к Float и использовать 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: I'm не специалист, так проверить себя, если это работает, как вы ожидаете

Смежные вопросы