Swift: dictionaries inside array

寵の児 提交于 2020-01-11 07:17:29

问题


Data:

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

How can I have this kind of structure using swift array and dictionary? This data shows dictionaries inside an array, right? So I suggest:

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

but this gives me the error:

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

Any ideas?


回答1:


The correct way is:

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

which is equivalent to:

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

What your code does instead is to create an array filled in with an instance of Dictionary<String, String>, whereas I presume you want an empty instance of the array containing elements of Dictionary<String, String> type.




回答2:


Which version of Xcode have you got? Your code should work fine but the line:

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

create the array with first empty dictionary, try this instead:

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

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

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

println(persons)



回答3:


Are you sure you really want a dictionary within an array? The code you've given indicates more an array with named columns, which can be achieved using something like the following:

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"

These are proper arrays and adressed as such using subscripts. The dictionary type is usually a combination of key and value, i.e. nickname as key, and name as value.

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

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

And here we lookup on the key value, and get an optional value in return, which I forcefully unwrapped...

All of these can be appended rather easily, but do note that the named tuple variant, persons2, is not following recommended practice. Also note that the Array of Dictionaries allow for inclusion on different keys as suggested in my last injection.

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"] )



回答4:


something like this can work for you:

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

and now you can add the names:

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

NOTE: if you are insecure how to use literals, just don't use them.



来源:https://stackoverflow.com/questions/26734986/swift-dictionaries-inside-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!