如何在Swift中传递和获取多个URL QueryItems?
How to pass and get multiple URLQueryItems in Swift?
好的,我正在使用 iMessage 应用程序并尝试从此处所选消息中解析超过 1 个 url 查询项 - 我已成功 getting/sending 查询中只有 1 个值:
override func willBecomeActive(with conversation: MSConversation) {
// Called when the extension is about to move from the inactive to active state.
// This will happen when the extension is about to present UI.
if(conversation.selectedMessage?.url != nil) //trying to catch error
{
let components = URLComponents(string: (conversation.selectedMessage?.url?.query?.description)!)
//let val = conversation.selectedMessage?.url?.query?.description
if let queryItems = components?.queryItems {
// process the query items here...
let param1 = queryItems.filter({[=11=].name == "theirScore"}).first
print("***************=> GOT IT ",param1?.value)
}
}
当我只有 1 个值时,只需打印 conversation.selectedMessage?.url?.query?.description
我就可以得到一个带有 1 个值的可选值,这很好。但是对于多个,我找不到一种干净的方法来按键获取特定值。
为 iMessage 的给定键解析 URLQueryItem
的正确方法是什么?
当您执行 conversation.selectedMessage?.url?.query?.description
时,它只是打印出查询的内容。如果您有多个项目,那么它会显示为:
item=Item1&part=Part1&story=Story1
您可以通过在“&”上拆分字符串然后在“=”上拆分结果数组的内容来手动解析该数组,以将各个键值对放入字典中。然后,可以直接通过key引用每一个值,得到具体的值,像这样:
var dic = [String:String]()
if let txt = url?.query {
let arr = txt.components(separatedBy:"&")
for item in arr {
let arr2 = item.components(separatedBy:"=")
let key = arr2[0]
let val = arr2[1]
dic[key] = val
}
}
print(dic)
以上为您提供了一种按键访问值的简便方法。但是,这有点冗长。您在代码中提供的方式,在 queryItems
数组上使用过滤器,是更紧凑的解决方案 :) 所以您已经有了 easier/compact 解决方案,但如果这种方法对您个人来说更有意义,你总是可以走这条路......
此外,如果问题是您必须多次编写相同的过滤代码才能从 queryItems
数组中获取值,那么您始终可以使用一个带有两个参数的辅助方法,queryItems
数组和一个 String
参数(键)和 returns 一个可选的 String
值(与键匹配的值),如下所示:
func valueFrom(queryItems:[URLQueryItem], key:String) -> String? {
return queryItems.filter({[=12=].name == key}).first?.value
}
那么你上面的代码应该是这样的:
if let queryItems = components?.queryItems {
// process the query items here...
let param1 = valueFrom(queryItems:queryItems, key:"item")
print("***************=> GOT IT ", param1)
}
您可以使用 iMessageDataKit 库。它使设置和获取数据变得非常简单直接,例如:
let message: MSMessage = MSMessage()
message.md.set(value: 7, forKey: "user_id")
message.md.set(value: "john", forKey: "username")
message.md.set(values: ["joy", "smile"], forKey: "tags")
print(message.md.integer(forKey: "user_id")!)
print(message.md.string(forKey: "username")!)
print(message.md.values(forKey: "tags")!)
(免责声明:我是 iMessageDataKit
的作者)
好的,我正在使用 iMessage 应用程序并尝试从此处所选消息中解析超过 1 个 url 查询项 - 我已成功 getting/sending 查询中只有 1 个值:
override func willBecomeActive(with conversation: MSConversation) {
// Called when the extension is about to move from the inactive to active state.
// This will happen when the extension is about to present UI.
if(conversation.selectedMessage?.url != nil) //trying to catch error
{
let components = URLComponents(string: (conversation.selectedMessage?.url?.query?.description)!)
//let val = conversation.selectedMessage?.url?.query?.description
if let queryItems = components?.queryItems {
// process the query items here...
let param1 = queryItems.filter({[=11=].name == "theirScore"}).first
print("***************=> GOT IT ",param1?.value)
}
}
当我只有 1 个值时,只需打印 conversation.selectedMessage?.url?.query?.description
我就可以得到一个带有 1 个值的可选值,这很好。但是对于多个,我找不到一种干净的方法来按键获取特定值。
为 iMessage 的给定键解析 URLQueryItem
的正确方法是什么?
当您执行 conversation.selectedMessage?.url?.query?.description
时,它只是打印出查询的内容。如果您有多个项目,那么它会显示为:
item=Item1&part=Part1&story=Story1
您可以通过在“&”上拆分字符串然后在“=”上拆分结果数组的内容来手动解析该数组,以将各个键值对放入字典中。然后,可以直接通过key引用每一个值,得到具体的值,像这样:
var dic = [String:String]()
if let txt = url?.query {
let arr = txt.components(separatedBy:"&")
for item in arr {
let arr2 = item.components(separatedBy:"=")
let key = arr2[0]
let val = arr2[1]
dic[key] = val
}
}
print(dic)
以上为您提供了一种按键访问值的简便方法。但是,这有点冗长。您在代码中提供的方式,在 queryItems
数组上使用过滤器,是更紧凑的解决方案 :) 所以您已经有了 easier/compact 解决方案,但如果这种方法对您个人来说更有意义,你总是可以走这条路......
此外,如果问题是您必须多次编写相同的过滤代码才能从 queryItems
数组中获取值,那么您始终可以使用一个带有两个参数的辅助方法,queryItems
数组和一个 String
参数(键)和 returns 一个可选的 String
值(与键匹配的值),如下所示:
func valueFrom(queryItems:[URLQueryItem], key:String) -> String? {
return queryItems.filter({[=12=].name == key}).first?.value
}
那么你上面的代码应该是这样的:
if let queryItems = components?.queryItems {
// process the query items here...
let param1 = valueFrom(queryItems:queryItems, key:"item")
print("***************=> GOT IT ", param1)
}
您可以使用 iMessageDataKit 库。它使设置和获取数据变得非常简单直接,例如:
let message: MSMessage = MSMessage()
message.md.set(value: 7, forKey: "user_id")
message.md.set(value: "john", forKey: "username")
message.md.set(values: ["joy", "smile"], forKey: "tags")
print(message.md.integer(forKey: "user_id")!)
print(message.md.string(forKey: "username")!)
print(message.md.values(forKey: "tags")!)
(免责声明:我是 iMessageDataKit
的作者)