Как работает вывод типа swifts для пустых массивов? - PullRequest
0 голосов
/ 08 мая 2019

Следующий пример иллюстрирует проблему:

func f(_ a: [Int]){ print("foo") }
func f(_ a: [[Int]]){ print("bar") }
f([])

Это не компилируется со следующей ошибкой:

error: ambiguous use of 'f'
f([])
^
note: found this candidate
func f(_ a: [Int]){ }
     ^
note: found this candidate
func f(_ a: [[Int]]){ }

Хотя это не очень хорошо, его можно легко обойти, если помочь компилятору с такими вызовами, как f([Int]()) или f([[Int]]()).

Однако, становится немного сложнее, если приведенный выше пример немного модифицирован:

func f(_ a: [Int], b: Int = 0){ print("foo") }
func f(_ a: [[Int]]){ print("bar") }
f([])
f([[]])
f([Int]())

Этот пример компилируется без проблем, но печатает (удивительно)

bar
bar
foo

С моей наивной точки зрения я бы ожидал ошибку компиляции или

foo
bar
foo

Примечание о версии: Apple Swift версии 5.0.1 (swiftlang-1001.0.82.4 clang-1001.0.46.5)

...