我对swift编程都很陌生,我尝试创建一个函数,它根据三个参数(运算符类型)和两个应该计算的数字来解决简单的数学计算。经过一段时间后,我已经使它工作到我满意的程度,代码看起来像这样:
if operatorType == "*" || operatorType == "-"....
return number1 + operatorType + number2
正如我所说,它运作得相当好。我必须在带有引号的operatorType中加入,因为它是一个String类型,我试图摆脱它们而没有任何成功。
但现在到了这一点:
我尝试使代码更简单一些,我在想:可以在一个代码中插入整个“使用与参数相同的运算符”吗?我尝试过:
&fl=*,[fl.rm v="title"]
使它成为正确的等式,但没有任何成功。所以我的问题是,我认为是正确的,有可能这样做,在那种情况下,怎么样?即使它是非常基本的代码,也许可以使用更有效的方式使用更少的代码,这实际上也可以更好。
谢谢!
编辑: 将名称更改为不那么模糊的名称。
答案 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。例如map
和filter
。虽然它们更先进,但它们是通用的,这意味着它们可以接受的不仅仅是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")
}
}
为避免重复operand1
和operand2
,您可以将运算符函数存储到闭包变量中,并在结尾调用一次:
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)
}