Extensions.swift 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import UIKit
  2. import Foundation
  3. extension Dictionary {
  4. func percentEscaped() -> String {
  5. return map { key, value in
  6. let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
  7. let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
  8. return escapedKey + "=" + escapedValue
  9. }
  10. .joined(separator: "&")
  11. }
  12. }
  13. extension CharacterSet {
  14. static let urlQueryValueAllowed: CharacterSet = {
  15. let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
  16. let subDelimitersToEncode = "!$&'()*+,;="
  17. var allowed = CharacterSet.urlQueryAllowed
  18. allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
  19. return allowed
  20. }()
  21. }
  22. extension URLSession {
  23. func synchronousDataTask(request: URLRequest) -> (Data?, URLResponse?, Error?) {
  24. var data: Data?
  25. var response: URLResponse?
  26. var error: Error?
  27. let semaphore = DispatchSemaphore(value: 0)
  28. let task = dataTask(with: request) {
  29. data = $0
  30. response = $1
  31. error = $2
  32. semaphore.signal()
  33. }
  34. task.resume()
  35. _ = semaphore.wait(timeout: .distantFuture)
  36. return (data, response, error)
  37. }
  38. }
  39. extension UIViewController {
  40. func hideKeyboardOnTap() {
  41. let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
  42. tap.cancelsTouchesInView = false
  43. view.addGestureRecognizer(tap)
  44. }
  45. @objc func dismissKeyboard() {
  46. view.endEditing(true)
  47. }
  48. }