주의 : 평신도의 조건이 앞서 있습니다.
이 설명은 가장 핵심적인 코드 수준에서 엄격하게 정확하지 않습니다. 그러나 실제로 Swift에서 작업하는 사람이 검토했으며 기본 설명으로 충분하다고 말했습니다.
그래서 저는 "왜"라는 질문에 간단하고 직접적으로 대답 하려고합니다 .
정확히 말하면, 키워드를 수정하지 않고 구조체 매개 변수를 변경할 수있을 때 구조체 함수를 표시해야하는 이유는 mutating
무엇입니까?
따라서 큰 그림은 Swift를 신속하게 유지하는 철학과 많은 관련이 있습니다.
실제 물리적 주소를 관리하는 문제처럼 생각할 수 있습니다. 주소를 변경할 때 현재 주소를 가지고있는 사람이 많은 경우 이사 한 사실을 모든 사람에게 알려야합니다. 그러나 현재 주소가없는 경우 원하는 곳으로 이동할 수 있으며 아무도 알 필요가 없습니다.
이 상황에서 Swift는 우체국과 비슷합니다. 연락처가 많은 사람들이 많이 움직이면 오버 헤드가 정말 높아집니다. 이러한 모든 알림을 처리하려면 많은 직원에게 비용을 지불해야하며 프로세스에는 많은 시간과 노력이 필요합니다. 그렇기 때문에 Swift의 이상적인 상태는 도시의 모든 사람이 가능한 한 적은 연락처를 갖는 것입니다. 그러면 주소 변경을 처리하는 데 큰 직원이 필요하지 않으며 다른 모든 작업을 더 빠르고 효율적으로 수행 할 수 있습니다.
이것이 바로 Swift 사용자들이 모두 값 유형과 참조 유형에 대해 열광하는 이유이기도합니다. 본질적으로 참조 유형은 모든 곳에서 "연락처"를 쌓으며 값 유형은 일반적으로 두 개 이상을 필요로하지 않습니다. 값 유형은 "Swift"-er입니다.
다시 작은 그림으로 돌아갑니다 : structs
. 구조체는 객체가 할 수있는 대부분의 일을 할 수 있기 때문에 Swift에서 큰 문제이지만 값 유형입니다.
에 misterStruct
사는 a 를 상상하여 물리적 주소 비유를 계속합시다 someObjectVille
. 비유는 여기에서 약간 놀랐지 만 여전히 도움이된다고 생각합니다.
따라서에서 변수를 변경하는 모델을 위해 녹색 머리카락이 있고 파란색 머리카락으로 전환하라는 명령을 struct
받았다고 가정 해 보겠습니다 misterStruct
. 제가 말했듯이 비유는 놀랍습니다.하지만 어떤 일이 일어나는 것은 misterStruct
머리카락 을 바꾸는 대신 노인이 나가고 파란 머리를 가진 새로운 사람이 들어오고 새로운 사람이 자신을 부르기 시작한다는 것 misterStruct
입니다. 누구도 주소 변경 알림을받을 필요가 없지만 누군가 그 주소를 보면 파란 머리를 가진 남자를 보게 될 것입니다.
이제 .NET에서 함수를 호출 할 때 어떤 일이 발생하는지 모델링 해 보겠습니다 struct
. 이 경우 같은 misterStruct
주문을받는 것과 같습니다 changeYourHairBlue()
. 그래서 우체국에서는 misterStruct
"머리를 파란색으로 바꾸고 다 끝나면 알려주세요."라는 지시를 내립니다.
그는 이전과 같은 루틴을 다음 있다면, 만약 그 변수가 직접 변경할 때 그가 무슨 짓을하고있어 misterStruct
할 것입니다 것은 자신의 집으로 이사 파란 머리와 함께 새로운 사람과 전화. 하지만 그게 문제입니다.
명령은 "머리를 파란색으로 바꾸고 다 끝나면 알려주세요"였지만 그 명령을받은 것은 녹색 사람입니다. 파란색 사람이 들어온 후에도 "작업 완료"알림을 다시 보내야합니다. 하지만 파란 남자는 그것에 대해 아무것도 모릅니다.
[이 비유를 정말 끔찍하게 생각하기 위해, 기술적으로 초록 머리 남자에게 일어난 일은 그가 이사 한 후 즉시 자살했다는 것입니다. 따라서 그는 작업이 완료되었음을 누구에게도 알릴 수 없습니다 ! ]
이 문제를 피하기 위해, 이와 같은 경우 에만 Swift는 해당 주소의 집으로 직접 가서 현재 거주자의 머리카락을 실제로 변경해야합니다 . 그것은 새로운 사람을 보내는 것과는 완전히 다른 과정입니다.
그래서 Swift는 우리가 mutating
키워드 를 사용하기를 원합니다 !
최종 결과는 구조체를 참조해야하는 모든 항목에서 동일하게 보입니다. 이제 집의 거주자는 파란색 머리카락을가집니다. 그러나 그것을 달성하는 과정은 실제로 완전히 다릅니다. 똑같은 일을하는 것 같지만 아주 다른 일을하고 있습니다. 그것은하는 것하고있어 일반적으로 신속한 구조체는하지 않을입니다.
따라서 빈약 한 컴파일러에게 약간의 도움을주고 함수 가 모든 단일 구조체 함수struct
에 대해 자체적으로 변형 여부를 알아낼 필요가 없도록하기 위해 동정심을 갖고 mutating
키워드를 사용해야합니다 .
본질적으로 Swift가 신속하게 유지 될 수 있도록 우리 모두는 우리의 역할을 수행해야합니다. :)
편집하다:
저를 비추천 한 친구 / 친구 야, 내 대답을 완전히 다시 작성했습니다. 그것이 당신에게 더 잘 어울린다면, 당신은 반대표를 제거 할 것입니까?