with
является не ключевое слово - это только внешний идентификатор параметра. Это работает так:
func toDebugString<T>(whatever x: T) -> String
Поскольку функция toDebugString<T>(x: T)
уже определена, используя внешний параметр, который вы создаете перегрузки: такое же имя функции, но различные параметры. В этом случае параметр один и тот же, но идентифицируется с внешним именем и в swift, что делает его методом с другой сигнатурой, а значит и перегрузкой.
Чтобы доказать, что, вставьте в детскую площадку:
func toDebugString<T>(# x: T) -> String {
return "overload"
}
toDebugString(x: "t") // Prints "overload"
toDebugString("t") // Prints "t"
Первый называет свой перегруженный реализации, в то время как второй использует существующую функцию
Рекомендуемая литература: Function Parameter Names