为什么通用元素在定义为Double时表现不同?

时间:2018-11-14 13:41:18

标签: swift generics

我有一个简单的课程:

class DimensionTree<Element> {

    var spot:Element
    var nextDim: [DimensionTree<Element>]

    init(_ spot:Element, _ nextDim: [DimensionTree<Element>] = [] ) {
        self.spot = spot
        self.nextDim = nextDim
    }
}

然后我尝试在扩展中添加类函数:

extension DimensionTree {
    class func makeTreeFrom(_ spots:[[Element]], from level:Int = 0) -> [DimensionTree <Element>]{
        if spots.count > 0, spots[0].count > 0 {
            var trees :[DimensionTree<Element>] = []
            let axisSpots = Set(spots.map { $0[0] })
            // Here I got an error: "Type 'Element' has no subscript members"
            //... some code
            return trees
        }
        return []
    }
}

我收到一个错误"Type 'Element' has no subscript members"。但是,如果我分配Element == Double:

extension DimensionTree where Element == Double

扩展名可以编译并正常工作。 Double也没有subscript members,Elelment在列表列表中...为什么它不能编译?

1 个答案:

答案 0 :(得分:4)

该错误消息具有误导性。只能从Set创建Hashable 元素。 Double确实符合Hashable协议,因此

extension DimensionTree where Element == Double { ... }

编译。通常,您可以使用

来限制扩展名
extension DimensionTree where Element: Hashable { ... }

使其编译。