2016-07-10 12 views
1

Was ist der Unterschied zwischen einem beliebigen Typ und einem generischen Typ in swift?Der Unterschied zwischen einem beliebigen Typ und einem generischen Typ in swift

Jeder Typ Beispiel:

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

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

Generisches Typ Beispiel:

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

Ist dies eine Frage der Präferenz, weil beide das gleiche Problem zu lösen scheinen durch die Möglichkeit, die gewünschte Art zu ersetzen.

+4

Kurz: Das erste Array kann 'String' ** und **' Int' enthalten. Das zweite Array kann 'String' ** oder **' Int' enthalten. – vadian

Antwort

3

Ich werde Generika im Detail nicht erklären, und ich werde nur die wesentlichen Unterschiede aufzeigen.

Im ersten Beispiel können Sie einen beliebigen Typ in diesem Array anfügen, ohne vorher das Array auf einen bestimmten Typ einschränken zu können und die Kompilierungszeitüberprüfungen zu nutzen, um sicherzustellen, dass das Array nicht enthalten ist Fremdarten. In diesem Beispiel ist nicht viel zu sehen. Das zweite Beispiel enthält stattdessen eine generische Funktion, die alle oben genannten Funktionen bereitstellt. Kohärenzprüfungen des Inhalts des Arrays werden kostenlos angeboten. Wenn Sie möchten, können Sie auch weitere Merkmale dieses generischen Typs angeben T, wie die Anforderung, dass es ein spezifisches Protokoll implementiert (z. B. Grenzwert duplicate() zu Objekt, das Comparable oder Equatable implementieren).

Aber das ist nur ein einfaches Beispiel für eine generische Funktion, Sie können auch parametrisierte Klassen (was Sie am meisten verwenden) und es gibt eine Menge zusätzlicher Funktionalitäten.

Verwenden Sie nie Any als armer Mann Generika, echte Generika sind viel flexibler, fügen Sie nützliche Prüfungen und machen Sie Ihre Absichten expliziten, mit minimalem zusätzlichen Aufwand erforderlich, um sie zu implementieren.

2

Any bedeutet „Ich will keine Typprüfung und ich werde typspezifische Methoden nicht ohne aufrufen können, um sich für Castings“

Zum Beispiel versuchen zu nennen:

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

A Der generische Typ ist ein Platzhalter für einen Typ. Wenn sie verwendet wird, wird ein Betontyp verwendet (z. B. ein Int oder ein String).

Kurz gesagt, nie Any verwenden. Es gibt sehr wenige spezifische Situationen, wenn Any ist, was Sie verwenden möchten.

+0

Wenn Sie "einen konkreten Typ" @Sultan sagen, beziehen Sie sich nur auf Ints, Strings, Doubles, Arrays, etc. und nicht auf benutzerdefinierte Typen wie die von benutzerdefinierte Klassen? Es klingt wie ein Generic ist mehr, wenn Sie nicht wissen, was der Typ vor der Hand während der Programmierung sein wird, ist das eine genaue Aussage? –

+0

Der konkrete Typ ist der Typ, den Sie verwenden, wenn Sie eine generische (auch parametrische) Funktion/Klasse verwenden. Es kann alles sein, auch eine Ihrer benutzerdefinierten Klassen/Strukturen. –