Как остановить функцию generi c в Swift, соответствующую типу Tuple? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть эти два метода

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

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

К сожалению, это не скомпилируется, когда я пытаюсь использовать версию с двумя типами c.

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

Поскольку это неоднозначно между вторым doSomething<String, Int> и первым doSomething<(String, Int)>, т. е. единственным типом generi c, который является кортежем, содержащим две строки.

Очевидно, я могу назвать эти методы двумя разными именами! Есть ли способ решить эту двусмысленность, не делая этого?

1 Ответ

1 голос
/ 15 апреля 2020
(  doSomething as ( (String, Int) -> Void ) -> Void  ) { value1, value2 in }

Вы можете создать псевдоним типа ...

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

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

... но псевдонимы типов не могут быть перегружены, поэтому вам потребуется один для каждой перегрузки функции, кроме одного. И в этом не было бы никакого смысла; дать функциям разные имена было бы проще.

...