私は次のコードを持っています:
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関数を使用するにはどうすればよいですか?
Int
にはDecimal
を取る初期化子がないため、Int(...)
のような初期化構文を使用してDecimal
を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)
の代わりにそれらを使用します。
_let lootBase = cubed(level + 1) * 2
let lootMod = squared(level) * 2
let value = Int(arc4random_uniform(UInt32(lootBase))) + lootMod
_
(level
がInt
であると仮定します。)
Pow関数の両方のパラメーターに10進数を使用します。たぶん、あなたが提供しているpowの2番目の引数は、DecimalではなくIntとして扱われます。次のようなものを試してください。
let lootMod = Int(pow(Decimal(level), Decimal(2)) * 2)
ただし、回答が少し遅れています。
レベルが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:私は専門家ではないので、それが期待どおりに機能するかどうかを確認してください