7
votes

Tableau d'opérateurs arithmétiques à Swift

est-il possible d'avoir un éventail d'opérateurs arithmétiques à Swift? Quelque chose comme: xxx pré>

Je veux juste générer des chiffres de manière aléatoire, puis choisissez un opérateur arithmétique au départ de la matrice ci-dessus et effectuez l'équation. Par exemple, P>

var firstNum  = Int(arc4random_uniform(120))
var secondNum = Int(arc4random_uniform(120))
var equation = firstNum + operatorArray[Int(arc4random_uniform(3))] + secondNum // 


3 commentaires

Au lieu de stocker les opérateurs en tant que caractères, car ils sont des fonctions, vous pouvez peut-être les stocker directement, peut-être. Ensuite, vous venez d'exécuter ces fonctions avec les opérandes? Aucune idée si cela fonctionnerait.


Jshier, j'ai essayé de les stocker directement mais cela n'a pas fonctionné. Peut-être que je dois préciser le type ... Je n'ai pas essayé ça.


les stocker comme des fonctions travaillées.


3 Réponses :


14
votes

Ce sera - mais vous devez utiliser les opérateurs un peu différemment.

opérateur unique: xxx

et avec un tableau, vous pouvez utiliser carte pour appliquer chacun: xxx


1 commentaires

Merci. Cela a fonctionné soigneusement. J'ai utilisé les relevés de commutation d'abord (travaillé mais pas très élégant) avant d'obtenir toutes les réponses sur ma question, mais je vais maintenant aller avec votre approche.



0
votes

Ceci est une approche orientée objet de la mode.

protocol Operation {
    func calculate(op1:Int, op2:Int) -> Int
}

class Addition : Operation {
    func calculate(op1: Int, op2: Int) -> Int {
        return op1 + op2
    }
}

class Subtraction : Operation {
    func calculate(op1: Int, op2: Int) -> Int {
        return op1 - op2
    }
}

class Multiplication : Operation {
    func calculate(op1: Int, op2: Int) -> Int {
        return op1 * op2
    }
}

class Division : Operation {
    func calculate(op1: Int, op2: Int) -> Int {
        return op1 / op2
    }
}

var operatorArray : [Operation] = [Addition(), Subtraction(), Multiplication(), Division()]

var firstNum  = Int(arc4random_uniform(120))
var secondNum = Int(arc4random_uniform(120))

var equation = operatorArray[Int(arc4random_uniform(3))].calculate(firstNum, op2: secondNum)


2 commentaires

Une approche intéressante (et peut-être plus courte) est utilisée dans la classe de programmation Standford iOS 2014, mais au lieu de classes et d'un protocole, il utilise un énumé, qui sont assez flexibles à Swift.


Merci, je vais y jeter un coup d'oeil.



1
votes

Vous pouvez utiliser nsexpression forte> classe pour faire la même chose.

var operatorArray = ["+", "-", "*", "/"]
var firstNum      = Int(arc4random_uniform(120))
var secondNum     = Int(arc4random_uniform(120))
var equation      = "\(firstNum) \(operatorArray[Int(arc4random_uniform(3))]) \(secondNum)"

var exp = NSExpression(format: equation, argumentArray: [])
println(exp.expressionValueWithObject(nil, context: nil))


1 commentaires

Ou vous pouvez tirer un script Perl pour faire cela ;-) Je plaisante.