Swift: словари внутри массива

Данные:

[
    { firstName: "Foo", lastName: "Bar" },
    { firstName: "John", lastName: "Doe" }
]

Как я могу иметь такую ​​структуру, используя массив swift и словарь? Эти данные показывают словари внутри массива, верно? Поэтому я предлагаю:

var persons:Array = [Dictionary<String, String>()]

но это дает мне ошибку:

Cannot convert the expressions type () to type Array<T>

Есть идеи?

4 ответа

Решение

Правильный путь:

var persons = [Dictionary<String, String>]()

что эквивалентно:

var persons = [[String : String]]()

Вместо этого ваш код создает массив, заполненный экземпляром Dictionary<String, String>в то время как я предполагаю, что вы хотите пустой экземпляр массива, содержащий элементы Dictionary<String, String> тип.

Какая версия Xcode у вас есть? Ваш код должен работать нормально, но строка:

var persons:Array = [Dictionary<String, String>()]

создайте массив с первым пустым словарем, попробуйте вместо этого:

var persons:Array = [Dictionary<String, String>]()

var dic1 = ["Name" : "Jon"]
var dic2 = ["Surname" : "Smith"]

persons.append(dic1)
persons.append(dic2)

println(persons)

Вы уверены, что действительно хотите словарь в массиве? Код, который вы дали, указывает больше на массив с именованными столбцами, чего можно добиться, используя что-то вроде следующего:

struct Name {
    var firstName : String
    var lastName : String
}

var persons1 : Array<Name> =  [
    Name(firstName: "Foo", lastName: "Bar"),
    Name(firstName: "John", lastName: "Doe")
]
persons1[0].firstName       // "Foo"

var persons2 : Array<(firstName: String, lastName:String)> = [
    (firstName: "Mary", lastName: "Mean"),
    (firstName: "Foo", lastName: "Bar"),
    (firstName: "John", lastName: "Doe")
]

 persons2[1].firstName     // "Bar"

Это правильные массивы, которые как таковые используются с использованием индексов. Тип словаря обычно представляет собой комбинацию ключа и значения, то есть псевдоним в качестве ключа и имя в качестве значения.

var nickNames : [String:String] =  [
    "mame" : "Mary Mean",
    "foba" : "Foo Bar",
    "jodo" : "John Doe"]

nickNames["mame"]!  // "Mary Mean"

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

Все они могут быть добавлены довольно легко, но обратите внимание, что названный вариант кортежа, persons2, не следует рекомендуемой практике. Также обратите внимание, что Array of Dictionaries допускает включение на разных клавишах, как было предложено в моей последней инъекции.

persons1.append( Name(firstName: "Some", lastName: "Guy") )
persons2.append( firstName: "Another", lastName: "Girl" )

nickNames["anna"] = "Ann Nabel"

// Array of Dictionaries
var persons : [[String:String]] = [
    [ "firstName" : "Firstly", "lastName" : "Lastly"],
    [ "firstName" : "Donald", "lastName" : "Duck"]
]

persons.append( ["firstName" : "Georg", "middleName" : "Friedrich", "lastName" : "Händel"] )

Что -то подобное может работать на вас:

var persons: Array<Dictionary<String, String>> = Array()

и теперь вы можете добавить имена:

persons.append(["firstName": "Foo", "lastName": "Bar"]);
persons.append(["firstName": "John", "lastName": "Doo"]);

ПРИМЕЧАНИЕ: если вы не знаете, как использовать литералы, просто не используйте их.

Другие вопросы по тегам