如何在Swift中传递和获取多个URLQueryItem?

时间:2017-04-11 02:12:32

标签: swift url imessage-extension

好的,我正在使用iMessage应用程序,并尝试从此处所选消息中解析超过1个url查询项目 - 我已成功在查询中获取/发送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({$0.name == "theirScore"}).first
                print("***************=>    GOT IT ",param1?.value)
            }
        }

当我只有1个值时,只需打印conversation.selectedMessage?.url?.query?.description我就可以获得一个可选的1值,这很好。但有多个我无法找到一个干净的方式来获取密钥的具体值。

为iMessage的给定键解析URLQueryItem的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

执行conversation.selectedMessage?.url?.query?.description时,它只会打印出查询内容。如果您有多个项目,那么它将显示为:

item=Item1&part=Part1&story=Story1

您可以通过在“&”上拆分字符串来手动解析那个然后在“=”上分割结果数组的内容,以获得字典中的各个键值对。然后,您可以通过键直接引用每个值来获取特定值,如下所示:

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数组上的过滤器提供的方式是更紧凑的解决方案:)所以您已经拥有了更简单/紧凑的解决方案,但如果这种方法对您个人更有意义,那么您可以总是走这条路......

此外,如果问题是您必须多次编写相同的过滤代码才能从queryItems数组中获取值,那么您始终可以使用一个辅助方法,该方法需要两个参数{{1数组和queryItems参数(键)并返回一个可选的String值(与键匹配的值)沿着以下行:

String

然后您的上述代码如下:

func valueFrom(queryItems:[URLQueryItem], key:String) -> String? {
    return queryItems.filter({$0.name == key}).first?.value
}

答案 1 :(得分:0)

您可以使用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的作者)