Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将字典键和值(字符串/数组)映射到swift中的一个字符串_Arrays_Dictionary_Swift3 - Fatal编程技术网

Arrays 如何将字典键和值(字符串/数组)映射到swift中的一个字符串

Arrays 如何将字典键和值(字符串/数组)映射到swift中的一个字符串,arrays,dictionary,swift3,Arrays,Dictionary,Swift3,我有一本字典,看起来像: ["foo": "whatever", "this": "that", "category": ["cat1", "cat2"]] 我需要它是一个字符串,比如: foo=whatever&this=that&category=cat1&category=cat2 因此,如果一个键具有数组类型的值,那么该键应该在字符串中出现多次。如果您知道字典类型,我相信类似的方法应该有效: var string = "" for key in dict.ke

我有一本字典,看起来像:

["foo": "whatever", "this": "that", "category": ["cat1", "cat2"]]
我需要它是一个字符串,比如:

foo=whatever&this=that&category=cat1&category=cat2

因此,如果一个键具有数组类型的值,那么该键应该在字符串中出现多次。

如果您知道字典类型,我相信类似的方法应该有效:

var string = ""
for key in dict.keys {
    if let array = dict[key] as? [String] {
        for arrayItem in array {
            string += "\(key)=\(arrayItem)&"
        }
    }
    else if let value = dict[key] as? String {
        string += "\(key)=\(value)&"
    }
}

print(string.substring(to: string.index(before: string.endIndex)))

注意,这可能会以随机顺序打印它们,因为字典没有排序

如果您知道字典类型,我相信类似的方法应该会起作用:

var string = ""
for key in dict.keys {
    if let array = dict[key] as? [String] {
        for arrayItem in array {
            string += "\(key)=\(arrayItem)&"
        }
    }
    else if let value = dict[key] as? String {
        string += "\(key)=\(value)&"
    }
}

print(string.substring(to: string.index(before: string.endIndex)))

注意,这可能会以随机顺序打印它们,因为字典没有按Alexander建议的顺序排序,这是一种使用
URLComponents
URLQueryItem

import Foundation

let dict: [String: Any] = [
    "foo": "whatever",
    "this": "that",
    "category": [
        "cat1",
        "cat2"
    ]
]

var queryItems = [URLQueryItem]()
for (key, value) in dict {
    if let strings = value as? [String] {
        queryItems.append(contentsOf: strings.map{ URLQueryItem(name: key, value: $0) })
    } else {
        queryItems.append(URLQueryItem(name: key, value: value as? String))
    }
}

var urlComponents = URLComponents(string: "http://myserver.com")!
urlComponents.queryItems = queryItems
let url = urlComponents.url!
print(url.absoluteString) // => http://myserver.com?this=that&foo=whatever&category=cat1&category=cat2
类似的解决方案,但更简单,使用
flatMap

let queryItems = dict.flatMap { key, value -> [URLQueryItem] in
    if let strings = value as? [String] {
        return strings.map{ URLQueryItem(name: key, value: $0) }
    } else {
        return [URLQueryItem(name: key, value: value as? String)]
    }
}

var urlComponents = URLComponents(string: "http://myserver.com")!
urlComponents.queryItems = queryItems
let url = urlComponents.url!
print(url.absoluteString) // => http://myserver.com?this=that&foo=whatever&category=cat1&category=cat2

正如Alexander所建议的,这是一个包含
URLComponents
URLQueryItem

import Foundation

let dict: [String: Any] = [
    "foo": "whatever",
    "this": "that",
    "category": [
        "cat1",
        "cat2"
    ]
]

var queryItems = [URLQueryItem]()
for (key, value) in dict {
    if let strings = value as? [String] {
        queryItems.append(contentsOf: strings.map{ URLQueryItem(name: key, value: $0) })
    } else {
        queryItems.append(URLQueryItem(name: key, value: value as? String))
    }
}

var urlComponents = URLComponents(string: "http://myserver.com")!
urlComponents.queryItems = queryItems
let url = urlComponents.url!
print(url.absoluteString) // => http://myserver.com?this=that&foo=whatever&category=cat1&category=cat2
类似的解决方案,但更简单,使用
flatMap

let queryItems = dict.flatMap { key, value -> [URLQueryItem] in
    if let strings = value as? [String] {
        return strings.map{ URLQueryItem(name: key, value: $0) }
    } else {
        return [URLQueryItem(name: key, value: value as? String)]
    }
}

var urlComponents = URLComponents(string: "http://myserver.com")!
urlComponents.queryItems = queryItems
let url = urlComponents.url!
print(url.absoluteString) // => http://myserver.com?this=that&foo=whatever&category=cat1&category=cat2

谢谢你。顺序是不相关的,也许是一个更快速的方法,一些地图或平面地图?谢谢。顺序是不相关的,可能是更快速的方法,使用map或flatmap?您应该查看
NSURLComponents
NSQueryItem
。它正是您想要的:您应该查看
NSURLComponents
NSQueryItem
。它正是您想要的:编辑为使用条件绑定而不是
is
+
as
我是否也应该编辑以在重复的附录上使用
映射
?@Alexander继续:-)@Alexander非常感谢。编辑以使用条件绑定而不是
+
as
我是否也应该编辑以在重复的附录上使用
映射
?@Alexander继续:-)@Alexander非常感谢。