首页 > 解决方案 > 为什么定义为 Double 时泛型 Element 的行为会有所不同?

问题描述

我有一个简单的课程:

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,元素在列表列表中......为什么它无法编译?

标签: swiftgenerics

解决方案


错误消息具有误导性。ASet只能从Hashable 元素创建。Double确实符合Hashable协议,这就是为什么

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

编译。通常,您可以使用

extension DimensionTree where Element: Hashable { ... }

使其编译。


推荐阅读