2014-11-23 2 views
1

일부 게시물을 읽었으며 비슷한 게시물 (Swift closure with Alamofire)에 권장 사항이 있으며 내 코드와 동일한 작업을 시도했지만 지금 함수를 호출 할 방법을 찾을 수 없습니까? 표현의 형식을 변환 할 수 없습니다 '(응답 : @lvalue 문자열)'를 입력하기 :스위프트 함수 완성

import UIKit 

class myClass101: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
    var api_error: String = "" 

    activityInd.startAnimating() 

    call_api_function(response: api_error) 

    activityInd.stopAnimating() 

    if (api_error != "") { 
     let alertController = UIAlertController(title: "Server Alert", message: "Could not connect to API!", preferredStyle: UIAlertControllerStyle.Alert) 
     alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil)) 
     self.presentViewController(alertController, animated: true, completion: nil) 
    } 
    } 
} 

'>() ((응답 - ->() 문자열))'

가 나는 오류를 얻을 수 기능은 다음과 같습니다 :

func call_api_function(completion: (response: String) ->()) { 

    let api_url_path: String = "http://\(str_api_server_ip):\(str_api_server_port)" 
    let api_url = NSURL(string: api_url_path + "/devices.xml")! 

    Alamofire.request(.GET, api_url) 
     .authenticate(user: str_api_username, password: str_api_password) 
     .validate(statusCode: 200..<300) 
     .response { (request, response, data, error) in 

      var senderror: String = error!.localizedDescription 
      completion(response: senderror) 

      if (error != nil) { 

       println(senderror) 
      } 

      // do other tasks here 

    } 

} 

고마워요!

코스타스

답변

2

call_api_function의 당신의 정의 감안할 때, 당신은 지금처럼 부를 것이다 :

call_api_function() { response in 

    activityInd.stopAnimating() 

    // now use `response` here 
} 

나는 당신이 The Swift Programming Language: Closures에 폐쇄 후행에 조금 연구를 제안 할 것입니다.


그러나 그런 말로하면 call_api_function에는 자체적으로 문제가 있습니다.

  • 선택 사항 인 error을 강제로 언 래핑하고 있습니다. 오류가 없다면? 그런 다음 nil 선택적 강제 unwrapping 실패하고 코드가 충돌합니다.

  • 요청이 성공하면 data이 반환되며 아무 것도하지 않습니다. 아마도 반환 된 데이터로 무언가를하고 싶었 기 때문에 요청을했을 것입니다.

    불행하게도, 당신은 당신이 기대하고있는 XML 응답의 성격에 대한 정보를 제공하지 않지만, 아마도 당신은 그것을 분석하고 NSXMLParserDelegate 방법을 구현하고 parse 메소드를 호출하는 NSXMLParser 인스턴스를 인스턴스화합니다.

  • 하나의 비 선택적 매개 변수가있는 클로저가 아니라 두 개의 선택적 매개 변수가있는 클로저가 필요합니다. 구문 분석 된 데이터는 선택 사항입니다. 요청 및 구문 분석이 성공적 이었음) 및 선택 사항으로 NSError (오류가있는 경우에만 설정 됨)이 포함됩니다.

  • 아주 사소한 점이지만, 코코아 이름 지정 규칙 (예 : callApiFunction)을 채택하는 것이 좋습니다.

+0

많은 의견을 보내 주셔서 감사합니다. 매우 감사!!!! – Kostas

+0

그건 그렇고, [귀하의 다른 질문에 대한 답변] (http://stackoverflow.com/a/27089820/1271826) 두 매개 변수와 폐쇄의 예를 보여줍니다. 분명히 XML을 다루므로 파싱을 원할 수도 있지만 다른 대답은 클로저를 통해 두 개의 매개 변수를 전달하는 아이디어를 보여줍니다. – Rob