[英]Swift Generic Type in Function + Higher Order Function
假設我有一個通用方法來進行一些轉換,該轉換需要一個Input和一個Output,部分流程需要一個塊(也需要通用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
}
它顯示一個錯誤:
無法將類型(( )->可編碼)的值轉換為預期的參數類型'( )-> _'
我也嘗試將塊的返回類型“ Codable”更改為“ OutputObj”。
感謝任何人都可以提供幫助。
您無需將此作為類的方法。 問題中的簡化代碼中的問題是,顯式鍵入了閉包以返回Codable
但答案中的代碼中鍵入了閉包以返回OutputObj
。
如果您在示例中刪除了閉包的顯式返回類型,並且依賴於從input
和output
參數推斷出的類型,則代碼無需進一步修改即可工作。
try run(inputObj, outputObj) { input in
// do something and return an output object
}
此外,一些改進Swift風格的建議:
Void
是多余的,因此您可以將其從run
函數聲明中刪除。 Optional<Wrapped>
, Array<Element>
和Dictionary<Key, Value>
。 在您的情況下, Input
和Output
比I
和O
更具描述性。 Type
后綴,並且傳遞給此函數的參數不是類型,它們是值/實例。 在這種情況下, input
和output
將是兩個參數的更多慣用名稱。 _
)更清晰。 經過這些更改, run
函數聲明將如下所示:
func run<Input: Codable, Output: Codable>(input: Input, output: Output, converter: (Input) -> Output) throws
好!
我找到了解決此問題的方法。 我為函數“運行”創建一個類
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
}
現在一切都可以完美運行!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.