Следующий пример иллюстрирует проблему:
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)