在swift中使用.filter():错误:无法转换类型的值'([V]) - >布尔'预期参数类型'([_]) - >布尔'

时间:2015-12-20 14:34:44

标签: swift generics

我尝试使用Graph方法创建outEdges类(仅仅是为了学习Swift,而不是因为我需要Graph类)。

我以为我可以使用.filter()来实现outEdges方法,但是我收到了这个错误:

error: cannot convert value of type '([V]) -> Bool' to expected argument type '([_]) -> Bool'
        return edges.filter(leftVertexIs(v))
                            ^~~~~~~~~~~~~~~

使用此代码:

class Graph<V: Equatable> {
    var edges = [[V]]()

    func addEdge(v1: V, _ v2: V) -> Graph<V> {
        edges.append([v1, v2])
        return self
    }

    func leftVertexIs(v: V) -> (([V]) -> Bool) {
        return {(e: [V]) -> Bool in return e[0] == v}
    }

    func outEdges(v: V) -> [V] {
        return edges.filter(leftVertexIs(v))
    }
}

var g = Graph<Int>()
g.addEdge(2, 4).addEdge(4, 6).addEdge(3, 5).addEdge(2, 7)
g.outEdges(2)

(注意:我将过滤谓词移动到闭包中以确保它正常工作)

1 个答案:

答案 0 :(得分:2)

edges的类型为[[V]],然后是edges.filter() 具有相同的类型,应该是outEdges的返回类型:

func outEdges(v: V) -> [[V]] {
    return edges.filter(leftVertexIs(v))
}

备注:您应该考虑使用元组(left : V , right : V)struct,而不是将每个边存储为双元素数组。