2015-02-09 5 views
2

новый для программирования!Как создать массив словарей?

Я пытаюсь создать массив словарей внутри структуры в Swift так:

var dictionaryA = [ 
    "a": "1", 
    "b": "2", 
    "c": "3", 
    ] 
var dictionaryB = [ 
    "a": "4", 
    "b": "5", 
    "c": "6", 
    ] 
var myArray = [[ : ]] 
myArray.append(dictionaryA) 
myArray.append(dictionaryB) 

Это прекрасно работает в детской площадке, но когда я положил его в проект Xcode, внутри структуры, строки с функцией append вызывают ошибку «Ожидаемое объявление».

Я также пробовал использовать оператор + = с тем же результатом.

Как я могу успешно построить этот массив внутри структуры?

+0

Где код "структуры"? Отсканированный фрагмент выглядит хорошо и компилируется в порядке. – Bill

ответ

8

С вашей ошибки Expected declaration, I ass умэ вы делаете, как:

struct Foo { 
    var dictionaryA = [ 
     "a": "1", 
     "b": "2", 
     "c": "3", 
    ] 
    var dictionaryB = [ 
     "a": "4", 
     "b": "5", 
     "c": "6", 
    ] 
    var myArray = [[ : ]] 
    myArray.append(dictionaryA) // < [!] Expected declaration 
    myArray.append(dictionaryB) 
} 

Это происходит потому, что you can place only "declarations" in the struct body и myArray.append(dictionaryA) не декларация.

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

struct Foo { 
    var dictionaryA = [ 
     "a": "1", 
     "b": "2", 
     "c": "3", 
    ] 
    var dictionaryB = [ 
     "a": "4", 
     "b": "5", 
     "c": "6", 
    ] 
    var myArray = [[ : ]] 

    init() { 
     myArray.append(dictionaryA) 
     myArray.append(dictionaryB) 
    } 
} 

Но, как упоминалось @AirspeedVelocity, вы должны предоставляет более подробную информацию о myArray или myArray бы Array<NSDictionary> который я думаю, вы не ожидаете.

Во всяком случае, правильным решением будет варьироваться в зависимости от того, что вы на самом деле пытаетесь сделать:

Может быть, а может и нет, что вы хотите что-то вроде:

struct Foo { 
    static var dictionaryA = [ 
     "a": "1", 
     "b": "2", 
     "c": "3", 
    ] 
    static var dictionaryB = [ 
     "a": "4", 
     "b": "5", 
     "c": "6", 
    ] 

    var myArray = [dictionaryA, dictionaryB] 
} 

Но я не знаю, , почему бы вам не просто:

struct Foo { 

    var myArray = [ 
     [ 
      "a": "1", 
      "b": "2", 
      "c": "3", 
     ], 
     [ 
      "a": "4", 
      "b": "5", 
      "c": "6", 
     ] 
    ] 
} 
+0

Использование функции append внутри метода init, спасибо. Я должен был упомянуть, что я попытался просто объявить весь массив прямо (в соответствии с вашим последним предложением), но это заставляет Xcode застревать в процессе «индексирования». –

6

Проблема заключается в этой строке:

var myArray = [[ : ]] 

Вы должны сказать Swift, какой тип myArray это - [[:]] не хватает информации.

Вы можете сделать это явный путь:

var myArray: [[String:String]] = [[ : ]] 

Или, если это возможно, неявно с помощью первого или оба значения, которые вы планируете поставить в:

var myArray = [dictionaryA] 
var myArray = [dictionaryA,dictionaryB] 

(в качестве альтернативы явная пустая версия, вы также можете написать var myArray = [[String:String]](), что является сокращением для var myArray = Array<Dictionary<String,String>>())

0

Или вы можете использовать массив кортежей that's еще проще, например:

var myArray:[(a:String,b:String,c:String)] = [] 

И добавить любой элемент вам нужно позже:

self.myArray.append((a:"A",b:"B",c:"c")) 

И использовать их просто:

self.myArray[index].a 
self.myArray[index].b 
self.myArray[index].c