한 호출 안에서 위치 기반 인자와 이름 붙은 인자를 함께 사용할 수도 있다. 코틀린 1.4 이전에는 이름 붙은 인자를 쓰기 시작하면 그 이후의 모든 인자에 이름을 붙여야 했다. 하지만 이 제약은 너무 심하기 때문에 코틀린 1.4부터는 이름 붙은 인자를 중간에 섞어 쓸 수 있다. 다만 이 경우에는 원래 인자가 들어가야 할 위치에 이름 붙은 인자를 지정해야 정상 처리되며, 그렇지 않은 경우 위치 기반 인자의 타입이 어긋나거나 이미 할당된 인자를 재할당하기 때문에 컴파일 오류가 발생한다. 예를 들어 문자열에서 두 문자를 서로 교환하는 함수를 생각해보자(물론 String은 불변 값이기 때문에 원본 문자열의 내용은 바뀌지 않는다).
fun swap(s: String, from: Int, to: Int): String { val chars = s.toCharArray() // 배열로 변환 // 배열 원소 교환하기 val tmp = chars[from] chars[from] = chars[to] chars[to] = tmp return chars.concatToString() // 문자열로 다시 변환 } fun main() { println(swap("Hello", 1, 2)) // Hlelo println(swap("Hello", from = 1, to = 2)) // Hlelo println(swap("Hello", to = 3, from = 0)) // lelHo println(swap("Hello", 1, to = 3)) // Hlleo println(swap(from = 1, s = "Hello", to = 2)) // Hlelo // 위치 기반 인자와 이름 붙은 인자를 혼용한 경우 println(swap(s = "Hello", 1, 2)) // 1.4 이전에는 컴파일 오류. 1.4부터는 정상 println(swap(s = "Hello", 1, to = 2)) // 1.4 이전에는 컴파일 오류. 1.4부터는 정상 println(swap(s = "Hello", 2, from = 1)) // error: an argument is already passed for this parameter // error: no value passed for parameter 'to' println(swap(1, 2, s = "Hello")) // the integer literal does not conform to the expected type String // error: an argument is already passed for this parameter //error: no value passed for parameter 'to' }