Swift T不会转换为T.

时间:2014-10-07 22:18:34

标签: swift functional-programming

func mapGen<T>(transform:((T)->T),collection:Array<T>) -> Array<T> {

    func cat<T>(initial:Array<T>,element:T) -> Array<T> {
        var mInitial = initial;
        var telement = transform(element);
            mInitial.append(telement);
        return mInitial;
    }
    var k = collection.reduce([],cat);
    return k;
}

我在尝试运行这段代码时遇到了问题。 我很快就能帮助我了吗?

我正在尝试用一个看起来不起作用的reduce函数编写一个通用映射。

2 个答案:

答案 0 :(得分:4)

下面:

func mapGen<T>(transform:((T)->T),collection:Array<T>) -> Array<T> {

您正在定义泛型类型T,并在嵌套函数中:

func cat<T>(initial:Array<T>,element:T) -> Array<T> {

你正在(重新)定义一个具有相同名称的新泛型类型,但实际上它是一个不同的类型 - 你甚至可以将它命名为V或NewType,你仍然有相同的错误。

我推断在你的情况下你希望嵌套函数使用相同的T类型,所以不要重新定义它:

 func cat(initial:Array<T>,element:T) -> Array<T> {

它应该按预期工作

答案 1 :(得分:1)

要使错误消息(当前听起来非常不合情理)更清晰,让我们重命名您的类型变量,这样您就不会有两个具有相同名称的类型变量:

func mapGen<T1>(transform:((T1)->T1),collection:Array<T1>) -> Array<T1> {

    func cat<T2>(initial:Array<T2>,element:T2) -> Array<T2> {
        var mInitial = initial;
        var telement = transform(element);
            mInitial.append(telement);
        return mInitial;
    }
    var k = collection.reduce([],cat);
    return k;
}

现在错误消息变为&#34; T1不会转换为T2&#34;,这更有意义。您收到该错误的原因是表达式transform(element)element的类型为T2,但transform期望参数类型为T1

根本问题是,您承诺cat可以使用任何给定类型,但实际上它只能使用外部T的值,因此解决方案将是只需删除cat的类型参数,并在其参数类型中使用外部T