参数中的运算符(Swift)

时间:2016-09-02 21:15:25

标签: swift operators

我对swift编程都很陌生,我尝试创建一个函数,它根据三个参数(运算符类型)和两个应该计算的数字来解决简单的数学计算。经过一段时间后,我已经使它工作到我满意的程度,代码看起来像这样:

 if operatorType == "*" || operatorType == "-"....
 return number1 + operatorType + number2 

正如我所说,它运作得相当好。我必须在带有引号的operatorType中加入,因为它是一个String类型,我试图摆脱它们而没有任何成功。

但现在到了这一点:

我尝试使代码更简单一些,我在想:可以在一个代码中插入整个“使用与参数相同的运算符”吗?我尝试过:

&fl=*,[fl.rm v="title"]

使它成为正确的等式,但没有任何成功。所以我的问题是,我认为是正确的,有可能这样做,在那种情况下,怎么样?即使它是非常基本的代码,也许可以使用更有效的方式使用更少的代码,这实际上也可以更好。

谢谢!

编辑: 将名称更改为不那么模糊的名称。

2 个答案:

答案 0 :(得分:1)

您选择的示例是解释Higher-order Functions(HOM)的标准示例。

HOM是一个函数,它将另一个函数(或仿函数)作为输入并使用它来完成任务 在Swift中,编写它们的一种方法是使用闭包作为参数。

在您的示例中,您的函数不会使用字符串来切换计算,而是使用闭包 在这个简单的例子中,函数只执行闭包并返回值。

func calculate(op:((Int, Int)-> Int), operandA: Int, operandB: Int) -> Int {
    return op(operandA, operandB)
}

您的操作员关闭看起来像

let addition: ((Int, Int)-> Int) = {
    return $0 + $1
}

let substruction: ((Int, Int)-> Int) = {
    return $0 - $1
}

你会像

那样执行它
let result = calculate(addition, operandA: 1, operandB: 3)

这可能看起来有点过于复杂和学术性,但实际上我们使用Swift的许多方法都是HOM。例如mapfilter。虽然它们更先进,但它们是通用的,这意味着它们可以接受的不仅仅是Int参数。但我不想在这篇文章中介绍它......

答案 1 :(得分:0)

Swift还没有必要的Reflection系统来获取字符串名称的任意函数(例如你正在使用的那些运算符函数)。

您可以使用switch语句改进代码:

func performOperation1(operatorName: String, _ operand1: Double, _ operand2: Double) -> Double {
    switch (operatorName) {
    case "+": return operand1 + operand2
    case "-": return operand1 - operand2
    case "*": return operand1 * operand2
    case "/": return operand1 / operand2
    default: fatalError("Unsupported Operator Name")
    }
}

为避免重复operand1operand2,您可以将运算符函数存储到闭包变量中,并在结尾调用一次:

func performOperation(operatorName: String, _ operand1: Double, _ operand2: Double) -> Double {
    var f: (Double, Double) -> Double

    switch (operatorName) {
    case "+": f = (+)
    case "-": f = (-)
    case "*": f = (*)
    case "/": f = (/)
    default: fatalError("Unsupported Operator Name")
    }

    return f(operand1, operand2)
}