들어가기 전에
글을 쓰게 된 이유
코딩테스트를 문제 하나를 풀고 있던 중, Swift 언어로 간단하게 배열의 두 요소를 바꾸고 싶은데 마음대로 되지 않았다. 내가 알던 swap의 알고리즘을 Swift에 적용해 보기도 했고, swapAt이라는 자체 인스턴스 메서드를 활용하여 요소를 바꿀 수 있는 걸 우여곡절 알게 되어서 이를 정리하기 위해 글을 쓰게 되었다.
C의 swap 구현
C 언어의 swap 구현
내가 C언어에서 알고 있는 방식의 swap 알고리즘이다. 이를 Swift에 적용해 보고 싶었다.참고로 코드블럭 언어가 cpp로 적혀 있는 건 티스토리의 코드블럭에서 C가 없어서 그렇다.
#include <stdio.h>
void swap(int* a, int* b);
int main(void)
{
int a = 1;
int b = 2;
printf("before swap: %d %d\n", a, b); // before swap: 1 2
swap(&a, &b);
printf("after swap: %d %d\n", a, b); // after swap: 2 1
}
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Swift의 swap 구현
변수의 swap 구현
어렴풋이 알고 있는 inout을 이용해서 구현해 보았다.
아래와 같이 일반적인 변수에는 잘 적용이 되었다.
func swap(_ a: inout Int, _ b: inout Int) -> Void {
var temp: Int
temp = a
a = b
b = temp
}
var m = 3
var n = 7
swap(&m, &n)
print(m) // 7
print(n) // 3
2차원 배열에서의 swap은 실패
이번에는 이차원 배열의 순서를 바꾸고 싶었는데 에러를 계속해서 냈다.
위처럼 inout을 시도했으나 Swift 문법을 inout 깊게 알지는 못하여 엄청 헤맸다…
var input = [[60, 50], [30, 70]]
swap(&input[i][0], &input[i][1])
print(input[i][0])
print(input[i][1])
/*
error: inout writeback through subscript occurs in multiple arguments to call, introducing invalid aliasing
swap(&input[i][0], &input[i][1])
^~~~~~~~~~~~
passing value of type 'Int' to an inout parameter requires explicit '&'
*/
swapAt 인스턴스 메서드
공식 문서 내용
애플 개발자 공식 문서에서 swapAt 인스턴스 메서드를 찾기는 했지만 위에서 멘붕(!)이 와서 주의 깊게 읽지 못했다.
처음 swapAt을 시도한 코드 (실패)
swap 함수에만 집중 하다 보니 곧 바로 요소를 넣어 버렸다.
swapAt(input[i][0], input[i][1]) // cannot find 'swapAt' in scope
두 번째 swapAt을 시도한 코드 - 1차원 배열 인덱스 접근
배열에 온점(.)으로 접근하여 메서드를 넣고 인수(argument)로 인덱스를 넣었지만 1차원에서만 변경이 되었다. 내가 원하는 건 2차원 배열에서의 요소의 위치를 바꾸는 거였다.
var input = [[60, 50], [30, 70]]
input.swapAt(0, 1) // [[30, 70], [60, 50]]
두 번째 swapAt을 시도한 코드 - 2차원 배열 인덱스 접근
이제 드디어 접근을 할 수 있었다.
var input = [[60, 50], [30, 70]]
input[0].swapAt(0, 1) // [[50, 60], [30, 70]]
참고 자료
'iOS > 애플 개발자 공식 문서' 카테고리의 다른 글
[Swift] print 함수로 주어진 여러 아이템을 String 타입으로 표준 출력하기 (0) | 2023.05.03 |
---|---|
[Swift] "~= " 연산자 함수로 패턴 매칭 확인하기 (0) | 2023.04.26 |
[Swift] reversed로 컬렉션 타입의 순서를 뒤집는 뷰 반환하기 (0) | 2023.04.07 |
[Swift] enumerated()로 인덱스와 요소를 모두 반환하기 (0) | 2023.03.28 |
[Swift] stride()로 숫자를 단계적으로 다루기 (0) | 2023.03.18 |
댓글