iOS swapAt 함수 사용해보기

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


swap

배열에서 서로 값을 바꿔야 하는 상황에 사용

var arr = [9,8,7,6,5,4,3,2,1]
swap(&arr[0], &arr[1])

그런데 이와 같은 방법이 swift4에서 변동사항이 생겼다고 한다.

Overlapping accesses to ‘arr’, but modification requires exclusive access; ….

즉, swift4 이후부터는 컬렉션에 있는것들을 스왑하려고 하면 위와 같은 에러가 발생한다.
그 이유는 스왑이 Law of Exclusivity 를 위반하기 떄문이다.

Law of Exclusivity

변수가 동시에 충돌하는 방식으로 엑세스 하지 못하게 하는 것

If a storage reference expression evaluates to a storage reference that is implemented by a variable, then the formal access duration of that access may not overlap the formal access duration of any other access to the same variable unless both accesses are reads.

스토리지 참조 표현식(storage reference expression)이 변수에 의해 구현되는 스토리지 참조에 대해 평가(evaluates)하는 경우, 해당 접근(access)의 공식 접근 기간이 두개의 접근이 모두 읽히지 않은 한, 동일한 변수에 대한 접근 기간과 겹칠 수 없다.

즉, 접근은 공식적인 전체 접근 시간동안 독점적이어야 한다는 것 이다.

하지만 스왑의 목적은 mutable collection 내에서 두 요소를 교체하는 것이다. 하지만 소유숸 선언의 일부로 제한된 변경사항들에 따르면 이제 이것은 더이상 유효한 것이 아니다. 단일 변수는 동일한 함수에 대해 서로 다른 두개의 인수로 전달될 수 없다.

swapAt

var arr = [1,2,3]
arr.swapAt(1,2)  // [1,3,2]

즉, 요소 자체를 넘겨주지 않고 인덱스를 넘겨준다.