在通用实现中无法将[Int]转换为[Int]

时间:2015-11-24 10:33:46

标签: swift generics swift2

尝试创建一个通用数据源我遇到了这个错误,我想知道为什么这不可编译。

错误:

无法将'[Int]'类型的返回表达式转换为返回类型'[Int]'

代码:

protocol DataSource {
    func getData<T> () -> [T]
}

class IntDataSource<Int>: DataSource {
    let data:[Int] = []
    func getData<Int>() -> [Int] {
        return data
    }
}

在IntDataSource的return语句中抛出错误。

我知道这可以用更好的方式完成

typealias DataType
var data: DataType? { get }

但我主要感兴趣的是为什么编译器不想接受return语句。有什么想法吗?

编辑:

问题的一部分也是为什么如果以前的代码不可编译是下面的公平游戏?

class IntDataSource<Int>: DataSource {
    func getData<Int>() -> [Int] {
        let data:[Int] = []
        return data
    }
}

编辑2:

此版本也可以无问题地编译

class IntDataSource<Int>: DataSource {

    func getData<Int>() -> [Int] {
        return getIntData()
    }

    func getIntData<Int>() -> [Int] {
        let data:[Int] = []
        return data
    }
}

1 个答案:

答案 0 :(得分:6)

&#34;奇怪&#34;编译错误

Cannot convert return expression of type '[Int]' to return type '[Int]'

可以解释如下:

班级定义中的<Int><Int> 在方法定义中引入了一个新的泛型 类型占位符名为Int(因此外部<Int>隐藏具有相同名称的全局类型,内部<Int>隐藏 外面的)。您的类定义等同于

class IntDataSource<A>: DataSource {
    let data:[A] = []
    func getData<B>() -> [B] {
        return data 
    }
}

现在编译错误是可以理解的:

cannot convert return expression of type '[A]' to return type '[B]'