完成处理程序与swift

时间:2017-06-01 13:22:30

标签: xml swift post callback completionhandler

我正在学习swift,我现在正试图理解一个错误。我正在尝试从php脚本获取一个xml文件,这要归功于查询,我正在使用完成处理程序将这些查询的结果作为回调。

问题是我对这些技术并不满意,并且说缺少论据。

以下是使用完成处理程序的函数:

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

2 个答案:

答案 0 :(得分: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()
(...)

答案 1 :(得分: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'

这太奇怪了。