Swift3 如何设置数组<;对象>;在字典里<;字符串,AnyObject>;-迅捷3

Swift3 如何设置数组<;对象>;在字典里<;字符串,AnyObject>;-迅捷3,swift3,Swift3,我是斯威夫特的新手。我正在尝试向字典中的特定键添加数组 我有以下代码: var myArray : Array<Links> = [] var myDict : Dictionary<String, AnyObject> = [:] myDict["links"] = myArray as AnyObject? // I need help in this row, It does not work. 请考虑一下,我已经把其余的都做好了。我唯一的问题是如何在字典中添

我是斯威夫特的新手。我正在尝试向字典中的特定键添加数组

我有以下代码:

var myArray : Array<Links> = []
var myDict : Dictionary<String, AnyObject> = [:]

myDict["links"] = myArray as AnyObject?  // I need help in this row, It does not work.
请考虑一下,我已经把其余的都做好了。我唯一的问题是如何在字典中添加我的数组,正如上面代码中所注释的那样

我的JSON结构:

我希望我能说清楚。
谢谢。

首先,不要强制转换类型,也不要注释类型,除非编译器抱怨

第二个JSON字典是Swift 3中的
[String:Any]

此外,建议使用以下语法创建空集合对象:

var myDict = Dictionary<String, Any>()
只需分配:

myDict["links"] = myArray
即使有一个结构

struct Link {
    var key1, key2, name, link : String
}
数组字典是

let linkDictionary = [
    0: Link(key1:"a", key2: "b", name: "c", link: "d"),
    1: Link(key1:"e", key2: "f", name: "g", link: "h")]
如果值类型为
Any

myDict["links"] = linkDictionary

首先,除非编译器抱怨,否则不要强制转换类型

第二个JSON字典是Swift 3中的
[String:Any]

此外,建议使用以下语法创建空集合对象:

var myDict = Dictionary<String, Any>()
只需分配:

myDict["links"] = myArray
即使有一个结构

struct Link {
    var key1, key2, name, link : String
}
数组字典是

let linkDictionary = [
    0: Link(key1:"a", key2: "b", name: "c", link: "d"),
    1: Link(key1:"e", key2: "f", name: "g", link: "h")]
如果值类型为
Any

myDict["links"] = linkDictionary

假设,
links
确实是一个数组,那么它将是:

var dictionary: [String: Any] = [
    "id": "blabla",
    "links": [
        ["key1": "a", "key2": "b", "name": "c", "link": "d"],
        ["key1": "e", "key2": "f", "name": "j", "link": "h"]
    ]
]

// retrieve links, or initialize it if not found

var links = dictionary["links"] as? [[String: String]] ?? [[String: String]]()

// add your new link to local dictionary

links.append(["key1": "k", "key2": "l", "name": "m", "link": "n"])

// update original structure

dictionary["links"] = links

不过,就我个人而言,当我看到像您的
链接那样的重复字典结构时,这就需要这些对象的真实模型。例如:

struct Foo {
    let id: String
    var links: [Link]?
}

struct Link {
    let key1: String
    let key2: String
    let name: String
    let link: String
}

var foo = Foo(id: "blabla", links: [
    Link(key1: "a", key2: "b", name: "c", link: "d"),
    Link(key1: "e", key2: "f", name: "j", link: "h") 
])

foo.links?.append(Link(key1: "k", key2: "l", name: "m", link: "n"))
现在,在后一个例子中,我假设
links
实际上是一个数组,而不是一个字典,但这并不是我的重点。我的主要观察结果是,如果您使用适当的自定义类型,而不仅仅是数组和字典,那么代码的可读性和健壮性会更高

如果您需要将这些模型对象发送和接收到某个web服务,那么您可以将该模型对象映射到JSON和从JSON映射。但对实际模型使用自定义类型


如果您想使上述类型易于转换为JSON或从JSON转换为JSON,您可以使用其中一个对象映射库,这样您就可以自己做一些事情,例如:

protocol Jsonable {
    var jsonObject: Any { get }
    init?(jsonObject: Any)
}

extension Foo: Jsonable {
    var jsonObject: Any {
        return [
            "id": id,
            "links": links?.map { $0.jsonObject } ?? [Any]()
        ]
    }

    init?(jsonObject: Any) {
        guard let dictionary = jsonObject as? [String: Any],
            let id = dictionary["id"] as? String else { return nil }

        var links: [Link]?
        if let linksDictionary = dictionary["links"] as? [Any] {
            links = linksDictionary.map { Link(jsonObject: $0)! }
        }

        self.init(id: id, links: links)
    }
}

extension Link: Jsonable {
    var jsonObject: Any { return [ "key1": key1, "key2": key2, "name": name, "link": link ] }

    init?(jsonObject: Any) {
        guard let dictionary = jsonObject as? [String: Any],
            let key1 = dictionary["key1"] as? String, 
            let key2 = dictionary["key2"] as? String, 
            let name = dictionary["name"] as? String, 
            let link = dictionary["link"] as? String else {
                return nil
        }
        self.init(key1: key1, key2: key2, name: name, link: link)
    }
}
然后你可以做一些事情,比如:

let object = try JSONSerialization.jsonObject(with: data)
var foo = Foo(jsonObject: object)!
或:


假设,
links
确实是一个数组,那么它将是:

var dictionary: [String: Any] = [
    "id": "blabla",
    "links": [
        ["key1": "a", "key2": "b", "name": "c", "link": "d"],
        ["key1": "e", "key2": "f", "name": "j", "link": "h"]
    ]
]

// retrieve links, or initialize it if not found

var links = dictionary["links"] as? [[String: String]] ?? [[String: String]]()

// add your new link to local dictionary

