#ios #swift #urlcomponents
Вопрос:
Я пытаюсь написать код, который позволит мне одновременно подтвердить, что строка на самом деле является допустимым веб-адресом для доступа к удаленному серверу, и сможет безопасно развернуть ее в URL-адрес для использования.
Из того, что собрано из различных сообщений и исходного кода Apple:
URLComponents is a structure designed to parse URLs based on RFC 3986 and to construct URLs from their constituent parts.
и на основе школ w3:
A URL is a valid URL if at least one of the following conditions holds:
The URL is a valid URI reference [RFC3986]....
Будет ли этого кода достаточно для обнаружения адресов, которые достигают удаленных серверов во всемирной паутине?
import Foundation
extension String {
/// Returns `nil` if a valid web address cannot be initialized from self
var url: URL? {
guard
let urlComponents = URLComponents(string: self),
let scheme = urlComponents.scheme,
isWebServerUrl(scheme: scheme),
let url = urlComponents.url
else {
return nil
}
return url
}
/// A web address normally starts with http:// or https:// (regular http protocol or secure http protocol).
private func isWebServerUrl(scheme: String) -> Bool {
(scheme == WebSchemes.http.rawValue || scheme == WebSchemes.https.rawValue)
}
}
Можете ли вы дать некоторые отзывы об этом подходе и сообщить мне, можно ли провести какую-либо оптимизацию? или если это неверно?
Любые и все комментарии приветствуются.
Комментарии:
1. Каково ваше определение действительного веб-адреса? Является ли следующий веб-адрес действительным в соответствии с вашим определением? яблоко.кум
2. Веб-адрес удаленного сервера. Я переформулировал вопрос :thumbs_up:
Ответ №1:
Вы могли бы пойти еще проще и сделать
import Foundation
extension String {
/// Returns `nil` if a valid web address cannot be initialized from self
var url: URL? {
return URL(string: self)
}
/// A web address normally starts with http:// or https:// (regular http protocol or secure http protocol).
var isWebURL: Bool {
get {
guard let url = self.url else { return false }
return url.scheme == "http" || url.scheme == "https"
}
}
}
Объяснение
Инициализация a с URL
помощью строки вернет, nil
если строка не является допустимым URL-адресом, поэтому вы можете получить URL-адрес, просто init
введя объект URL. Кроме того, проверка схемы очень проста, потому URL
что имеет свойство scheme
, которое мы можем проверить по требуемым параметрам.
Комментарии:
1. Замечательно — Ваш ответ представляет собой комбинацию двух лучших ответов, которые я получил от аналогичных, но неправильно поставленных сообщений, которые я сделал ранее. Большое спасибо @thecoolwinter!
2. @AdamDahan Полностью 🙂 рад, что смог помочь!
3. @AdamDahan намного проще просто проверить, не является ли URL-адрес файлом URL-адрес isFileURL
4. @AdamDahan Я уже говорил вам, как вы должны подойти к этому. Сделайте запрос URL-адреса, если это не URL-адрес файла, и проверьте ответ