元素与通用类型<t>

时间:2019-04-05 20:15:56

标签: swift

我想知道为什么在以下示例中Swift使用Element而不是Generic <T>

ElementT有什么区别

enter image description here

2 个答案:

答案 0 :(得分:5)

来自Generics

  

类型参数

     

类型参数指定并命名一个占位符类型,并在函数名称后立即写在一对匹配的尖括号(例如<T>)之间。

     

命名类型参数

     

在大多数情况下,类型参数具有描述性名称,例如Dictionary<Key, Value>中的键和值以及Array<Element>中的Element,它告诉读者类型参数与泛型类型或函数之间的关系。但是,当它们之间没有有意义的关系时,通常会使用单个字母(例如T,U和V)来命名它们,例如上述swapTwoValues(_:_:)函数中的T。

所以

func createArray<Element>(element: Element) -> [Element] { ... }
func createArray<T>(element: T) -> [T] { ... }
func createArray<Rumpelstilzchen>(element: Rumpelstilzchen) -> [Rumpelstilzchen] { ... }

是相同的功能。这里的占位符类型是返回数组的元素类型,因此Element是合适的“描述性名称”。

但是这没有什么区别,是否由您选择占位符的名称,以在可读性和简洁性之间取得平衡。

答案 1 :(得分:2)

T不是特别传统。在FP中,Backus使用T,但是ML大约同时使用a。 Haskell使用a,Scala使用A。有很多选择。

但是,Swift有充分的理由使用描述性名称。首先,这是一种描述性的语言。类型用完全拼写的单词命名。方法通常在构造上是素养的。变量和属性很少缩写。没有理由类型参数应该是唯一隐晦的。

它也很自然地与关联类型匹配。除了Index之外,您还称呼Collection的索引类型是什么?为什么要特别缩写其“ element”类型?如果Array实现了Collection,为什么还要创建一个唯一的名称(T),然后将其与Collection的Element相关联?您为什么要特例化所有这些,只是为了使类型名称不直观?

更深层的问题是,为什么 数组的元素不称为Element?