2014-10-02 5 views
6

Dieser Code funktioniert,Warum können Sie in Swift kein leeres Array initialisieren?

let people = ["Tom","Dick","Harry"] 

aber dieser Code nicht,

let people = [] 

und noch tut dies (Veränderlichkeit zählt nicht) ohne ersichtlichen Grund nicht funktioniert:

var people = [] 

Die Der Fehler ist "Kann den Ausdruckstyp Array nicht in den Typ 'ArrayLiteralConvertible' konvertieren, aber das ergibt für mich keinen Sinn und none von otherquestions die in einer Suchadresse diese Frage zeigen.

Zuerst dachte ich, es mit Typinferenz zu tun hatte, aber das beweist nicht das Problem zu sein (zumindest nicht nur, dass!) Da, obwohl dies funktioniert (mit Typ angegeben)

var people:Array = [""] 

dies tut nicht (wie oben angegeben mit Typ, aber kein String innerhalb des Array angegeben):

var people:Array = [] 

Seit dem letzten dieser beiden den Typ explizit angegeben hat, sollte es nicht einen String innerhalb des Array übergeben müssen.

Einige Sprachen (weirdly!) Betrachten die Art der Variablen auf die Art des Artikels innerhalb Array zu verweisen, also versuchte ich auch String statt Array angibt, aber die gleichen Ergebnisse erhielt. Das erste Werk und die zweite nicht:

var people:String = [""] 
var people:String = [] 
+0

Typ-Inferenz benötigt genügend Kontext, um daraus abzuleiten. –

+1

Das * hat * mit Typinterferenzen zu tun - der Schlüssel ist, dass es mehr mit dem Typ zu tun hat, den das Array * enthält *, als mit dem Typ der Variablen 'people'. Der Compiler * weiß * es ist ein 'Array'. Aber die Frage ist: Ein 'Array' von * was *? –

Antwort

10

Die Syntax, die Sie suchen ist

let people : [String] = [] 

oder

let people = [String]() 

in beiden Fällen, Sie [String] mit Array<String>

Für diesen Code

let people = [] 
ersetzen kann

Es ist unmöglich für den Compiler, den Typ people herauszufinden. Welchen Typ erwarten Sie?

Hinweis Array ist kein vollständiger Typ, da es den generischen Teil erfordert. Ein vollständiger Typ ist wie Array<String>

2

Sie dies tun können

let blankArray = [String]() 

oder ny andere Art Sie benötigen.

Verwandte Themen