Для достижения этого поведения вы должны использовать встроенный метод globals():
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
Проверка наличия ресурса на сервере требует отправки HTTP-запроса и получения ответа. TCP-связь может занять некоторое количество времени, например. если сервер занят, какой-то маршрутизатор между клиентом и сервером работает некорректно, сеть отключена и т. д.
Вот почему асинхронные запросы всегда предпочтительны. Даже если вы считаете, что запрос должен занимать всего миллисекунды, иногда это может быть секунды из-за некоторых сетевых проблем. И, как мы все знаем, блокировка главного потока в течение нескольких секунд - это большое значение no-no.
Все, что сказано, вот возможная реализация для fileExists()
метод.
Метод HTTP-запроса установлен на «HEAD», так что сервер отправляет только заголовок ответа, но нет данных.
func fileExists(url : NSURL!) -> Bool {
let req = NSMutableURLRequest(URL: url)
req.HTTPMethod = "HEAD"
req.timeoutInterval = 1.0 // Adjust to your needs
var response : NSURLResponse?
NSURLConnection.sendSynchronousRequest(req, returningResponse: &response, error: nil)
return ((response as? NSHTTPURLResponse)?.statusCode ?? -1) == 200
}
Swift 3.0 версия ответа Martin R написана асинхронно (основной поток не заблокирован):
func fileExistsAt(url : URL, completion: @escaping (Bool) -> Void) {
let checkSession = Foundation.URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
request.timeoutInterval = 1.0 // Adjust to your needs
let task = checkSession.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if let httpResp: HTTPURLResponse = response as? HTTPURLResponse {
completion(httpResp.statusCode == 200)
}
})
task.resume()
}