links.append(["key1": "k", "key2": "l", "name": "m", "link": "n"])

// update original structure

dictionary["links"] = links

不过,就我个人而言,当我看到像您的
链接那样的重复字典结构时,这就需要这些对象的真实模型。例如:

struct Foo {
    let id: String
    var links: [Link]?
}

struct Link {
    let key1: String
    let key2: String
    let name: String
    let link: String
}

var foo = Foo(id: "blabla", links: [
    Link(key1: "a", key2: "b", name: "c", link: "d"),
    Link(key1: "e", key2: "f", name: "j", link: "h") 
])

foo.links?.append(Link(key1: "k", key2: "l", name: "m", link: "n"))
现在,在后一个例子中,我假设
links
实际上是一个数组,而不是一个字典,但这并不是我的重点。我的主要观察结果是,如果您使用适当的自定义类型,而不仅仅是数组和字典,那么代码的可读性和健壮性会更高

如果您需要将这些模型对象发送和接收到某个web服务,那么您可以将该模型对象映射到JSON和从JSON映射。但对实际模型使用自定义类型


如果您想使上述类型易于转换为JSON或从JSON转换为JSON,您可以使用其中一个对象映射库,这样您就可以自己做一些事情,例如:

protocol Jsonable {
    var jsonObject: Any { get }
    init?(jsonObject: Any)
}

extension Foo: Jsonable {
    var jsonObject: Any {
        return [
            "id": id,
            "links": links?.map { $0.jsonObject } ?? [Any]()
        ]
    }

    init?(jsonObject: Any) {
        guard let dictionary = jsonObject as? [String: Any],
            let id = dictionary["id"] as? String else { return nil }

        var links: [Link]?
        if let linksDictionary = dictionary["links"] as? [Any] {
            links = linksDictionary.map { Link(jsonObject: $0)! }
        }

        self.init(id: id, links: links)
    }
}

extension Link: Jsonable {
    var jsonObject: Any { return [ "key1": key1, "key2": key2, "name": name, "link": link ] }

    init?(jsonObject: Any) {
        guard let dictionary = jsonObject as? [String: Any],
            let key1 = dictionary["key1"] as? String, 
            let key2 = dictionary["key2"] as? String, 
            let name = dictionary["name"] as? String, 
            let link = dictionary["link"] as? String else {
                return nil
        }
        self.init(key1: key1, key2: key2, name: name, link: link)
    }
}
然后你可以做一些事情,比如:

let object = try JSONSerialization.jsonObject(with: data)
var foo = Foo(jsonObject: object)!
或:

这就是解决方案:

   var arrLinks : Array<Dictionary<String, Any>> = []

   for link in myArray {                
       var dict : Dictionary<String, Any> = [:]

       dict["key1"] = link.name
       dict["key2"] = link.ghostBefore
       dict["key3"] = link.ghostAfter

       arrLinks.append(dict)               
    }

    myDict["links"] = arrLinks as AnyObject
var-arrLinks:Array=[]
对于myArray{
变量dict:Dictionary=[:]
dict[“key1”]=link.name
dict[“key2”]=link.ghostBefore
dict[“key3”]=link.ghostAfter
arrLinks.append(dict)
}
myDict[“links”]=将链接作为任何对象
这就是解决方案:

   var arrLinks : Array<Dictionary<String, Any>> = []

   for link in myArray {                
       var dict : Dictionary<String, Any> = [:]

       dict["key1"] = link.name
       dict["key2"] = link.ghostBefore
       dict["key3"] = link.ghostAfter

       arrLinks.append(dict)               
    }

    myDict["links"] = arrLinks as AnyObject
var-arrLinks:Array=[]
对于myArray{
变量dict:Dictionary=[:]
dict[“key1”]=link.name
dict[“key2”]=link.ghostBefore
dict[“key3”]=link.ghostAfter
arrLinks.append(dict)
}
myDict[“links”]=将链接作为任何对象

你说的“它不工作”是什么意思?什么是链接?“它不工作”是什么意思?什么是
Links
?我想说
var myDict=[String:Any]()
更像是惯用的Swift。@哈米什语的确如此,但对于初学者来说,
[]
[:]
之间的细微差别可能比具体的
更令人困惑。谢谢你的回答,但你确实做到了我所做的。唯一的变化是演员阵容。如果我没有在此行中添加“AnyObject”
myDict[“links”]=myArray作为AnyObject?
我收到一个编译器错误,提示“无法将数组类型的值分配给AnyObject”。我刚刚添加了一个打印控制台,我的json就是这样产生的:
id=“blala”;links=(“MyProject.Link”、“MyProject.Link”、“MyProject.Link”)
那么您的
链接
结构(名称应为单数)或其他错误的类型注释有问题。不要在Swift 3中使用任何对象。我更新了答案。实际上“链接”是一个类。这可能是个问题吗?我想说
var myDict=[String:Any]()
更像是惯用的Swift。@哈米什语的确如此,但对于初学者来说,
[]
[:]
之间的细微差别可能比具体的
更令人困惑。谢谢你的回答,但你确实做到了我所做的。唯一的变化是演员阵容。如果我没有在此行中添加“AnyObject”
myDict[“links”]=myArray作为AnyObject?
我收到一个编译器错误,提示“无法将数组类型的值分配给AnyObject”。我刚刚添加了一个打印控制台,我的json就是这样产生的:
id=“blala”;links=(“MyProject.Link”、“MyProject.Link”、“MyProject.Link”)
那么您的
链接
结构(名称应为单数)或其他错误的类型注释有问题。不要在Swift 3中使用任何对象。我更新了答案。实际上“链接”是一个类。可能是问题吗?hello@Rob如果可能的话,请帮助我如何为这个ur编写一个模型类