Элемент против Универсального Типа <T> - PullRequest
1 голос
/ 05 апреля 2019

Интересно, почему Swift использует Element вместо Generic <T> в следующем примере.

В чем разница между Element против T

enter image description here

Ответы [ 2 ]

5 голосов
/ 05 апреля 2019

От Универсальные :

Параметры типа

Параметры типа указывают и присваивают имя типу заполнителя и записываются сразу после имени функции, между парой соответствующих угловых скобок (например, <T>).

Параметры типа именования

В большинстве случаев параметры типа имеют описательные имена, такие как Ключ и Значение в Dictionary<Key, Value> и Элемент в Array<Element>, что говорит читателю о взаимосвязи между параметром типа и универсальным типом или функцией, в которой он используется. Однако, когда между ними нет значимых отношений, традиционно называть их, используя отдельные буквы, такие как T, U и V, такие как T в функции swapTwoValues(_:_:) выше.

So

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

являются идентичными функциями. Здесь тип заполнителя - это тип элемента возвращаемого массива, поэтому Element - подходящее «описательное имя».

Но в противном случае это не имеет значения, вы сами выбираете имя для заполнителя, балансируя между удобочитаемостью и краткостью.

2 голосов
/ 05 апреля 2019

T не особенно традиционно. В FP Backus использует T, но ML примерно в то же время использует a. Haskell использует a, Scala использует A. Там есть выбор вариантов.

У Swift, однако, есть веские причины использовать описательные имена. Во-первых, это довольно описательный язык. Типы названы полностью прописанными словами. Методы, как правило, грамотны в строительстве. Переменные и свойства редко сокращаются. Нет причин, по которым параметры типа должны быть однозначно неясными.

Он также хорошо сочетается с ассоциированными типами, которые вполне естественны. Как бы вы назвали индексный тип Collection кроме Index? Почему его тип "элемент" должен быть специально сокращен? И если Array реализует Collection, почему он должен создавать отдельное имя (T), которое он должен был бы связать с Элементом Collection? Зачем вам все это специально делать, чтобы имя типа не было интуитивно понятным?

Более глубокий вопрос: почему бы не элемент массива назвать элементом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...