2016-09-20 129 views
4

因此,我正在搞乱iMessages框架,并且为了向其他用户发送数据,必须将数据作为URLComponentsURL发送。但我不知道如何发送一个字典作为messages.url值使用。如何通过在Swift中使用字典来构建URL

func createMessage(data: dictionary) { 

    /* 

    The Dictionary has 3 values, 1 string and two arrays. 

    let dictionary = ["title" : "Title Of Dictionary", "Array1" : [String](), "Array2" : [String]() ] as [String : Any] 

    */ 


    let components = URLComponents() 

    let layout = MSMessageTemplateLayout() 
    layout.image = UIImage(named: "messages-layout.png")! 
    layout.imageTitle = "\(dictionary["title"])" 

    let message = MSMessage() 
    message.url = components.url! 
    message.layout = layout 

    self.activeConversation?.insert(message, completionHandler: { (error: Error?) in 
     print("Insert Message") 
    }) 
} 

有谁知道我可以在URLComponents送字典值URLQueryItems保存为message.url? PS:我想知道是否有可能为存储字典的URL创建扩展名,这是我尝试atm失败的原因。

回答

7

下面的代码片段转换字典URLQueryItems

let dictionary = [ 
    "name": "Alice", 
    "age": "13" 
] 

func queryItems(dictionary: [String:String]) -> [URLQueryItem] { 
    return dictionary.map { 
     // Swift 3 
     // URLQueryItem(name: $0, value: $1) 

     // Swift 4 
     URLQueryItem(name: $0.0, value: $0.1) 
    } 
} 

var components = URLComponents() 
components.queryItems = queryItems(dictionary: dictionary) 
print(components.url!) 
+0

斯威夫特4更新: 'FUNC queryItems(词典:[字符串:String]) - > [URLQueryItem] { return dictionary.map { URLQueryItem(name:$ 0.0,value:$ 0.1) } }' – palme

+0

@palme thanks。我已经用你的代码片段更新了代码。 –

1

您可以使用以下URLComponents扩展:

extension URLComponents{ 
    var queryItemsDictionary : [String:Any]{ 
     set (queryItemsDictionary){ 
      self.queryItems = queryItemsDictionary.map { 
       URLQueryItem(name: $0, value: "\($1)") 
      } 
     } 
     get{ 
      var params = [String: Any]() 
      return queryItems?.reduce([:], { (_, item) -> [String: Any] in 
       params[item.name] = item.value 
       return params 
      }) ?? [:] 
     } 
    } 
} 

,并设置URL组件:

var url = URLComponents() 
url.queryItemsDictionary = ["firstName" : "John", 
          "lastName" : "Appleseed"] 
0

您可以使用iMessageDataKit库。这是一个微小的,有用的MSMessage扩展名,用于设置/获取Int,Bool,Float,Double,StringArray键的值。

它使设置和获取数据非常简单,如:

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作者)

相关问题