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"]);
ПРИМЕЧАНИЕ: если вы не знаете, как использовать литералы, просто не используйте их.