2016-06-14 3 views
0

У меня есть следующий код Swift, где я отправляю запрос POST на веб-сервер и получаю значение обратно. Ошибка, которую я получаю на второй до последней строки, говоря «Использование неразрешенного идентификатора»Swift - использование неразрешенного идентификатора

func download_request() -> String { 
    let url:NSURL = NSURL(string: "http://url.com/read.php")! 
    let session = NSURLSession.sharedSession() 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

    let paramString = "data=name" 
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = session.downloadTaskWithRequest(request) { 

     (let location, let response, let error) in 

     guard let _:NSURL = location, let _:NSURLResponse = response where error == nil else { 
      print("Error") 
      return 
     } 

     let urlContents = try! NSString(contentsOfURL: location!, encoding: NSUTF8StringEncoding) 

     guard let _:NSString = urlContents else { 
      print("Error") 
      return 
     } 

    } 

    task.resume() 
    return urlContents 
} 

Как бы я исправить эту ошибку? Я думаю, что это означает, что я не могу использовать urlContents за пределами let task = session.downloadTaskWithRequest (request) {}, но как бы объявить переменную, чтобы я мог использовать ее снаружи?

ответ

2

Попробуйте объявить urlContents за пределами session.downloadTaskWithRequest(request) { } блока. Как так:

func download_request() -> String? { 
    let url:NSURL = NSURL(string: "http://url.com/read.php")! 
    let session = NSURLSession.sharedSession() 
    var urlContents: NSString? 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

    let paramString = "data=name" 
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = session.downloadTaskWithRequest(request) { 

     (let location, let response, let error) in 

     guard let _:NSURL = location, let _:NSURLResponse = response where error == nil else { 
      print("Error") 
      return 
     } 

     urlContents = try? NSString(contentsOfURL: location!, encoding: NSUTF8StringEncoding) 

     guard let _:NSString = urlContents else { 
      print("Error") 
      return 
     } 

    } 

    task.resume() 
    return (urlContents as! String) 
} 

Затем, когда вам нужно использовать urlContents разворачивать его с если позволить связывание

if let contents = download_request() { 
    //Use safely unwrapped contents 
} 
+0

Это исправлена ​​ошибка, однако, теперь я получаю другую ошибку при создании и запуск: фатальная ошибка : неожиданно найдено нуль при развертывании необязательного значения – zam

+0

@ DanielZam См. мои правки. Это должно исправить это. – Ike10

+0

Код исправил эту проблему, но оператор if, который позволяет мне разворачивать urlContents, не работает (как проверено с помощью инструкции else). – zam

0

Вы можете сделать тип возвращаемого optional как ниже

func download_request() -> String? { 
    var urlContents: String? 
    .... 
    .... 
    let task = session.downloadTaskWithRequest(request) { 

     (let location, let response, let error) in 
     ... 
     ... 
     ... 
     guard let _:NSURL = location, let _:NSURLResponse = response where error == nil else { 
      print("Error") 
      return 
     } 
     urlContents = try! NSString(contentsOfURL: location!, encoding: NSUTF8StringEncoding) as String 
     guard let _:NSString = urlContents else { 
      print("Error") 
      return 
     } 
    } 
    task.resume() 
    return urlContents 
} 

И вызовите метод как

if let request = download_request() { 
    //do anything with your request 
} 

Предложив переименовать ваш метод правильно, так как вы возвращаете загруженные данные не запрос.

И это неправильный способ вернуть ваши загруженные данные в качестве возврата к методу, так как после выполнения операции будет вызываться completionHandler, так что urlContents будет nil. Поэтому создать еще один метод, который принимает в качестве входных данных String и вызвать его в completionHandler из downloadTaskWithRequest

Смежные вопросы