swift - 为什么定义为 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
,元素在列表列表中......为什么它无法编译?
解决方案
错误消息具有误导性。ASet
只能从Hashable
元素创建。Double
确实符合Hashable
协议,这就是为什么
extension DimensionTree where Element == Double { ... }
编译。通常,您可以使用
extension DimensionTree where Element: Hashable { ... }
使其编译。
推荐阅读
- oracle - 从包含 Oracle 中的命名空间的 XMLTYPE 中提取标记值
- c# - 从 Visual Studio 2013 更新到 2019 后,注册 Tagprefix="SharePoint" 自动添加到 aspx 页面
- javascript - 带有 v-if 或计算属性的 V-for
- python - 通过调用第一部分提取索引第二部分
- spring-boot - 500 内部服务器错误:[{“错误”:[“解析值时遇到意外字符:%。路径'',第 0 行,位置 0。”]}]
- vue.js - Vue 3.0 + Nuxt:模板中仍然限制“恰好一个根元素”(和:键绑定)
- mysql - 检查数据库的凭据是否对 Laravel 有效
- html - 如何垂直对齐使用“vh”单位的按钮文本?
- python - 嗨,如何根据python中的日期删除AWS中的文件?
- android - Flutter IAP - 您已经拥有此项目的错误