如何在Swift中使用模式匹配重载函数?

时间:2014-09-11 17:39:58

标签: swift pattern-matching overloading func

在其他高级语言中,您可以使用模式匹配进行函数重载,例如在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是否具有此类功能?

1 个答案:

答案 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)
    }
}