2014-12-24 24 views
8

Im Swift studiert und bekam verwirrend mit folgenden Syntax:Syntax Erklärung: eckige Klammern in Swift

var treasures: [Treasure] = [] 

Schatz ist benutzerdefinierte Klasse, erklärten wie folgt:

class Treasure: NSObject { 
... 

In Obj-C eckige Klammern bedeuten Methode, aber was bedeutet das:

var treasures: [Treasure] = [] 

Kann jemand erklären? Vielen Dank!

+3

Dies ist ein Array. die Linie var treasures: [Treasure] = [] deklariert ein Array namens Schätze, das Objekte der Treasure-Klasse aufnehmen soll und initialisiert es mit einem leeren Array –

Antwort

13

Ok, das ist die Bedeutung von

var treasures: [Treasure] = [] 
  • var: der Name des variablen
  • [Schatz]: Sie sind eine variable
  • Schätze erklärt: Der Typ Ihrer Variablen, in diesem Fall ist der Typ "Array of Treasure", der Compiler ermöglicht es Ihnen, nur Objekte des Typs "Treasure" einzufügen Ihr Array
  • []: das tatsächliche Objekt (Array), auf das Ihre Variable verweist, in diesem Fall ein leeres Array.

z. Wenn Sie möchten, dass das Array 2 Elemente enthält, können Sie schreiben:

Hoffe, das hilft.

Update: Mein Beispiel auch auf diese Weise geschrieben werden können

var treasures = [Treasure(), Treasure()] 

Infact dank der Type Inference der Compiler den Typ der variablen Schätze ableiten kann betrachten der Typ des zugewiesenen Wertes.

+1

Danke, ich liebe diese Erklärung, bitte sagen Sie mir, wird Compiler mir verbieten, andere Typen in Array (nicht Schatz) einzufügen? Wie deklariert man "simple" NSMutableArray ohne Typeinschränkungen? –

+1

Gern geschehen. Sie können ein Array von "AnyObject" erstellen. Es ist ein Protokoll, dem alle Klassen implizit entsprechen. Dies ermöglicht Ihnen, etwas wie diese *** var Dinge schreiben: [AnyObject] = ["Hallo Welt", 1, Treasure()] *** –

+0

Über die *** veränderbare *** Array Bitte beachten Sie, dass Sie eine erstellen veränderbares Array, wenn Sie es mit dem Schlüsselwort *** var *** deklarieren (wie Sie es getan haben). Stattdessen deklarieren Sie ein unveränderliches Array, wenn Sie das Schlüsselwort *** *** verwenden. –

12

[Treasure]ist nur eine Syntax Zucker für Array<Treasure>.

Der gleiche Weg [String:Treasure] ist nur eine Syntax Zucker für Dictionary<String,Treasure>.

[]ist nur ein leeres Array des von Ihnen definierten Typs. Genauso ist [:] ein leeres Wörterbuch.

Wenn es um schnelle und eckige Klammern geht, sind die Regeln einfach. Sie werden nur in zwei Situationen verwendet:

1) Arbeit mit Array und Wörterbuch Typen:

let vectors : [[Int]] = [[1,2,3],[4,5,6]] 
let birthBook : [Int:[String]] = [1987:["John","William"], 1990: ["Mary"]] 

2) für Subskribierung Objekte, die Indizierung zu unterstützen:

class RouteMapper { 

    private var routeMap : [String:String] = [:] 

    subscript(endpoint: String) -> String { 
     get { 
      if let route = routeMap[endpoint] { 
       return route 
      } 
      return "/" 
     } 
     set(newValue) { 
      routeMap[endpoint] = newValue 
     } 
    } 
} 

let routeMapper = RouteMapper() 
routeMapper["users"] = "/v1/confirmed/users" 
let url = routeMapper["admins"] 

Seit [ und ] sind in benutzerdefinierten Operatoren nicht erlaubt, dies sind die einzigen Verwendungen für jetzt.

+0

Ziemlich klar jetzt für mich, danke siejkowski! –

+0

Ich fand diese Antwort, indem ich versuche zu sehen, wie XCTAssertEqual (Ausdruck1: [T: U], Ausdruck2: [T: U]) funktioniert. Ist dies die dritte Möglichkeit für eckige Klammern? Ich kenne die Bedeutung von ihnen in XCTAssertEqual nicht. Hast du eine Ahnung davon? – LiweiZ

+1

@LiweiZ Es gibt nichts besonderes an ihnen. Es ist nur so, dass Ausdruck1 und Ausdruck2 vom Typ Dictionary sind. T und U sind generische Typen für diese bestimmte Variante von XCTAssertEqual. – siejkowski