首页 > 解决方案 > 如何停止 Swift 中匹配元组类型的泛型函数?

问题描述

我有这两种方法

func doSomething<T>(_ completion: (T) -> Void) { ... }

func doSomething<T, U>(_ completion: (T, U) -> Void) { ... }

不幸的是,当我尝试使用具有两种泛型类型的版本时,这将无法编译。

doSomething { (value1: String, value2: Int) in ... }

因为它在第二个doSomething<String, Int>和第一个之间是模棱两可的,doSomething<(String, Int)>即一个泛型类型,它是一个包含两个字符串的元组。

显然,我可以将这些方法称为两个不同的名称!有没有办法在不这样做的情况下解决这种歧义?

标签: swiftgenericsoverloading

解决方案


(  doSomething as ( (String, Int) -> Void ) -> Void  ) { value1, value2 in }

你可以做一个类型别名……</p>

typealias DoSomething<T, U> = ( (T, U) -> Void ) -> Void

(doSomething as DoSomething) { (value1: String, value2: Int) in }
(doSomething as DoSomething<String, Int>) { _ = ($0, $1) }

…但是类型别名不能被重载,所以除了一个之外,每个函数重载都需要一个别名。那没有任何意义;给函数起不同的名字会更简单。


推荐阅读