web-dev-qa-db-ja.com

Swift 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計算をサラウンドしようとすると、エラーが発生します。

「Decimal型の引数リストを使用してint型の初期化子を呼び出すことはできません」

Int in Swift 3でpow関数を使用するにはどうすればよいですか?

6
zeeple

IntにはDecimalを取る初期化子がないため、Int(...)のような初期化構文を使用してDecimalIntに直接変換することはできません。

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
_

levelIntであると仮定します。)

7
OOPer

Pow関数の両方のパラメーターに10進数を使用します。たぶん、あなたが提供しているpowの2番目の引数は、DecimalではなくIntとして扱われます。次のようなものを試してください。

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

ただし、回答が少し遅れています。

レベルがIntの場合、それをFloatにキャストし、pow()の代わりにpowf()を使用できます。

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:私は専門家ではないので、それが期待どおりに機能するかどうかを確認してください

1
fossydh