Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 调用忽略闭包中缺少参数#4的参数_Swift_Vapor - Fatal编程技术网

Swift 调用忽略闭包中缺少参数#4的参数

Swift 调用忽略闭包中缺少参数#4的参数,swift,vapor,Swift,Vapor,在Vapor 3中,在同步功能中: return try Process.execute( "/usr/local/bin/demo", [ "p1", "p2" ] ) 但是,如果我尝试在以下路线中使用期货和收盘: router.get("async") { request -> Future<String> in return Process.asyncExecute( "/usr/local/bin/demo", [ "p1", "p2" ], on:reque

在Vapor 3中,在同步功能中:

return try Process.execute( "/usr/local/bin/demo", [ "p1", "p2" ] )
但是,如果我尝试在以下路线中使用期货和收盘:

router.get("async") { request -> Future<String> in
    return Process.asyncExecute( "/usr/local/bin/demo", [ "p1", "p2" ], on:request ).flatMap(to:String) { output in
            switch output {
                case .stdout(let data): return(String(data: data, encoding: .utf8) ?? "")
                case .stderr(let data): return(String(data: data, encoding: .utf8) ?? "")
            }
    }
}
router.get(“async”){request->Future in
返回进程.asyncExecute(“/usr/local/bin/demo”,[“p1”,“p2”],on:request).flatMap(to:String){output in
开关输出{
case.stdout(let数据):返回(字符串(数据:数据,编码:.utf8)??“”)
case.stderr(let数据):返回(字符串(数据:数据,编码:.utf8)??“”)
}
}
}
我得到一个编译器错误
调用中的参数#4缺少参数
,显示在上述代码第2行的
asyncExecute
调用的
request
末尾。我已经尝试用
转换
替换
平面图
,但它没有改变错误


我在过去使用过类似的结构,不明白为什么这个结构不起作用。

我还没有使用过vapor,但就我在查看一些文档和vapor的源代码时检查过你的代码而言,你的代码永远不会被编译

  • 您需要将第四个参数传递给

    它不是可选的

  • 传递给第四个参数的闭包的类型必须是
    (ProcessOutput)->()

    闭包无法返回值

  • asyncExecute(::on::)
    的结果类型是
    Future

    如果要应用,传递给第二个参数的闭包必须是
    (Int32)throws->Future
    类型

我猜你想写这样的东西:

router.get("async") { request -> Future<String> in
    var sout: String = ""
    var serr: String = ""
    return Process.asyncExecute( "/usr/local/bin/demo", [ "p1", "p2" ], on: request ) { output in
        switch output {
        case .stdout(let data):
            sout = String(data: data, encoding: .utf8) ?? ""
        case .stderr(let data):
            serr = String(data: data, encoding: .utf8) ?? ""
        }
    }.map(to: String.self) {retVal in
        if retVal == 0 {
            return sout
        } else {
            return serr
        }
    }
}
router.get(“async”){request->Future in
var sout:String=“”
var serr:String=“”
返回Process.asyncExecute(“/usr/local/bin/demo”,[“p1”,“p2”],on:request){output in
开关输出{
case.stdout(let数据):
sout=字符串(数据:数据,编码:.utf8)?“”“
case.stderr(let数据):
serr=字符串(数据:数据,编码:.utf8)?“”
}
}.map(到:String.self){retVal in
如果retVal==0{
回流区
}否则{
返回序列
}
}
}

这段代码可能需要一些修复(正如我上面所说,我从未使用过vapor),但我希望这段代码能够帮助您解决问题。

绝对完美!非常感谢你。