2014-10-02 1 views
0

소스의 도메인에서 firstIndex가 슬라이스의 첫 번째 인덱스 여야한다고 생각하여 Swift Slice를 사용했습니다 (다른 유용한 점은 확실하지 않음). 분명히 그렇지 않습니다.스위프트 : 슬라이스 startIndex 항상 0

let ary = map(1...100) { i in i } 

let s:Slice<Int> = ary[10..<20] 
s.startIndex   // 0 
ary[10..<20].startIndex // 0 

(10..<20).startIndex // 10 (half-open interval generated from a range, presumably) 

이것은 버그 같습니까? 항상 0이면 완전히 쓸모없는 것처럼 보입니다. 당신이 (이 문서의 대부분이 순간에 보인다) 자동 생성 스위프트 헤더 파일에 주위 파고 경우

답변

1

것은, 당신이 Slice를 설명 찾을 수 있습니다 : Slice 이후

/// The `Array`-like type that represents a sub-sequence of any 
/// `Array`, `ContiguousArray`, or other `Slice`. 

Array입니다 - 그렇다면 ArraystartIndex은 항상 0이 될 것이므로 을 반환하는 것은 의미가 있습니다. 이 startIndex을 정의하는 경우 또한 아래로, 당신은 또한 볼 수 있습니다 :

/// Always zero, which is the index of the first element when non-empty. 
var startIndex: Int { get } 

을 당신이 Slice의 첫 번째 항목을 찾고 있다면, 바로 사용 s.first :

/// The first element, or `nil` if the array is empty 
var first: T? { get } 

당신이 필요한 경우 Slice 시작, 당신은 같은 것을 할 수있는 원래의 Array에서 인덱스를 찾을 수 :

if let startValue = s.first { 
    let index = find(ary, startValue) 
    /* ... do something with index ... */ 
} 
+0

좋은 답변입니다. 나는 그것이 "얕은 사본"의 더 많은 것이라고 생각했지만 배열에 대한 참조를 유지했다. 당신이 언급 한 접근법을 사용하여 끝났지 만, 선택에 의해서는 끝나지 않았습니다. 나는 아직도 이것이 잘못 생각하고, 정보를 잃고, 아무것도 얻지 못한다고 생각합니다. –

1

T Swift 2에서 고정되어 있습니다. 배열을 2...5 범위로 슬라이스하면 슬라이스의 startIndex는 2가됩니다. 매우 멋지다.