Swift의 inout 키워드는 함수가 전달된 매개변수의 값을 직접(참조에 따라) 변경할 수 있게 해 주며, 복사본으로 작업하는 것이 아닙니다. 이는 다른 언어에서의 참조에 의한 전송(pass-by-reference)과 유사합니다.
예:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // 이제 x == 11
var)에 대해서만 작동하며, let을 전달할 수 없습니다.질문: 구조체의 속성을 inout 매개변수가 있는 함수에 전달할 수 있습니까? 구조체가 다른 객체의 일부로 사용되더라도요?
답변: 아니요, Swift는 하나의 지침 내에서 동일한 속성에 대한 동시 접근을 금지하며(Exclusive Access to Memory), 이는 경쟁 조건과 불확실한 동작을 방지하기 위한 것입니다. 예:
struct Point { var x: Int var y: Int } var p = Point(x: 1, y: 2) increment(&p.x) // 괜찮음 increment(&p.y) // 괜찮음 // increment(&p.x, &p.x) // 오류 발생
이야기
한 프로젝트에서 개발자는 동일한 변수를 inout 수정자와 함께 두 개의 매개변수에 동시에 전달하려 했고, 이는 컴파일 오류로 이어졌습니다. 이는 함수의 아키텍처를 재검토하게 만들었고, 변경을 두 단계로 나누어야 했습니다.
이야기
구현자는 루프 내에서 inout 매개변수를 통해 배열을 변경했으며, 이는 예상치 못한 결과를 초래했습니다. Swift는 전달할 때 내용을 복사하며, 변경 사항이 루프 간에 동기화되지 않았기 때문입니다.
이야기
개발자는 inout 매개변수가 항상 "참조에 따라" 작동할 것이라고 예상했지만, 클래스와 구조체 작업 시 copy-in/copy-out 구문에 직면하여, 구조체의 중첩 객체가 변경될 때 모든 변경 사항이 저장되지 않는 문제에 부딪혔습니다.