在其他高级语言中,您可以使用模式匹配进行函数重载,例如在Mathematica中。例如,你可以编写没有if语句的优雅代码,这是我的意思的一个例子:
唱斐波那契:
fib[0|1] := 1
fib[n_Integer?Positive] := fib[n - 1] + fib[n - 2]
fib[n__] := fib /@ {n}
fib[n_] := "undefined"
下面是:
In[]:= fib[10]
Out[]= 89
In[]:= {fib[-2], fib["2"]}
Out[]= {"undefined", "undefined"}
In[]:= fib[1, 2, 3, 4, 5, 6, 7]
Out[]= {1, 2, 3, 5, 8, 13, 21}
对于基于模式的参数或类似的东西,swift是否具有此类功能?
答案 0 :(得分:2)
Swift在其重载中没有模式匹配,只有类型&协议匹配。你能做的最好的是:
func fib(n: Int) -> Int {
switch n {
case 0, 1: return 1
default: return fib(n - 1) + fib(n - 2)
}
}
func fib(s: [Int]) -> [Int] {
return s.map { fib($0) }
}
fib(10) // 89
fib([3, 4, 5]) // [3, 5, 8]
我将处理负面输入作为读者的练习。 :)
可以处理任何整数输入的完全通用版本将使用泛型函数,如下所示:
func fib<T: IntegerType>(n: T) -> T {
switch n {
case 0, 1: return 1
default: return fib(n - 1) + fib(n - 2)
}
}
func fib<S: SequenceType, T : IntegerType where T == S.Generator.Element>(s: S) -> [T] {
return map(s) { n in
return fib(n)
}
}