2017-04-24 15 views
3
var absences = [0, 2, 0, 4, 0, 3, 1, 0] 
let midpoint = absences.count/2 

var firstHalf = absences.prefix(upTo: midpoint) 
let secondHalf = absences.suffix(from: midpoint) 

견적 :ArraySlice를 변경하면 새로운 배열 인스턴스가 인스턴스화됩니까? 애플

는 어느 쪽도 아니 firstHalf도들의 하반기 조각은 자신의 새로운 스토리지를 할당하지 않습니다. 대신, 각각은 결석 배열의 저장에 대한 견해를 제시합니다.

는 I는 다음과 같은 firstHalf 돌연변이하려고하면 firstHalf 변경

firstHalf[1] = 19 

값이지만 원래 배열 absences는 그대로을 따라서 을 (absences[1] 2로 동일하면서 firstHalf[1] 19와 같다) 백그라운드에서 무슨 일이 일어나는가. 배열 슬라이스를 변경하여 새 배열을 인스턴스화 했습니까? 미리 감사드립니다.

+2

그것은 가능성이 당신이 그것을 돌연변이 시도 할 때까지 컬렉션을 복사하지 않습니다 스위프트 컬렉션에 의해 내부적으로 사용되는 일반적인 쓰기시 복사 행동입니다 . copy-on-write에 대한 설명은 WWDC 2015 비디오 [값 유형이있는 더 나은 앱 만들기] (https://developer.apple.com/videos/play/wwdc2015/414/)를 참조하십시오. – Rob

+0

그건 내 머리에도 터 졌어. 나는 그것에 대해 확신하고 싶다. 빠른 응답을 보내 주셔서 감사합니다. – Pink

답변

4

예, ArrayArraySlice을 포함한 표준 라이브러리의 컬렉션 유형에는 모두 기록시 복사 동작이 있습니다. 즉, 변형 될 때까지 다른 요소와 함께 해당 요소를 저장할 수 있습니다.이 경우 해당 요소는 자신의 복사본을 가져옵니다. 귀하의 경우

슬라이스 firstHalf 비 고유 참조에 대한 뷰 (absences & secondHalf 모두로 또한 도면에있는)이 기본 배열 버퍼. 따라서 firstHalf으로 변경할 때 복사가 시작됩니다. 새 블록 버퍼의 요소가 포함되어 있습니다 (단 전체 배열 인 경우 배열 일 필요는 없습니다).

firstHalf 지금 이전 배열 버퍼에 대한 뷰를 공유 absences & secondHalf 모두이 새로운 버퍼 위에 독특한 전망을 가지고 있습니다. 따라서 firstHalf은 원래 배열의 요소에 영향을 미치지 않고 버퍼의 요소를 변경하여 값 의미를 보존 할 수 있습니다.

+0

그런데 @Rob이 지적한 것처럼. 큰! – Pink

3

Swift 컬렉션에서 장면 뒤에서 사용되는 표준 copy-on-write 비헤이비어입니다.이 컬렉션에서는 변경하려고 시도 할 때까지 컬렉션을 복사하지 않습니다. 복사시 복사에 대한 설명은 WWDC 2015 비디오 Building Better Apps with Value Types in Swift을 참조하십시오.

발언은 우리를 위해이 문제를 명확히 in the code :

/// Slices Share Indices 
/// -------------------- 
/// 
/// A collection and its slices share the same indices. An element of a 
/// collection is located under the same index in a slice as in the base 
/// collection, as long as neither the collection nor the slice has been 
/// mutated since the slice was created. 

... 

/// Slices Inherit Collection Semantics 
/// ----------------------------------- 
/// 
/// A slice inherits the value or reference semantics of its base collection. 
/// That is, when working with a slice of a mutable 
/// collection that has value semantics, such as an array, mutating the 
/// original collection triggers a copy of that collection, and does not 
/// affect the contents of the slice. 
+0

완벽한! 고맙습니다. 나는 Harnish의 대답을 이미 받아 들였지만 ^^ – Pink

+0

@Pink도 당신의 대답을 바꿀 것을 요청할 것입니다. 이전 메모에 대한 지원 문서 만 제공했습니다. – Rob

+0

아무 문제 없어. 건배! – Pink