2017-06-01 107 views
0

我目前正在學習swift,並且在嘗試瞭解現在幾個小時以來的錯誤。我試圖從一個PHP腳本得到一個XML文件感謝查詢,我使用完成處理程序來獲取這些查詢的結果作爲回調。swift的完成處理程序

問題是我不熟悉這些技術,它說參數丟失。

下面是一個使用完成處理的功能:

func connect(completion: (String) ->()) 
    { 
    let password : String = "psw" 
    let login : String = "log" 
    let postString : String = "login=\(login)&password=\(password)" 
    let urlString = "http://www.mydomain.fr/script.php" 
    var output : String = "" 
    let request = NSMutableURLRequest(url: NSURL(string: urlString)! as URL) 
    request.httpMethod = "POST" 
    request.httpBody = postString.data(using: String.Encoding.utf8) 

    let task = URLSession.shared.dataTask(with: request as URLRequest){ 
     data, response, error in 

     if error != nil { 
      print("error=\(error)") 
      return 
     } 
     let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
     print("responseString = \(responseString)") 
     output = responseString as! String 
    } 
    task.resume() 
    completion(output) 
} 

而這裏的一段代碼,我調用這個函數:

func misctest() 
{ 
    let dbc : dataBaseCloner = dataBaseCloner() 
    let output: String 
    connect(completion : { (output) in 
     print(output) 
    }) 
} 

這塊代碼顯示的這個錯誤有關呼叫連接:

>>>Missing argument for parameter #2 in call 

我做錯了什麼?爲什麼它需要兩個參數?

非常感謝您的幫助。

Elbattore

+1

這不會修復你的錯誤,但你必須將「完成(輸出)」移動到任務完成狀態,因爲它是異步的,並且沒有輸出將始終爲空 –

回答

1

我已複製粘貼您的代碼,它的工作沒有任何錯誤。嘗試關閉並在Xcode上。

而且你必須移動completion(output)你的任務完成,因爲它是異步,沒有你的輸出將始終爲空:

(...) 
    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
    print("responseString = \(responseString)") 
    output = responseString as! String 
    completion(output) 
    } 
task.resume() 
(...) 
+0

即使我更新了Xcode,它也不起作用,它不起作用。並開始做錯誤更加複雜 – Elbattore

0

這是超級奇怪。我只是再次嘗試,我把你的問題放在正確的地方,我重新啓動Xcode,更新它並重新啓動我的電腦,我仍然有這個錯誤:參數#2在調用中缺少參數。這一次,如果我點擊它提出了我一些錯誤,添加兩個新的參數,如:

func misctest() 
{ 
    let dbc : dataBaseCloner = dataBaseCloner() 
    let output: String 
    connect({ (output) in 
     print(output) 
    }, <#UnsafePointer<sockaddr>!#>, <#socklen_t#>) 
    print("working!") 
} 

但後來它不工作,說我:

cannot convert value of type '(Any)->()' to expected argument type'int32' 

這是太奇怪了。