2016-08-17 12 views
6

스위프트의 문자열 유형은 값 유형입니다. 새 String 값을 만드는 경우 해당 String 값은 함수 나 메서드에 전달 될 때 또는 상수 또는 변수에 할당 될 때 복사됩니다.값 형식화 된 변수를 함수에 전달할 때이 변수를 복사하는 방법은 무엇입니까?

상수 또는 변수에 할당되면 복사됩니다. 나에게 의미가 있습니다. 그러나 값 유형화 된 변수가 함수에 전달되면 복사되기 때문에 혼란 스럽습니다. 함수에 변수를 입력 한 값을 전달할 때

질문

그것은 복사됩니다 어떻게? 어떤 종류의 "공간"이이 사본을 가지고 있습니까? 장면의 뒤에서 보이지 않게 만들어지는 일종의 일시적인 변수입니까? 그리고 그것이 기능을하는 과정이 끝나면 파기됩니까?

덕분 스위프트의

답변

2

값 유형을 함수에 전달할 때 해당 값이 함수에 해당하는 지역 변수에 값 유형을 할당하는 것과 같으므로 복사 동작은 새로운 로컬 변수를 할당하는 것과 유사합니다.

복사 위치와 관련하여 복사 동작이 실제로 소리보다 복잡하다는 것을 인식해야합니다. 그들이 Building Better Apps with Value Types in Swift (WWDC 2015, Session 414)의 지적대로, "복사 저렴한있다"낮은 수준의 복사

, 기본적인 형태는 일정 시간

  • Int, Double

복사 A는 값 유형의 struct, enum 또는 tuple은 일정 시간입니다.

  • ,등

확장 가능한 데이터 구조

  • 복사는 참조 카운팅 동작

  • String, Array, Set, Dictionary 등의 고정 된 개수를 포함 쓰기 복사 기능을 사용 중 .스위프트가 확장 값 유형에게 그들이 참조하고 때마다 복사 방지 손의 약간의 속임수를하지 않고, 단지 원래의 참조를 가리키는하지만 얼마나 많은을 추적 장면 뒤에 마지막 점에 관해서는

, 거기에는 참고 문헌이 있으며 실제로는 사본을 (a) 쓰기 만합니다. (b) 둘 이상의 참조가 있습니다. 이 문제는 that video에 자세히 설명되어 있습니다.

+0

도움과 동영상 링크를 제공해 주셔서 감사합니다. – SLN

3

값 유형은 몇 가지 사소한 세부 사항이 중복 얻을 대부분의 경우는, 대부분의 데이터가 그대로 유지하지만에 복사됩니다. String 값의 예를 들어보세요. 값을 함수에 전달할 때 chars 버퍼의 실제 포인터 또는 길이와 같은 일부 정보가 복사되지만 실제 데이터는 전달됩니다. 즉, Swift에서 값을 전달하는 것은 빠른 작업입니다.

스위프트는 쓰기가 필요함을 감지하면 실제 데이터를 복제합니다. 예를 들어 배열이 let에서 var으로 전달 된 경우 주요 복사본이 만들어지지 않습니다. 그러나 새 요소를 추가하여 새 배열을 업데이트하면 그 시점에서 배열 내용의 복제본이 만들어지고 새 요소가 추가됩니다.

+0

도와 주셔서 감사합니다. – SLN