Skip to content

Instantly share code, notes, and snippets.

@ppth0608
Last active July 16, 2019 15:06
Show Gist options
  • Save ppth0608/99a669f395eae7a87da00d11904e1e9d to your computer and use it in GitHub Desktop.
Save ppth0608/99a669f395eae7a87da00d11904e1e9d to your computer and use it in GitHub Desktop.
protocol URLSchemeConvertible {
var url: URL? { get }
var urlString: String { get }
}
extension URLSchemeConvertible {
var queryItems: [URLQueryItem]? {
return URLComponents(string: urlString)?.queryItems
}
var host: String? {
return url?.host
}
func queryValue(for key: String) -> String? {
let lowcasedKey = key.lowercased()
return queryItems?.first { $0.name.lowercased() == lowcasedKey }?.value
}
}
extension String: URLSchemeConvertible {
var url: URL? {
if let url = URL(string: self) {
return url
}
var set = CharacterSet()
set.formUnion(.urlHostAllowed)
set.formUnion(.urlPathAllowed)
set.formUnion(.urlQueryAllowed)
set.formUnion(.urlFragmentAllowed)
return self.addingPercentEncoding(withAllowedCharacters: set).flatMap { URL(string: $0) }
}
var urlString: String {
return self
}
}
extension URL: URLSchemeConvertible {
var url: URL? {
return self
}
var urlString: String {
return self.absoluteString
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment