2016-07-10 7 views
1

В чем разница между типом и общим типом в swift?Разница между любым типом и общим типом в swift

Любой тип Пример:

let swiftInt: Int = 1 
let swiftString: String = "miao" 

var array: [Any] = [] 
array.append(swiftInt) 
array.append(swiftString) 

Родовой тип Пример:

func duplicate<T>(item: T, numberOfTimes n: Int) -> [T] { 
    var buffer : [T] = [] 
    for _ in 0 ..< n { 
    buffer.append(item) 
    } 
    return buffer 
} 

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

+4

Вскоре: первый массив может содержать 'String' ** и **' Int'. Второй массив может содержать 'String' ** или **' Int' – vadian

ответ

3

Я не буду подробно описывать дженерики, и я просто укажу существенные различия.

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

Второй пример содержит вместо этого общую функцию, которая предоставляет все вышеперечисленные функции, проверки целостности содержимого массива будут доступны бесплатно, и если вы хотите, вы также сможете указать дополнительные характеристики этого общего типа T, например, запрашивая, что он реализует конкретный протокол (например, ограничение duplicate() для объекта, который реализует Comparable или Equatable).

Но это простой пример универсальной функции, вы также можете иметь параметризованные классы (то, что вы будете использовать больше всего), и есть много дополнительных функций.

Никогда не используйте Any в качестве дженериков бедных, реальные дженерики являются более гибкими, добавляют полезные проверки и более четко выражают ваши намерения с минимальными дополнительными усилиями, необходимыми для их реализации.

2

Any означает «Я не хочу никакой проверки типа и я не буду иметь возможность вызывать методы типа конкретных без литья»

Например, попробуйте позвонить:

var array: [Any] = [1, 2] 
var sum = array[0] + array[1] // you cannot do this! you have to cast to Int first 

Тип общего типа является заполнителем для типа. При использовании вместо него используется конкретный тип (например, Int или String).

Одним словом, никогда не используйте Any. Очень мало особых ситуаций, когда Any - это то, что вы хотите использовать.

+0

Когда вы говорите «конкретный тип» @Sulthan, вы имеете в виду только ints, строки, парные, массивы и т. Д., А не настраиваемые типы, например созданные из пользовательские классы? Похоже, что Generic больше подходит, если вы не знаете, какой тип будет перед рукой во время программирования, это точная формулировка? –

+0

Конкретный тип - это тип, который вы хотите использовать, когда вы будете использовать универсальную (также называемую параметрическую) функцию/класс. Это может быть что угодно, один из ваших собственных классов/структур. –

Смежные вопросы