1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import UIKit
- import Foundation
- extension Dictionary {
- func percentEscaped() -> String {
- return map { key, value in
- let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
- let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
- return escapedKey + "=" + escapedValue
- }
- .joined(separator: "&")
- }
- }
- extension CharacterSet {
- static let urlQueryValueAllowed: CharacterSet = {
- let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
- let subDelimitersToEncode = "!$&'()*+,;="
- var allowed = CharacterSet.urlQueryAllowed
- allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
- return allowed
- }()
- }
- extension URLSession {
- func synchronousDataTask(request: URLRequest) -> (Data?, URLResponse?, Error?) {
- var data: Data?
- var response: URLResponse?
- var error: Error?
- let semaphore = DispatchSemaphore(value: 0)
- let task = dataTask(with: request) {
- data = $0
- response = $1
- error = $2
- semaphore.signal()
- }
- task.resume()
- _ = semaphore.wait(timeout: .distantFuture)
- return (data, response, error)
- }
- }
- extension UIViewController {
- func hideKeyboardOnTap() {
- let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
- tap.cancelsTouchesInView = false
- view.addGestureRecognizer(tap)
- }
- @objc func dismissKeyboard() {
- view.endEditing(true)
- }
- }
|