2017-02-20 7 views
3

Ich habe den folgenden Code:So verwenden pow() in Swift 3 und erhalten 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) 

I-Wert benötigen eine Int zu sein. Der Fehler ich erhalte, wenn ich versuche, die pow Berechnung für Int zu umgeben() ist:

„aufrufen kann nicht Initialisierer für Typ int mit einer Argumentliste vom Typ Dezimal“

Wie kann ich die Funktion pow mit Int verwenden Sie in Swift 3?

Antwort

4

Int keine Initialisierer haben Decimal nehmen, so dass Sie nicht Decimal-Int direkt mit einer initializer Syntax wie Int(...) umwandeln kann.

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 

Oder können Sie pow(Double, Double) wie folgt verwenden:

Sie pow(Decimal, Int) wie diese verwenden können

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 

Aber, wenn Sie nur die Berechnung der Leistung des ganzzahligen Wert auf 2 oder 3, Sowohl pow(Decimal, Int) als auch pow(Double, Double) sind bei weitem nicht effizient.

können Sie erklärt eine einfache Funktionen wie squared oder cubed wie folgt aus:

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

und sie pow(..., 2) oder pow(..., 3) statt verwenden: (. Unter der Annahme, level ein Int ist)

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

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

1

Verwenden Sie den Dezimalwert für beide Parameter der pow-Funktion. Vielleicht wird das zweite Argument von pow, das Sie bereitstellen, als Int anstelle von Dezimal behandelt. Probieren Sie etwas wie folgt aus:

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

Ein wenig zu spät für eine Antwort jedoch:

Wenn Ebene ein Int ist, könnte man es zu gieße Float und Verwenden powf() anstelle von pow():

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

Wenn Sie UInt32 für Zusatz verwenden, sollten Sie alle Variablen auf UInt32 werfen, bevor Sie den Guss Ergebnis: Int

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

PS: Ich bin kein Experte, sich so überprüfen, ob das funktioniert wie Sie es erwarten

Verwandte Themen