答案 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?