2017-06-01 119 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' 

这是太奇怪了。

相关问题