当前位置: 首页 > 知识库问答 >
问题:

带swift的完成处理程序

孟高峰
2023-03-14

我目前正在学习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

我做错了什么?为什么它要两个参数?

非常感谢您的帮助。

埃尔巴托

共有2个答案

聂奇
2023-03-14

这太奇怪了。我刚刚再次尝试,我按照您的要求将完成放在正确的位置,然后重新启动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'

这太奇怪了。

劳星晖
2023-03-14

我已经复制粘贴了你的代码,它的工作没有任何错误。尝试关闭和打开Xcode。

此外,您必须将< code>completion(output)移动到您的任务完成,因为它是异步的,没有它,您的输出将总是空的:

(...)
    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
    print("responseString = \(responseString)")
    output = responseString as! String
    completion(output)
    }
task.resume()
(...)
 类似资料:
  • 我在地图中的几个位置进行反向地理编码,并希望将其包装为某种常用方法。我所拥有的是作为工作起点的: 但是,如果我想在我的完成方法中添加另一个参数,将会向我的视图返回错误,如下所示: 如果error为,那么我的将失败,因为错误为nil且访问错误。但我不能这样做,因为参数与完成处理程序不匹配。 因此,如果我有一个nil错误,我将如何调用我的完成处理程序?

  • 我试图更准确地理解斯威夫特的“关闭”。 但是和太难理解了 我搜索了许多Swift帖子和官方文件,但我觉得这仍然不够。 这是官方文件的代码示例 听说使用< code>@escaping有两种方式和原因 第一个用于存储闭包,第二个用于异步操作目的。 以下是我的问题: 首先,如果执行,则将使用闭包参数执行,并且该闭包将保存在全局变量数组中。 我认为闭包是{self.x=100} {self.x=100}

  • 问题内容: 我是Swift和SpriteKit的新手。SpriteKit Actions的许多示例都在Objective C中,在Swift中我无法映射到它,也无法使用。 如果运行SKAction,并且在完成SKAction后又想做其他事情,那么如何在Swift中做到这一点呢? 任何想法将不胜感激。 编辑: 问题答案: 您的完成代码不会被调用,因为您的“死亡”操作将永远运行,这意味着它永远不会结束

  • 问题内容: 我正在试图做的是传递给函数,然后使用传递通过设置将返回。 我在中创建闭包时遇到了问题, 它引发了编译器错误/崩溃: 在斯威夫特,是根据文档应该包含的对象,就像Objective-C的版本。 这是我当前的代码: 编辑:似乎错误与不被视为数组有关。现在编译,但是我想集的时候得到什么,但无内。我检查了传递的,它们是有效的。 编辑2:打印后,我可以确认它返回了数据。但是仍然返回nil。 问题答

  • 问题内容: 我在Utilities类中使用loadImage方法,并且在通过闭包返回图像时遇到了一些麻烦。基本上因为我的代码可能返回图像或错误,所以在调用该方法时将其分配给image属性是行不通的。 我在类的方法声明中使用的方法是否错误,还是应该以不同的方式调用该方法以预期潜在的不同结果?谢谢 问题答案: 将处理程序添加到您的 loadImage 函数中: 迅捷3 像这样调用func: 斯威夫特2

  • 我基本上想有一个可选的完成处理器,没有参数被传递回来。这是我目前掌握的情况,但显然是错误的。 我不想在完成块中传递任何参数。我只想知道网络调用何时完成,以便刷新UI。我不想在这里刷新UI,因为我希望它充当刷新数据的通用函数。我之所以希望完成处理程序是可选的,是因为有时候刷新完成后我不需要做任何事情。 我也很困惑“逃离”是什么意思。当我做这样的事情时,我通常会有它,但任何清晰都会很好。我在网上做了一