假设我有一个通用的方法来进行一些带有输入和输出的转换,部分过程流需要一个块(也使用泛型I和O)来处理它。
func run<I : Codable, O : Codable>(_ inputType: I, _ outputType: O, _ converter : (_ input: I)-> O) throws -> Void
{
// do something to input I
let output : O = converter(input)
// do something else to output O
}
问题是,我无法像示例一样调用此方法:
run(InputObj, OutputObj) { (input) -> Codable in
var outputObj = OutputObj( ... )
// do something here
return outputObj
}
并显示错误:
无法转换类型'() - &gt;的值Codable'到 预期参数类型'() - &gt; _'
我也尝试将块的返回类型“Codable”更改为“OutputObj”。
感谢是否有人可以提供帮助。
答案 0 :(得分:1)
您不需要在类上创建此方法。问题中简化代码中的问题是闭包是显式输入的,以便返回package identity name
,但在答案中的代码中,它会键入以返回Codable
。
如果在示例中删除闭包的显式返回类型 - 并依赖于从OutputObj
和input
参数推断出的类型 - 代码无需进一步修改即可工作。
output
此外,还有一些关于Swift风格改进的建议:
try run(inputObj, outputObj) { input in
// do something and return an output object
}
是多余的,因此您可以从Void
函数声明中删除它。run
,Optional<Wrapped>
和Array<Element>
。在您的情况下,Dictionary<Key, Value>
和Input
会比Output
和I
更具描述性。 O
后缀,并且传递给此函数的参数不是类型,它们是值/实例。在这种情况下,Type
和input
将是两个参数的惯用名。output
)。通过这些更改,_
函数声明将如下所示:
run
答案 1 :(得分:0)
OK!
我找到了解决这个问题的方法。 我为函数“run”创建了一个类
class Converter<I : Codable, O : Codable> {
func run(_ converter : (_ input: I)-> O) throws -> Void
}
然后按
打电话let converter : Converter = Converter<InputObj, OutputObj>()
run() { (input) -> OutputObj in
var outputObj = OutputObj( ... )
// do something here
return outputObj
}
现在任何一切都完美无缺!